【实战精选】车牌限行检测识别系统(源码&部署文档)

发布时间:2023年12月19日

1.研究背景与意义

项目参考AAAI Association for the Advancement of Artificial Intelligence

研究背景与意义

近年来,随着城市交通拥堵问题的日益严重,各地纷纷推出了车牌限行政策,以减少道路交通压力和改善空气质量。然而,车牌限行政策的有效执行需要大量的人力和物力投入,而且容易出现人为错误和漏检的情况。因此,开发一种高效、准确的车牌限行检测识别系统对于提高限行政策的执行效果具有重要意义。

车牌限行检测识别系统是一种基于计算机视觉和模式识别技术的智能交通系统,可以自动识别车辆的车牌信息,并根据限行政策进行判断和处理。该系统主要包括车牌检测、字符分割、字符识别和限行判断等功能模块。通过对车辆进行实时监测和识别,系统可以快速准确地判断车辆是否符合限行政策,并及时采取相应的措施,如发送警示信息或自动扣罚。

该系统的研究意义主要体现在以下几个方面:

  1. 提高限行政策的执行效果:传统的限行检测方式主要依靠人工巡查和手动录入车牌信息,容易出现人为错误和漏检的情况。而车牌限行检测识别系统可以实现自动化的车牌识别和限行判断,大大提高了限行政策的执行效果和准确性。

  2. 减少人力和物力投入:传统的限行检测方式需要大量的人力和物力投入,而且效率低下。而车牌限行检测识别系统可以实现自动化的车牌识别和限行判断,大大减少了人力和物力的投入,提高了工作效率。

  3. 提高交通管理的科学化水平:车牌限行检测识别系统可以实时监测和识别车辆的车牌信息,可以为交通管理部门提供大量的数据支持,如车辆通行情况、违规情况等,从而提高交通管理的科学化水平,为交通管理决策提供科学依据。

  4. 促进智能交通系统的发展:车牌限行检测识别系统是智能交通系统的重要组成部分,其研究和应用可以促进智能交通系统的发展。通过不断优化和改进系统的算法和技术,可以提高系统的准确性和稳定性,为智能交通系统的发展提供技术支持。

综上所述,车牌限行检测识别系统是一种具有重要意义的智能交通系统,可以提高限行政策的执行效果,减少人力和物力投入,提高交通管理的科学化水平,促进智能交通系统的发展。随着城市交通拥堵问题的日益严重,该系统的研究和应用具有重要的现实意义和应用前景。

2.图片演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.视频演示

车牌限行检测识别系统(源码&部署文档)_哔哩哔哩_bilibili

4.我国汽车车牌字符的特点

车牌字符的笔画结构比手写体字符更规范,字符间距比手写体字符间距更固定,分割起来相对容易一些。
根据我国最新的机动车号牌标准《中华人民共和国机动车号牌》(GA36-2007)可知在我国境内行驶的每一-辆合法的机动车都具有唯一的机动车号牌号码:机动车登记编号。我们所研究的车牌自动识别实际上是指识别出机动车的机动车登记编号。
GA36-2007对机动车号牌的外廓尺寸和适用范围做出了明确规定,根据该标准可知我国常见小型汽车号牌式样如图所示。
在这里插入图片描述
由图可知常见小型汽车号牌是由7个字符组成的单行字符序列,车牌字符的排列格式为:X,X,●x,X,Xx,X,,其中“X”是汉字字符,省、自治区、直辖市简称,“x,”是一个大写英文字母,为发牌机关代号,“·”是间隔符,后面5个字符是序号,由大写英文字母或阿拉伯数字组成。
经过对图3-1 的细致分析我们可以发现常见小型汽车号牌中字符尺寸为45mmx90mm,即单个字符宽度为45 mm,高度为90 mm,字符间隙与字符宽度之比为12:45即4:15。
根据以上对我国常见小型汽车号牌字符特点的分析,本文选择垂直投影进行字符分割。

5.核心代码讲解

5.1 demo.py


