婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 詳細過程帶你用Python做車牌自動識別系統

詳細過程帶你用Python做車牌自動識別系統

熱門標簽:沈陽防封電銷電話卡 銀川電話機器人電話 企業微信地圖標注 萊蕪電信外呼系統 鶴壁手機自動外呼系統違法嗎 地圖標注多個 B52系統電梯外呼顯示E7 怎么辦理400客服電話 高德地圖標注收入咋樣

前言

前段時間,用PyQt5寫了兩篇文章,自己用python做的一款超炫酷音樂播放器、用Python做個個性的動畫掛件讓桌面不單調。有粉絲問我,為什么要用PyQt5?之前沒接觸過PyQt5,能不能多分享一些這方面的開發案例?

今天就繼續給大家分享一個實戰案例,帶大家一起用Python的PyQt5開發一個車牌自動識別系統!

首先一起來看看最終實現的車牌識別系統效果圖:


下面,我們就開始介紹如何實現這款自動車牌識別系統。

一、核心功能設計

總體來說,我們首先要進行UI界面構建設計,根據車牌識別系統功能進行畫面排版布局;其次我們的這款車牌識別系統的主要功能車輛圖片讀取識別顯示、圖片中車牌ROI區域獲取、車牌識別結果輸出顯示。

對于結果輸出顯示,我們主要包含了讀取圖片名稱、讀取錄入時間、識別車牌號碼、識別車牌顏色、識別車牌所屬地。最后我們還可以將車牌識別系統的數據信息導出本地存儲。

拆解需求,大致可以整理出核心功能如下:

UI設計排版布局

  • 左側區域進行識別信息顯示,包含圖片名稱、讀取錄入時間、識別車牌號碼、識別車牌顏色、識別車牌所屬地信息
  • 右側可以分成3個區域,頂部區域包含窗體最小化,最大化,關閉功能;中間區域顯示讀取車輛圖片;底部區域包含車牌顯示區域、圖片讀取、車牌信息存儲功能

車牌識別

  • 通過讀取圖片進行車牌區域提取輸出
  • 車牌自動識別結果輸出

車牌信息顯示存儲

  • 根據自動識別結果對車牌各類信息顯示
  • 對錄入識別的車輛車牌識別信息存儲

二、實現步驟

1. UI設計排版布局

根據車牌識別需要的功能,首先進行UI布局設計,我們這次還是使用的pyqt5。核心設計代碼如下:

# author:CSDN-Dragon少年
def setupUi(self, MainWindow):
    MainWindow.setObjectName("MainWindow")
    MainWindow.resize(1213, 670)
    MainWindow.setFixedSize(1213, 670)  # 設置窗體固定大小
    MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")
    self.scrollArea = QtWidgets.QScrollArea(self.centralwidget)
    self.scrollArea.setGeometry(QtCore.QRect(690, 40, 511, 460))
    self.scrollArea.setWidgetResizable(True)
    self.scrollArea.setObjectName("scrollArea")
    self.scrollAreaWidgetContents = QtWidgets.QWidget()
    self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 500, 489))
    self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
    self.label_0 = QtWidgets.QLabel(self.scrollAreaWidgetContents)
    self.label_0.setGeometry(QtCore.QRect(10, 10, 111, 20))
    font = QtGui.QFont()
    font.setPointSize(11)
    self.label_0.setFont(font)
    self.label_0.setObjectName("label_0")
    self.label = QtWidgets.QLabel(self.scrollAreaWidgetContents)
    self.label.setGeometry(QtCore.QRect(10, 40, 481, 420))
    self.label.setObjectName("label")
    self.label.setAlignment(Qt.AlignCenter)
    self.scrollArea.setWidget(self.scrollAreaWidgetContents)
    self.scrollArea_2 = QtWidgets.QScrollArea(self.centralwidget)
    self.scrollArea_2.setGeometry(QtCore.QRect(10, 10, 671, 631))
    self.scrollArea_2.setWidgetResizable(True)
    self.scrollArea_2.setObjectName("scrollArea_2")
    self.scrollAreaWidgetContents_1 = QtWidgets.QWidget()
    self.scrollAreaWidgetContents_1.setGeometry(QtCore.QRect(0, 0, 669, 629))
    self.scrollAreaWidgetContents_1.setObjectName("scrollAreaWidgetContents_1")
    self.label_1 = QtWidgets.QLabel(self.scrollAreaWidgetContents_1)
    self.label_1.setGeometry(QtCore.QRect(10, 10, 111, 20))
    font = QtGui.QFont()
    font.setPointSize(11)
    self.label_1.setFont(font)
    self.label_1.setObjectName("label_1")
    self.tableWidget = QtWidgets.QTableWidget(self.scrollAreaWidgetContents_1)
    self.tableWidget.setGeometry(QtCore.QRect(10, 40, 651, 581))  # 581))
    self.tableWidget.setObjectName("tableWidget")
    self.tableWidget.setColumnCount(5)
    self.tableWidget.setColumnWidth(0, 140)  # 設置1列的寬度
    self.tableWidget.setColumnWidth(1, 130)  # 設置2列的寬度
    self.tableWidget.setColumnWidth(2, 110)  # 設置3列的寬度
    self.tableWidget.setColumnWidth(3, 90)  # 設置4列的寬度
    self.tableWidget.setColumnWidth(4, 181)  # 設置5列的寬度
    self.tableWidget.setHorizontalHeaderLabels(["圖片名稱", "錄入時間", "車牌號碼", "車牌類型", "車牌信息"])
    self.tableWidget.setRowCount(self.RowLength)
    self.tableWidget.verticalHeader().setVisible(False)  # 隱藏垂直表頭)
    self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
    self.tableWidget.raise_()
    self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_1)
    self.scrollArea_3 = QtWidgets.QScrollArea(self.centralwidget)
    self.scrollArea_3.setGeometry(QtCore.QRect(690, 510, 341, 131))
    self.scrollArea_3.setWidgetResizable(True)
    self.scrollArea_3.setObjectName("scrollArea_3")
    self.scrollAreaWidgetContents_3 = QtWidgets.QWidget()
    self.scrollAreaWidgetContents_3.setGeometry(QtCore.QRect(0, 0, 339, 129))
    self.scrollAreaWidgetContents_3.setObjectName("scrollAreaWidgetContents_3")
    self.label_2 = QtWidgets.QLabel(self.scrollAreaWidgetContents_3)
    self.label_2.setGeometry(QtCore.QRect(10, 10, 111, 20))
    font = QtGui.QFont()
    font.setPointSize(11)
    self.label_2.setFont(font)
    self.label_2.setObjectName("label_2")
    self.label_3 = QtWidgets.QLabel(self.scrollAreaWidgetContents_3)
    self.label_3.setGeometry(QtCore.QRect(10, 40, 321, 81))
    self.label_3.setObjectName("label_3")
    self.scrollArea_3.setWidget(self.scrollAreaWidgetContents_3)
    self.scrollArea_4 = QtWidgets.QScrollArea(self.centralwidget)
    self.scrollArea_4.setGeometry(QtCore.QRect(1040, 510, 161, 131))
    self.scrollArea_4.setWidgetResizable(True)
    self.scrollArea_4.setObjectName("scrollArea_4")
    self.scrollAreaWidgetContents_4 = QtWidgets.QWidget()
    self.scrollAreaWidgetContents_4.setGeometry(QtCore.QRect(0, 0, 159, 129))
    self.scrollAreaWidgetContents_4.setObjectName("scrollAreaWidgetContents_4")
    self.pushButton_2 = QtWidgets.QPushButton(self.scrollAreaWidgetContents_4)
    self.pushButton_2.setGeometry(QtCore.QRect(20, 50, 121, 31))
    self.pushButton_2.setObjectName("pushButton_2")
    self.pushButton = QtWidgets.QPushButton(self.scrollAreaWidgetContents_4)
    self.pushButton.setGeometry(QtCore.QRect(20, 90, 121, 31))
    self.pushButton.setObjectName("pushButton")
    self.label_4 = QtWidgets.QLabel(self.scrollAreaWidgetContents_4)
    self.label_4.setGeometry(QtCore.QRect(10, 10, 111, 20))
    font = QtGui.QFont()
    font.setPointSize(11)
    self.label_4.setFont(font)
    self.label_4.setObjectName("label_4")
    self.scrollArea_4.setWidget(self.scrollAreaWidgetContents_4)
    MainWindow.setCentralWidget(self.centralwidget)
    self.statusbar = QtWidgets.QStatusBar(MainWindow)
    self.statusbar.setObjectName("statusbar")
    MainWindow.setStatusBar(self.statusbar)
    self.retranslateUi(MainWindow)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)
    self.retranslateUi(MainWindow)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)
    self.pushButton.clicked.connect(self.__openimage)  # 設置點擊事件
    self.pushButton.setStyleSheet('''QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#2B2B2B;}''')
    self.pushButton_2.clicked.connect(self.__writeFiles)  # 設置點擊事件
    self.pushButton_2.setStyleSheet('''QPushButton{background:#222225;border-radius:5px;}QPushButton:hover{background:#2B2B2B;}''')
    self.retranslateUi(MainWindow)
    self.close_widget = QtWidgets.QWidget(self.centralwidget)
    self.close_widget.setGeometry(QtCore.QRect(1130, 0, 90, 50))
    self.close_widget.setObjectName("close_widget")
    self.close_layout = QGridLayout()  # 創建左側部件的網格布局層
    self.close_widget.setLayout(self.close_layout)  # 設置左側部件布局為網格
    self.left_close = QPushButton("")  # 關閉按鈕
    self.left_close.clicked.connect(self.close)
    self.left_visit = QPushButton("")  # 空白按鈕
    self.left_visit.clicked.connect(MainWindow.big)
    self.left_mini = QPushButton("")  # 最小化按鈕
    self.left_mini.clicked.connect(MainWindow.mini)
    self.close_layout.addWidget(self.left_mini, 0, 0, 1, 1)
    self.close_layout.addWidget(self.left_close, 0, 2, 1, 1)
    self.close_layout.addWidget(self.left_visit, 0, 1, 1, 1)
    self.left_close.setFixedSize(15, 15)  # 設置關閉按鈕的大小
    self.left_visit.setFixedSize(15, 15)  # 設置按鈕大小
    self.left_mini.setFixedSize(15, 15)  # 設置最小化按鈕大小
    self.left_close.setStyleSheet(
        '''QPushButton{background:#F76677;border-radius:5px;}QPushButton:hover{background:red;}''')
    self.left_visit.setStyleSheet(
        '''QPushButton{background:#F7D674;border-radius:5px;}QPushButton:hover{background:yellow;}''')
    self.left_mini.setStyleSheet(
        '''QPushButton{background:#6DDF6D;border-radius:5px;}QPushButton:hover{background:green;}''')

    QtCore.QMetaObject.connectSlotsByName(MainWindow)
    self.ProjectPath = os.getcwd()  # 獲取當前工程文件位置
    self.scrollAreaWidgetContents.setStyleSheet(sc)
    self.scrollAreaWidgetContents_3.setStyleSheet(sc)
    self.scrollAreaWidgetContents_4.setStyleSheet(sc)
    b =             '''
         color:white;
         background:#2B2B2B;
        '''
    self.label_0.setStyleSheet(b)
    self.label_1.setStyleSheet(b)
    self.label_2.setStyleSheet(b)
    self.label_3.setStyleSheet(b)
    MainWindow.setWindowOpacity(0.95)  # 設置窗口透明度
    MainWindow.setAttribute(Qt.WA_TranslucentBackground)
    MainWindow.setWindowFlag(Qt.FramelessWindowHint)  # 隱藏邊框