class CarNumberRecognition:
    def __init__(self):
        self.model = pr.LPR("model/cascade.xml", "model/model12.h5", "model/ocr_plate_all_gru.h5")
        self.fontC = ImageFont.truetype("./Font/platech.ttf", 14, 0)

    def speed_test(self, image_path):
        grr = cv2.imread(image_path)
        self.model.SimpleRecognizePlateByE2E(grr)
        t0 = time.time()
        for x in range(20):
            self.model.SimpleRecognizePlateByE2E(grr)
        t = (time.time() - t0) / 20.0
        print("Image size :" + str(grr.shape[1]) + "x" + str(grr.shape[0]) + " need " + str(round(t * 1000, 2)) + "ms")

    def draw_rect_box(self, image, rect, add_text):
        cv2.rectangle(image, (int(rect[0]), int(rect[1])), (int(rect[0] + rect[2]), int(rect[1] + rect[3])), (0, 0, 255), 2, cv2.LINE_AA)
        cv2.rectangle(image, (int(rect[0] - 1), int(rect[1]) - 16), (int(rect[0] + 115), int(rect[1])), (0, 0, 255), -1, cv2.LINE_AA)
        img = Image.fromarray(image)
        draw = ImageDraw.Draw(img)
        draw.text((int(rect[0] + 1), int(rect[1] - 16)), add_text, (255, 255, 255), font=self.fontC)
        imagex = np.array(img)
        return imagex

    def carnum_rec(self, grr):
        for pstr, confidence, rect in self.model.SimpleRecognizePlateByE2E(grr):
            if confidence > 0.7:
                image = self.draw_rect_box(grr, rect, pstr + " " + str(round(confidence, 3)))
                print("plate_str:")
                print(pstr)
                print("plate_confidence")
                print(confidence)
                cv2.imshow("enhanced", image)

    def video_capture(self):
        capture = cv2.VideoCapture("src/carnum.avi")
        i = 1
        while (True):
            ref, frame = capture.read()
            if ref:
                cv2.imshow("enhanced", frame)
                i = i + 1
                if i % 10 == 0:
                    i = 0
                    self.carnum_rec(frame)
                c = cv2.waitKey(30) & 0xff
                if c == 27:
                    capture.release()
                    break
            else:
                break


这个程序文件名为demo.py,主要功能是通过摄像头实时识别车牌号码。程序首先导入了一些必要的库,然后定义了一个SpeedTest函数,用于测试识别车牌号码的速度。接下来定义了一个drawRectBox函数,用于在图像上绘制车牌框和车牌号码。然后定义了一个carnum_rec函数,用于识别车牌号码并调用drawRectBox函数绘制车牌框和车牌号码。最后定义了一个video_capture函数,用于实时捕获摄像头图像并调用carnum_rec函数进行车牌识别。在程序的最后,通过调用video_capture函数实现了实时车牌识别的功能。

5.2 hyper_test.py


class CarNumberRecognition:
    def __init__(self, video_path):
        self.video_path = video_path

    def process_frame(self, frame):
        result = HyperLPR_plate_recognition(frame)
        for i in result:
            p1, p2 = (i[2][0], i[2][1]), (i[2][2], i[2][3])
            cv2.rectangle(frame, p1, p2, [0, 0, 255], thickness=3, lineType=cv2.LINE_AA)
            cv2.putText(frame, str(i[0]), (i[2][0], i[2][1] - 10),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
        cv2.imshow('result', frame)
        cv2.waitKey(1)

    def process_video(self):
        capture = cv.VideoCapture(self.video_path)
        j = 1
        while True:
            ref, frame = capture.read()
            if ref:
                j = j + 1
                if j % 5 == 0:
                    j = 0
                    self.process_frame(frame)
                c = cv.waitKey(5) & 0xff
                if c == 27:
                    capture.release()
                    break
            else:
                break

    def process_image(self, image_path):
        image = cv.imread(image_path)
        result = HyperLPR_plate_recognition(image)
        print(result)

if __name__ == '__main__':
    car_number_recognition = CarNumberRecognition("car.mp4")
    car_number_recognition.process_video()
    cv.destroyAllWindows()

这个程序文件名为hyper_test.py,主要功能是使用OpenCV和hyperlpr包进行车牌识别。程序首先导入了所需的包和库,然后定义了两个函数:video_demo()和carnum_rec()。

video_demo()函数使用cv.VideoCapture()打开一个视频文件(car.mp4),然后通过循环读取视频的每一帧。在每一帧中,程序使用hyperlpr包的HyperLPR_plate_recognition()函数对图像进行车牌识别,并将识别结果打印出来。同时,程序还在图像上绘制了识别出的车牌的矩形框和车牌号码,并显示出来。程序还监听键盘输入,如果按下了Esc键,则停止识别并退出程序。

carnum_rec()函数读取一张图片(car33.jpg),然后使用HyperLPR_plate_recognition()函数对图像进行车牌识别,并将识别结果打印出来。

最后,在主程序中调用了video_demo()函数,并关闭了所有显示的窗口。

5.3 ui.py


class PlateDetection:
    def __init__(self, info1):
        self.info1 = info1
        self.stop_detection_flag = [False]

    def draw_box_string(self, img, box, string):
        x, y, x1, y1 = box
        img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        img = Image.fromarray(img)
        draw = ImageDraw.Draw(img)
        font = ImageFont.truetype("simhei.ttf", 60, encoding="utf-8")
        draw.text((x, y - 50), string, (0, 255, 0), font=font)
        img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
        return img

    def is_plate_restricted(self, plate):
        local_province = "浙"
        restricted_days = [0, 1, 2, 3, 4]
        current_day = time.localtime().tm_wday

        if current_day not in restricted_days:
            return False

        if plate[0] != local_province:
            return True

        last_digit = ''
        for c in plate[::-1]:
            if c.isdigit():
                last_digit = c
                break

        if int(last_digit) == 5:
            return False
        else:
            return True

    def detect_plate(self):
        capture = cv2.VideoCapture(0)
        while not self.stop_detection_flag[0]:
            _, image = capture.read()
            if image is None:
                break
            try:
                result = HyperLPR_plate_recognition(image)
                for i in result:
                    p1, p2 = (i[2][0], i[2][1]), (i[2][2], i[2][3])
                    cv2.rectangle(image, p1, p2, [0, 0, 255], thickness=3, lineType=cv2.LINE_AA)
                    image = self.draw_box_string(image, [i[2][0], i[2][1] - 10, i[2][2], i[2][3]], str(i[0]))
                    print(str(time.strftime('%Y.%m.%d %H:%M:%S ', time.localtime(time.time()))) + '检测车牌:' + str(i[0]))

                    restricted = self.is_plate_restricted(str(i[0]))
                    if restricted:
                        print("车牌限行")
                    else:
                        print("车牌不限行")
            except:
                pass

            cv2.imshow("Plate Detection", image)
            cv2.waitKey(1)
        capture.release()
        cv2.destroyAllWindows()


这个程序文件是一个使用PyQt5和OpenCV实现的车牌限行检测系统。主要功能包括实时检测摄像头中的车牌、绘制车牌框和车牌号码、判断车牌是否限行,并在界面上显示检测结果。

程序中的主要函数包括:

  • draw_box_string(img, box, string): 绘制车牌框和车牌号码的函数。
  • is_plate_restricted(plate): 判断车牌是否限行的函数。
  • det(info1, stop_detection_flag): 车牌检测函数,通过调用Hyperlpr_plate_recognition函数实现车牌识别,并根据识别结果绘制车牌框和车牌号码,判断车牌是否限行,并在界面上显示检测结果。
  • Thread_1: 继承自QThread的线程类,用于在后台运行车牌检测函数。
  • Ui_MainWindow: 主窗口类,定义了界面的布局和各个控件的事件处理函数。

程序的入口函数是if __name__ == "__main__":,在这个函数中创建了一个QApplication对象和一个QMainWindow对象,并将Ui_MainWindow对象设置为主窗口的UI。然后显示主窗口,并启动应用程序的事件循环。

整个程序的流程是:用户点击“开启检测”按钮后,会创建一个线程对象并启动线程,在线程中调用det函数进行车牌检测。检测到车牌后,会根据车牌号码判断是否限行,并在界面上显示检测结果。用户可以点击“关闭检测”按钮停止检测,点击“退出系统”按钮退出程序。

6.系统整体结构

整体功能和构架概述:
该车牌限行检测识别系统的整体功能是实时检测摄像头中的车牌号码,并判断车牌是否限行。系统使用OpenCV和Hyperlpr包进行车牌识别,通过绘制车牌框和车牌号码、判断车牌是否限行,并在界面上显示检测结果。

下表是每个文件的功能概述:

文件名功能概述
demo.py实现通过摄像头实时识别车牌号码的功能,包括定义识别速度测试函数、绘制车牌框和车牌号码的函数、车牌识别函数以及实时捕获摄像头图像并进行车牌识别的函数。
HyperLPRLite.py提供了Hyperlpr包的接口,包括车牌识别函数HyperLPR_plate_recognition()。
hyper_test.py使用OpenCV和Hyperlpr包进行车牌识别的功能,包括定义视频演示函数和车牌识别函数,通过读取视频文件进行车牌识别,并在图像上绘制车牌框和车牌号码。
ui.py使用PyQt5和OpenCV实现的车牌限行检测系统的界面功能,包括绘制车牌框和车牌号码的函数、判断车牌是否限行的函数、车牌检测函数、线程类以及主窗口类。实现了界面布局、控件事件处理等功能。

7.基于垂直投影特征的字符分割

在经过水平校正、垂直校正处理后,现阶段的车牌图像已被校正到水平位置,去除了车牌边框和铆钉的干扰,字符清晰可见,并被统一成黑底白字,基本满足了字符分割的需要。
通过对垂直校正处理步骤得到的车牌图像进行研究发现车牌区域的汉字字符笔画较多,结构比较复杂,笔画走向不固定,汉字垂直投影一般大于其他字符垂直投影,同时车牌中字符“I”、“1”的垂直投影宽度较–般字符的垂直投影宽度窄一些,故本文利用垂直投影法进行字符分割。
与其他垂直投影字符分割算法不同的是对于汉字和字符“I”、“1”的处理,其他垂直投影字符分割算法120][22]-~般都是利用车牌垂直投影的峰谷分布特点:字符区域投影值大于0,字符间隙投影接近或等于0,设置一个统一的字符投影阈值,从而将字符分割出来。本文字符分割将字符分为汉字字符和非汉字字符两类,分别设置不同的垂直投影阈值进而确定字符的左右分割边界;同时在确定车牌后6个字符的左右分割边界的过程中,充分利用字符“I”、“1”宽度较一般车牌字符宽度窄一些的特点,将这6个字符根据字符“I”、“1”与非“I”、“1”字符两种情况分别确定字符左右分割边界;在确定汉字字符边界的过程中利用后六个字符的平均字符宽度作为汉字字符宽度,以提高汉字字符的分割正确率。
本文中的字符分割流程如图3-2所示,其基本思想是首先按照由左至右的顺序扫描车牌定位后的车牌图像并记录车牌定位后车牌图像中每一列白色像素总数作为该列的垂直投影Vert[x],x为定位后车牌图像的列号。根据车牌的垂直投影特征:理想情况下字符间隙垂直投影为0,考虑到实际情况中残余噪声干扰的影响,设置一个大于0的垂直投影阈值T,利用该阈值扫描车牌图像从而得到车牌非汉字字符的候选左右分割边界。然后,利用车牌字符“I”、“1”宽度较一般车牌字符宽度窄一些的特点定位出车牌后6个非汉字字符的左右分割边界位置。紧接着,设置一个略小于T的汉字垂直投影阈值T,可以有效地增加汉字的分割准确性,利用该垂直投影阈值从车牌中第二个字符的左分割边界向左扫描车牌定位后的车牌图像将满足汉字右分割边界阈值条件的列确定为汉字的右分割边界位置,为了提高汉字字符左分割边界位置的定位精度,将车牌后六个非汉字字符的平均字符宽度作为汉字的字符宽度,进而确定汉字的左分割边界。最后,将垂直校正后的车牌上下边界作为所有字符的上下边界,从而可以准确的分割出车牌中的所有字符,同时为了后续字符识别的准确高效,本字符分割方法对已分割出的字符图像接着进行了字符归一-化操作将已分割出的所有7个字符统一处理成相同尺寸大小。
在这里插入图片描述