# author:CSDN-Dragon少年
def retranslateUi(self, MainWindow):
    _translate = QtCore.QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", "車牌識別系統"))
    self.label_0.setText(_translate("MainWindow", "原始圖片:"))
    self.label.setText(_translate("MainWindow", ""))
    self.label_1.setText(_translate("MainWindow", "識別結果:"))
    self.label_2.setText(_translate("MainWindow", "車牌區域:"))
    self.label_3.setText(_translate("MainWindow", ""))
    self.pushButton.setText(_translate("MainWindow", "打開文件"))
    self.pushButton_2.setText(_translate("MainWindow", "導出數據"))
    self.label_4.setText(_translate("MainWindow", "事件:"))
    self.scrollAreaWidgetContents_1.show()

UI實現效果如下:

2. 車牌識別

接下來我們需要實現兩個核心功能,包括獲取車牌ROI區域車牌自動識別功能。

車牌ROI區域提取:

根據讀取的車輛圖片,預處理進行車牌ROI區域提取,主要通過Opencv的圖像處理相關知識點來完成。主要包括對圖像去噪、二值化、邊緣輪廓提取、矩形區域矯正、藍綠黃車牌顏色定位識別。核心代碼如下:

# author:CSDN-Dragon少年
# 預處理
def pretreatment(self, car_pic):
    if type(car_pic) == type(""):
        img = self.__imreadex(car_pic)
    else:
        img = car_pic
    pic_hight, pic_width = img.shape[:2]

    if pic_width > self.MAX_WIDTH:
        resize_rate = self.MAX_WIDTH / pic_width
        img = cv2.resize(img, (self.MAX_WIDTH, int(pic_hight * resize_rate)),
                         interpolation=cv2.INTER_AREA)  # 圖片分辨率調整
    blur = self.cfg["blur"]
    # 高斯去噪
    if blur > 0:
        img = cv2.GaussianBlur(img, (blur, blur), 0)
    oldimg = img
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    kernel = np.ones((20, 20), np.uint8)
    img_opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)  # 開運算
    img_opening = cv2.addWeighted(img, 1, img_opening, -1, 0);  # 與上一次開運算結果融合
    # cv2.imshow('img_opening', img_opening)

    # 找到圖像邊緣
    ret, img_thresh = cv2.threshold(img_opening, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)  # 二值化
    img_edge = cv2.Canny(img_thresh, 100, 200)
    # cv2.imshow('img_edge', img_edge)

    # 使用開運算和閉運算讓圖像邊緣成為一個整體
    kernel = np.ones((self.cfg["morphologyr"], self.cfg["morphologyc"]), np.uint8)
    img_edge1 = cv2.morphologyEx(img_edge, cv2.MORPH_CLOSE, kernel)  # 閉運算
    img_edge2 = cv2.morphologyEx(img_edge1, cv2.MORPH_OPEN, kernel)  # 開運算
    # cv2.imshow('img_edge2', img_edge2)
    # cv2.imwrite('./edge2.png', img_edge2)
    # 查找圖像邊緣整體形成的矩形區域,可能有很多,車牌就在其中一個矩形區域中
    image, contours, hierarchy = cv2.findContours(img_edge2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    contours = [cnt for cnt in contours if cv2.contourArea(cnt) > self.Min_Area]
    # 逐個排除不是車牌的矩形區域
    car_contours = []
    for cnt in contours:
        # 框選 生成最小外接矩形 返回值(中心(x,y), (寬,高), 旋轉角度)
        rect = cv2.minAreaRect(cnt)
        # print('寬高:',rect[1])
        area_width, area_height = rect[1]
        # 選擇寬大于高的區域
        if area_width  area_height:
            area_width, area_height = area_height, area_width
        wh_ratio = area_width / area_height
        # print('寬高比:',wh_ratio)
        # 要求矩形區域長寬比在2到5.5之間,2到5.5是車牌的長寬比,其余的矩形排除
        if wh_ratio > 2 and wh_ratio  5.5:
            car_contours.append(rect)
            box = cv2.boxPoints(rect)
            box = np.int0(box)
    # 矩形區域可能是傾斜的矩形,需要矯正,以便使用顏色定位
    card_imgs = []
    for rect in car_contours:
        if rect[2] > -1 and rect[2]  1:  # 創造角度,使得左、高、右、低拿到正確的值
            angle = 1
        else:
            angle = rect[2]
        rect = (rect[0], (rect[1][0] + 5, rect[1][1] + 5), angle)  # 擴大范圍,避免車牌邊緣被排除
        box = cv2.boxPoints(rect)
        heigth_point = right_point = [0, 0]
        left_point = low_point = [pic_width, pic_hight]
        for point in box:
            if left_point[0] > point[0]:
                left_point = point
            if low_point[1] > point[1]:
                low_point = point
            if heigth_point[1]  point[1]:
                heigth_point = point
            if right_point[0]  point[0]:
                right_point = point
        if left_point[1] = right_point[1]:  # 正角度
            new_right_point = [right_point[0], heigth_point[1]]
            pts2 = np.float32([left_point, heigth_point, new_right_point])  # 字符只是高度需要改變
            pts1 = np.float32([left_point, heigth_point, right_point])
            M = cv2.getAffineTransform(pts1, pts2)
            dst = cv2.warpAffine(oldimg, M, (pic_width, pic_hight))
            self.__point_limit(new_right_point)
            self.__point_limit(heigth_point)
            self.__point_limit(left_point)
            card_img = dst[int(left_point[1]):int(heigth_point[1]), int(left_point[0]):int(new_right_point[0])]
            card_imgs.append(card_img)

        elif left_point[1] > right_point[1]:  # 負角度

            new_left_point = [left_point[0], heigth_point[1]]
            pts2 = np.float32([new_left_point, heigth_point, right_point])  # 字符只是高度需要改變
            pts1 = np.float32([left_point, heigth_point, right_point])
            M = cv2.getAffineTransform(pts1, pts2)
            dst = cv2.warpAffine(oldimg, M, (pic_width, pic_hight))
            self.__point_limit(right_point)
            self.__point_limit(heigth_point)
            self.__point_limit(new_left_point)
            card_img = dst[int(right_point[1]):int(heigth_point[1]), int(new_left_point[0]):int(right_point[0])]
            card_imgs.append(card_img)
    #使用顏色定位,排除不是車牌的矩形,目前只識別藍、綠、黃車牌
    colors = []
    for card_index, card_img in enumerate(card_imgs):
        green = yellow = blue = black = white = 0
        try:
            # 有轉換失敗的可能,原因來自于上面矯正矩形出錯
            card_img_hsv = cv2.cvtColor(card_img, cv2.COLOR_BGR2HSV)
        except:
            print('BGR轉HSV失敗')
            card_imgs = colors = None
            return card_imgs, colors

        if card_img_hsv is None:
            continue
        row_num, col_num = card_img_hsv.shape[:2]
        card_img_count = row_num * col_num

        # 確定車牌顏色
        for i in range(row_num):
            for j in range(col_num):
                H = card_img_hsv.item(i, j, 0)
                S = card_img_hsv.item(i, j, 1)
                V = card_img_hsv.item(i, j, 2)
                if 11  H = 34 and S > 34:  # 圖片分辨率調整
                    yellow += 1
                elif 35  H = 99 and S > 34:  # 圖片分辨率調整
                    green += 1
                elif 99  H = 124 and S > 34:  # 圖片分辨率調整
                    blue += 1

                if 0  H  180 and 0  S  255 and 0  V  46:
                    black += 1
                elif 0  H  180 and 0  S  43 and 221  V  225:
                    white += 1
        color = "no"
        # print('黃:{:6}綠:{:6}藍:{:6}'.format(yellow,green,blue))

        limit1 = limit2 = 0
        if yellow * 2 >= card_img_count:
            color = "yellow"
            limit1 = 11
            limit2 = 34  # 有的圖片有色偏偏綠
        elif green * 2 >= card_img_count:
            color = "green"
            limit1 = 35
            limit2 = 99
        elif blue * 2 >= card_img_count:
            color = "blue"
            limit1 = 100
            limit2 = 124  # 有的圖片有色偏偏紫
        elif black + white >= card_img_count * 0.7:
            color = "bw"
        # print(color)
        colors.append(color)
        # print(blue, green, yellow, black, white, card_img_count)
        if limit1 == 0:
            continue

        # 根據車牌顏色再定位,縮小邊緣非車牌邊界
        xl, xr, yh, yl = self.accurate_place(card_img_hsv, limit1, limit2, color)
        if yl == yh and xl == xr:
            continue
        need_accurate = False
        if yl >= yh:
            yl = 0
            yh = row_num
            need_accurate = True
        if xl >= xr:
            xl = 0
            xr = col_num
            need_accurate = True
        card_imgs[card_index] = card_img[yl:yh, xl:xr] \

            if color != "green" or yl  (yh - yl) // 4 else card_img[yl - (yh - yl) // 4:yh, xl:xr]
        if need_accurate:  # 可能x或y方向未縮小,需要再試一次
            card_img = card_imgs[card_index]
            card_img_hsv = cv2.cvtColor(card_img, cv2.COLOR_BGR2HSV)
            xl, xr, yh, yl = self.accurate_place(card_img_hsv, limit1, limit2, color)
            if yl == yh and xl == xr:
                continue
            if yl >= yh:
                yl = 0
                yh = row_num
            if xl >= xr:
                xl = 0
                xr = col_num
        card_imgs[card_index] = card_img[yl:yh, xl:xr] \

            if color != "green" or yl  (yh - yl) // 4 else card_img[yl - (yh - yl) // 4:yh, xl:xr]
    # cv2.imshow("result", card_imgs[0])
    # cv2.imwrite('1.jpg', card_imgs[0])
    # print('顏色識別結果:' + colors[0])
    return card_imgs, colors

至此我們就可以輸出車牌ROI區域和車牌顏色了,效果如下:


車牌自動識別:

本篇介紹調用百度AI提供的車牌識別接口 – 百度AI開放平臺鏈接,識別效果非常不錯。


這里面我們可以創建一個車牌識別的應用,其中的API Key及Secret Key后面我們調用車牌識別檢測接口時會用到。


我們可以看到官方提供的幫助文檔,介紹了如何調用請求URL數據格式,向API服務地址使用POST發送請求,必須在URL中帶上參數access_token,可通過后臺的API Key和Secret Key生成。這里面的API Key和Secret Key就是我們上面提到的。


接下來我們看看調用車牌識別接口代碼示例。


那我們如何獲取識別的車牌號碼呢?API文檔可以看到里面有個words_result字典 ,其中的color代表車牌顏色 number代表車牌號碼 。這樣我就可以知道識別的車牌顏色和車牌號了。


車牌識別的接口調用流程基本已經清楚了,下面就可以進行代碼實現了。

# author:CSDN-Dragon少年
def get_token(self):
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentialsclient_id=' + self.client_id + 'client_secret=' + self.client_secret
    response = requests.get(host)
    if response:
        token_info = response.json()
        token_key = token_info['access_token']
    return token_key

# author:CSDN-Dragon少年
def get_license_plate(self, car_pic):
    result = {}
    card_imgs, colors = self.pretreatment(car_pic)
    request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate"
    # 二進制方式打開圖片文件
    f = open(car_pic, 'rb')
    img = base64.b64encode(f.read())
    params = {"image": img}
    access_token = self.get_token()
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    if response:
        print(response.json())
        license_result = response.json()['words_result']['number']
        card_color = response.json()['words_result']['color']
        if license_result != []:
            result['InputTime'] = time.strftime("%Y-%m-%d %H:%M:%S")
            result['Type'] = self.cardtype[card_color]
            result['Picture'] = card_imgs[0]
            result['Number'] = ''.join(license_result[:2]) + '·' + ''.join(license_result[2:])
            try:
                result['From'] = ''.join(self.Prefecture[license_result[0]][license_result[1]])
            except:
                result['From'] = '未知'
            return result
    else:
        return None

這樣我們就可以拿到車牌顏色和車牌號碼了,效果如下:

3. 車牌信息顯示存儲

3.1 車牌信息顯示:

# author:CSDN-Dragon少年
def __show(self, result, FileName):
    # 顯示表格
    self.RowLength = self.RowLength + 1
    if self.RowLength > 18:
        self.tableWidget.setColumnWidth(5, 157)
    self.tableWidget.setRowCount(self.RowLength)
    self.tableWidget.setItem(self.RowLength - 1, 0, QTableWidgetItem(FileName))
    self.tableWidget.setItem(self.RowLength - 1, 1, QTableWidgetItem(result['InputTime']))
    self.tableWidget.setItem(self.RowLength - 1, 2, QTableWidgetItem(result['Number']))
    self.tableWidget.setItem(self.RowLength - 1, 3, QTableWidgetItem(result['Type']))
    if result['Type'] == '藍色牌照':
        self.tableWidget.item(self.RowLength - 1, 3).setBackground(QBrush(QColor(3, 128, 255)))
    elif result['Type'] == '綠色牌照':
        self.tableWidget.item(self.RowLength - 1, 3).setBackground(QBrush(QColor(98, 198, 148)))
    elif result['Type'] == '黃色牌照':
        self.tableWidget.item(self.RowLength - 1, 3).setBackground(QBrush(QColor(242, 202, 9)))
    self.tableWidget.setItem(self.RowLength - 1, 4, QTableWidgetItem(result['From']))
    self.tableWidget.item(self.RowLength - 1, 4).setBackground(QBrush(QColor(255, 255, 255)))
    # 顯示識別到的車牌位置
    size = (int(self.label_3.width()), int(self.label_3.height()))
    shrink = cv2.resize(result['Picture'], size, interpolation=cv2.INTER_AREA)
    shrink = cv2.cvtColor(shrink, cv2.COLOR_BGR2RGB)
    self.QtImg = QtGui.QImage(shrink[:], shrink.shape[1], shrink.shape[0], shrink.shape[1] * 3,
                              QtGui.QImage.Format_RGB888)
    self.label_3.setPixmap(QtGui.QPixmap.fromImage(self.QtImg))

效果如下:

3.2 信息導出存儲:

# author:CSDN-Dragon少年
def __writexls(self, DATA, path):
    wb = xlwt.Workbook();
    ws = wb.add_sheet('Data');
    # DATA.insert(0, ['文件名稱','錄入時間', '車牌號碼', '車牌類型', '車牌信息'])
    for i, Data in enumerate(DATA):
        for j, data in enumerate(Data):
            ws.write(i, j, data)
    wb.save(path)
    QMessageBox.information(None, "成功", "數據已保存!", QMessageBox.Yes)
def __writecsv(self, DATA, path):
    f = open(path, 'w')
    # DATA.insert(0, ['文件名稱','錄入時間', '車牌號碼', '車牌類型', '車牌信息'])
    for data in DATA:
        f.write((',').join(data) + '\n')
    f.close()
    QMessageBox.information(None, "成功", "數據已保存!", QMessageBox.Yes)

def __writeFiles(self):
    path, filetype = QFileDialog.getSaveFileName(None, "另存為", self.ProjectPath,
                                                 "Excel 工作簿(*.xls);;CSV (逗號分隔)(*.csv)")
    if path == "":  # 未選擇
        return
    if filetype == 'Excel 工作簿(*.xls)':
        self.__writexls(self.Data, path)
    elif filetype == 'CSV (逗號分隔)(*.csv)':
        self.__writecsv(self.Data, path)

效果如下:


導出車牌信息數據如下:


至此,整個車牌自動識別系統就完成了~今天我們就到這里,明天繼續努力!


如果本篇博客有任何錯誤,請批評指教,不勝感激 !

您可能感興趣的文章:
  • AI:如何訓練機器學習的模型
  • 使用JavaSE來模擬斗地主
  • 用python做個代碼版的小仙女蹦迪視頻
  • 用Python做個個性的動畫掛件讓桌面不單調
  • Python做個自定義動態壁紙還可以放視頻
  • 自己用python做的一款超炫酷音樂播放器
  • 我用Python做個AI出牌器斗地主把把贏

標簽:湘西 呼倫貝爾 銀川 葫蘆島 呼倫貝爾 三亞 烏魯木齊 安慶

巨人網絡通訊聲明:本文標題《詳細過程帶你用Python做車牌自動識別系統》,本文關鍵詞  詳細,過程,帶,你用,Python,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《詳細過程帶你用Python做車牌自動識別系統》相關的同類信息!
  • 本頁收集關于詳細過程帶你用Python做車牌自動識別系統的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    99视频在线观看一区三区| 国产午夜精品一区二区三区视频 | 欧美亚洲日本国产| 激情小说欧美图片| 日本成人超碰在线观看| 中文字幕中文字幕一区二区| 精品国产乱码久久久久久影片| 在线视频中文字幕一区二区| 国产高清久久久| 久久99精品久久久久婷婷| 亚洲国产精品一区二区www在线| 国产性色一区二区| 精品国内二区三区| 欧美va亚洲va| 亚洲精品一区在线观看| 精品卡一卡二卡三卡四在线| 欧美片在线播放| 欧美浪妇xxxx高跟鞋交| 欧美色大人视频| 在线免费观看不卡av| 91丝袜国产在线播放| 粉嫩嫩av羞羞动漫久久久 | 国产欧美日韩另类视频免费观看| 欧美二区在线观看| 日韩一区二区三区在线| 91精品国产欧美一区二区| 欧美精品黑人性xxxx| 9191成人精品久久| 91精品国产综合久久福利| 91精品国产aⅴ一区二区| 欧美一区二区三区四区高清| 日韩欧美在线1卡| 日韩精品一区二区三区在线播放| 91首页免费视频| 97se亚洲国产综合自在线观| 91网站在线观看视频| 91福利国产精品| 欧美在线短视频| 91精品在线观看入口| 欧美大片拔萝卜| 国产婷婷一区二区| 中文字幕av在线一区二区三区| 亚洲欧美日韩一区二区| 欧美国产精品中文字幕| 夜夜爽夜夜爽精品视频| 日韩激情在线观看| 高清在线不卡av| 欧美视频一区二区三区四区| 日韩精品在线一区二区| 国产精品沙发午睡系列990531| 中文字幕日韩一区| 轻轻草成人在线| 99久久婷婷国产精品综合| 欧美日韩国产综合草草| 欧美国产一区在线| 五月天激情综合网| 国产成人精品午夜视频免费| 欧美在线免费视屏| 久久免费的精品国产v∧| 亚洲天天做日日做天天谢日日欢| 三级一区在线视频先锋| 99久久精品情趣| 日韩一区二区高清| 亚洲一区二区在线视频| 丰满亚洲少妇av| 日韩免费观看2025年上映的电影| 最新国产の精品合集bt伙计| 日本 国产 欧美色综合| 色老汉av一区二区三区| 欧美国产日韩一二三区| 调教+趴+乳夹+国产+精品| 成人app网站| www激情久久| 亚洲超碰97人人做人人爱| 99在线热播精品免费| 国产清纯白嫩初高生在线观看91 | av不卡一区二区三区| 日韩一区二区在线观看| 午夜不卡av免费| 日本高清不卡视频| 中文字幕在线一区二区三区| 韩国午夜理伦三级不卡影院| 日韩区在线观看| 天天操天天干天天综合网| 91久久久免费一区二区| 国产精品二三区| av一区二区不卡| 日韩毛片高清在线播放| 不卡的电影网站| 国产欧美日韩亚州综合| 国产大片一区二区| 久久久久久综合| 国产在线视频一区二区三区| 日韩欧美三级在线| 激情小说亚洲一区| 欧美成人一区二区| 天堂蜜桃一区二区三区| 欧美精品久久久久久久多人混战| 天堂蜜桃91精品| 精品奇米国产一区二区三区| 青青草国产精品97视觉盛宴| 欧美军同video69gay| 一区二区三区**美女毛片| 91传媒视频在线播放| 亚洲一区二区在线免费看| 欧美日韩在线一区二区| 夜夜嗨av一区二区三区中文字幕| 91亚洲精品久久久蜜桃网站| 亚洲欧洲综合另类| 欧美日韩日本视频| 奇米888四色在线精品| 26uuu色噜噜精品一区二区| 国产成人在线免费观看| 国产精品福利电影一区二区三区四区| 成人黄色大片在线观看| 亚洲素人一区二区| 欧美日韩一区二区三区免费看| 免费观看成人av| 欧美激情一区不卡| 日韩久久久精品| 亚洲人成精品久久久久| 青青草一区二区三区| 成人久久视频在线观看| 中文字幕 久热精品 视频在线| 中文字幕日韩一区| 激情成人综合网| 欧美日韩在线不卡| 中文字幕一区免费在线观看| 国产成人高清在线| 精品国产91乱码一区二区三区| 久久噜噜亚洲综合| 国产精品久线在线观看| 亚洲国产成人91porn| 热久久一区二区| 激情综合色综合久久综合| 成人永久免费视频| 欧美日韩国产综合视频在线观看 | 欧美草草影院在线视频| 欧美一区二区三区日韩| 国产网站一区二区| 男人的j进女人的j一区| 欧美96一区二区免费视频| 91免费精品国自产拍在线不卡| av在线综合网| 欧美激情一区在线| 日韩视频免费观看高清完整版在线观看 | 国产精品国产自产拍高清av | 国产乱子伦一区二区三区国色天香| 精品国偷自产国产一区| 99久久亚洲一区二区三区青草 | 久久久久国产精品麻豆ai换脸 | 一区二区三区中文字幕| 久久综合色8888| 欧美人动与zoxxxx乱| 色婷婷激情综合| 成人美女视频在线看| 精品中文字幕一区二区| 丝袜美腿亚洲色图| 午夜精品久久久久久| 亚洲综合一区二区| 亚洲精品菠萝久久久久久久| 国产女同互慰高潮91漫画| 欧美va天堂va视频va在线| 欧美一区二区三区视频在线| 欧美日韩高清一区二区三区| 色吧成人激情小说| 91香蕉视频污在线| eeuss影院一区二区三区 | 韩国av一区二区三区在线观看| 亚洲线精品一区二区三区八戒| 亚洲视频一区二区免费在线观看| 日本一区二区三区四区在线视频| 91精品久久久久久蜜臀| 欧美午夜精品理论片a级按摩| hitomi一区二区三区精品| 成人国产精品免费观看视频| 成人一级黄色片| 国产精品一二三四五| 国产成a人亚洲| 97久久超碰国产精品| 91老师片黄在线观看| 日本精品免费观看高清观看| 一本到不卡精品视频在线观看| 色婷婷综合久久久久中文一区二区| 91麻豆文化传媒在线观看| 欧美午夜一区二区| 555www色欧美视频| 精品国产乱码久久久久久闺蜜 | 亚洲一卡二卡三卡四卡无卡久久 | 一本色道久久综合亚洲91| 91热门视频在线观看| 日本高清无吗v一区| 欧美久久一区二区| 欧美成人激情免费网| 国产清纯美女被跳蛋高潮一区二区久久w| 日本一区二区综合亚洲| 亚洲男人的天堂一区二区| 亚洲成人av在线电影| 国内精品伊人久久久久影院对白| 成人一区二区三区视频在线观看|