8.确定非汉字字符候选左右分割边界

由于非汉字字符垂直投影分布具有与汉字字符垂直投影不同的特点,本步骤处理流程如图3-3所示,设置一个非汉字字符垂直投影阈值T(本文中经大量实验,将T取为车牌字符预设宽度preWidCh 的1/4,preWidCh取为40),从车牌宽度的左1/10处开始向右扫描,当碰到Vert[x]从小于T增大至大于T或从大于Ti减小至小于T的候选左右分割边界条件成立时,则此时扫描所在列可能为字符的左右分割边界位置,也可能为大块干扰噪声区域的边界位置,将此时扫描列的列号x记录到非汉字字符候选左右分割边界数组 tempSeg[i]中,i的取值范围为[0,25],否则继续向右扫描图像并进行候选左右分割边界条件判断,直至扫描到车牌定位图像的右边界位置时,停止图像扫描。
在这里插入图片描述

9.确定汉字字符的左右分割边界

由于汉字字符笔画较多,结构比较复杂,笔画走向不固定,汉字垂直投影一般大于其他字符垂直投影,汉字右边界处的垂直投影一般比非汉字字符的垂直投影略小一些,故设置一个略小于T的T2为汉字的垂直投影阈值。从车牌图像中第2个字符的左分割边界处向左扫描,当遇到汉字右分割边界判断条件成立时,即垂直投影Vert[x]从小于T变为大于等于T,则记录此时的x为汉字字符的右分割边界character[1];若遇到扫描列为第一列的扫描结束条件,就结束字符分割操作。否则,紧接着对数组character[J,从数组第3个元素开始按数组下标charNum增大的方向扫描数组元素character[charNum],计算车牌后6个字符的平均字符宽度wideChar,并将其作为汉字字符的字符宽度,然后结合前面已确定的汉字字符的右分割边界character[1],令character[1]减去wideChar,若二者之差小于0,则把0赋值给character[0],否则把二者之差赋值给character[0]作为汉字字符的左分割边界。
由于第二章车牌定位中已去除了车牌边框和铆钉并进行了水平校正和垂直校正,理想情况下车牌定位后的车牌区域已处于水平位置,此时车牌的上下边界位置就是字符的上下边界位置,故本文将其作为所有字符的上下分割边界位置。至此车牌中所有字符的左右分割边界、上下分割边界已确定完毕,根据已得到的字符边界位置从车牌定位图像中截取各个字符图像。
对图中的车牌图像进行字符分割,字符归一化前的最后操作效果如图所示。
在这里插入图片描述

10.建立字符特征库

在车牌样本字符集中,有汉字、大写英文字母和阿拉伯数字共三大类字符。由于汉字只出现在车牌首字符位置,结构复杂,且与大写英文字母、阿拉伯数字的区别较大,故将车牌字符分为两类,建立两类字符特征库,一种是汉字特征库,另一种是数字字母特征库。建立字符特征库,就是对样本字符集中的字符,分别计算出各字符的特征向量。其中每个字符的特征向量计算方法都一样,本文中以建立大写英文字母“A”的特征向量为例来说明字符特征库是如何建立的。
根据GA36-2007标准,我国车牌字符宽高比为1:2,在设计模板时也尽量遵循这一原则。经大量实验,本文最终将字符匹配模板尺寸大小设定为20x40,即宽度为20个像素,高度为40个像素。
在摄像机对车辆进行拍照时,实际情况往往复杂多变,车牌倾斜、车牌污损、光照强度的变化,这些影响因素会带来不同程度的噪声干扰。由于噪声干扰的存在,即使在车牌定位、字符分割阶段,采取一些噪声处理步骤,减少了噪声所造成的不利影响,字符分割后同一字符的多个图像也不可能完全相同,仍会存在一定程度的差异,而这些差异的存在使准确的进行字符特征提取变得非常困难。
如果简单地将某张字符图像特征向量用作该字符的特征向量,则最终选取的字符特征向量无法有效的反映该字符本质特点,很可能导致本应属于同一字符的多张字符图像特征向量差别较大,最终识别为不同字符的错误情况发生,如本应属于字符“A”的多张图像被误识别为其他字符。
为了降低应用场景对字符识别正确率的不利影响,避免该类错误情况的发生,本文对车牌字符集中的所有字符均选取同一字符的10张分割自不同拍摄环境的字符图像作为该字符的样本图像。
基于以上的详细分析,本文建立字符特征库某一字符特征向量的主要步骤如下:首先选取10张分割自不同拍摄场景的该字符的样本图像,然后分别对每张样本图像进行特征提取,得到10个样本图像特征向量。
在这里插入图片描述

11.基于字符特征匹配的字符识别

对于待识别字符图像,按照4.2节所述字符特征提取的方法提取出该字符图像的特征向量x,然后通过与4.3节中建立的字符特征库中各字符特征向量X:(X),X, X3;…",Xzs)比较,分别计算出x与各字符特征向量的加权距离,将加权距离最小时对应的字符作为最终字符识别的结果。
由于汉字与英文字母、数字相比,结构更复杂,笔画走向不固定,为提高字符识别正确率,本文对特征向量之间距离的度量分汉字、数字字母两种情况分别定义了不同的公式,同时在识别时分别与不同字符特征库中各字符特征向量进行比较。
在这里插入图片描述

其中,x为待识别汉字字符图像特征向量x的第j个分量,xx为汉字特征库中字符特征向量x的第j个分量。
字符特征向量中代表网格特征的有16个分量,而代表水平方向特征和垂直方向特征的分量较少,仅有6个。为了有效的反应各字符特征分量所发挥的作用效果,减小噪声的影响,公式(4-1)中对于代表字符图像白色像素个数和网格特征的前17个分量,取每个分量的绝对值之差,而代表水平方向特征和垂直方向特征的字符特征向量第18至23个分量,计算其各分量绝对值之差再乘以一个加权系数9,最后进行累加得到汉字字符图像特征向量的加权距离s1k。

数字和字母特征向量距离度量

待识别数字和字母的特征向量x=(,x,…,xs)与数字字母特征库中第k个字符特征向量x-(x3.…r)的加权距离sx定义如公式所示。
在这里插入图片描述

其中,x,为待识别数字或字母字符图像特征向量x的第j个分量,为数字字母特征库中字符特征向量x的第j个分量。考虑到数字字母的笔画比汉字简单,公式不同的是对于反映字符笔画特点的水平方向特征分量和垂直方向特征分量,赋予一个较小的加权系数7,最后进行累加得到数字字母图像特征向量的加权距离S2k。
在这里插入图片描述

12.系统整合

下图完整源码&环境部署视频教程&自定义UI界面

在这里插入图片描述

参考博客《车牌限行检测识别系统(源码&部署文档)》

13.参考文献


[1]谭同德,王三刚.基于OpenCV的车牌定位方法[J].计算机工程与设计.2013,(8).DOI:10.3969/j.issn.1000-7024.2013.08.034 .

[2]朱梦哲,陈志华,赵钟,等.基于OpenCV的车牌定位和校正方法[J].计算机应用.2013,(z1).

[3]甘玲,孙博.基于分块投影和形态学处理的多车牌定位方法[J].计算机应用研究.2012,(7).DOI:10.3969/j.issn.1001-3695.2012.07.090 .

[4]甘玲,林小晶.基于连通域提取的车牌字符分割算法[J].计算机仿真.2011,(4).DOI:10.3969/j.issn.1006-9348.2011.04.083 .

[5]王涛,全书海.基于改进Sobel算子的车牌定位方法[J].微计算机信息.2008,(13).DOI:10.3969/j.issn.1008-0570.2008.13.127 .

[6]赵晓霞.基于支持向量机的车牌定位方法[J].现代电子技术.2008,(9).DOI:10.3969/j.issn.1004-373X.2008.09.062 .

[7]王枚,房培玉,王国宏.基于彩色分量垂直边缘检测的车牌定位新方法[J].计算机工程与应用.2007,(12).DOI:10.3321/j.issn:1002-8331.2007.12.056 .

[8]刘兴,蒋天发.车牌字符图像分割技术的研究与应用[J].武汉大学学报(工学版).2006,(6).DOI:10.3969/j.issn.1671-8844.2006.06.032 .

[9]张禹,马驷良,韩笑,等.车牌识别中的图像提取及分割算法[J].吉林大学学报(理学版).2006,(3).DOI:10.3321/j.issn:1671-5489.2006.03.020 .

[10]王兴玲.最大类间方差车牌字符分割的模板匹配算法[J].计算机工程.2006,(19).DOI:10.3969/j.issn.1000-3428.2006.19.071 .

文章来源:https://blog.csdn.net/xuehaikj/article/details/135093156
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。