1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        基于 OpenCV 的車牌識別

        共 5065字,需瀏覽 11分鐘

         ·

        2020-09-18 12:52


        點擊上方Jack Cui”,選擇加"星標"或“置頂

        重磅干貨,第一時間送達



        車牌識別是一種圖像處理技術(shù),用于識別不同車輛。這項技術(shù)被廣泛用于各種安全檢測中?,F(xiàn)在讓我們一起基于OpenCV編寫Python代碼來完成這項任務(wù)。

        車牌識別的相關(guān)步驟

        1.車牌檢測:第一步是從汽車上檢測車牌所在位置。我們將使用OpenCV中矩形的輪廓檢測來尋找車牌。如果我們知道車牌的確切尺寸,顏色和大致位置,則可以提高準確性。通常,也會將根據(jù)攝像機的位置和該特定國家/地區(qū)所使用的車牌類型來訓(xùn)練檢測算法。但是圖像可能并沒有汽車的存在,在這種情況下我們將先進行汽車的,然后是車牌。

        2.字符分割:檢測到車牌后,我們必須將其裁剪并保存為新圖像。同樣,這可以使用OpenCV來完成。

        3. 字符識別:現(xiàn)在,我們在上一步中獲得的新圖像肯定可以寫上一些字符(數(shù)字/字母)。因此,我們可以對其執(zhí)行OCR(光學(xué)字符識別)以檢測數(shù)字。

        1.車牌檢測

        讓我們以汽車的樣本圖像為例,首先檢測該汽車上的車牌。然后,我們還將使用相同的圖像進行字符分割和字符識別。如果您想直接進入代碼而無需解釋,則可以向下滾動至此頁面的底部,提供完整的代碼,或訪問以下鏈接。

        https://github.com/GeekyPRAVEE/OpenCV-Projects/blob/master/LicensePlateRecoginition.ipynb

        此次使用的測試圖像如下所示。

        第1步:?將圖像調(diào)整為所需大小,然后將其灰度。相同的代碼如下

        img = cv2.resize(img, (620,480) )gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #convert to grey scale

        調(diào)整大小后,可以避免使用較大分辨率的圖像而出現(xiàn)的以下問題,但是我們要確保在調(diào)整大小后,車號牌仍保留在框架中。在處理圖像時如果不再需要處理顏色細節(jié),那么灰度變化就必不可少,這加快了其他后續(xù)處理的速度。完成此步驟后,圖像將像這樣被轉(zhuǎn)換。

        步驟2:每張圖片都會包含有用和無用的信息,在這種情況下,對于我們來說,只有牌照是有用的信息,其余的對于我們的程序幾乎是無用的。這種無用的信息稱為噪聲。通常,使用雙邊濾波(模糊)會從圖像中刪除不需要的細節(jié)。

        gray = cv2.bilateralFilter(gray, 13, 15, 15)

        語法為?destination_image = cv2.bilateralFilter(source_image, diameter of pixel, sigmaColor, sigmaSpace)。我們也可以將sigma顏色和sigma空間從15增加到更高的值,以模糊掉更多的背景信息,但請注意不要使有用的部分模糊。輸出圖像如下所示可以看到該圖像中的背景細節(jié)(樹木和建筑物)模糊了。這樣,我們可以避免程序處理這些區(qū)域。

        步驟3:下一步是我們執(zhí)行邊緣檢測的有趣步驟。有很多方法可以做到,最簡單和流行的方法是使用OpenCV中canny edge方法。執(zhí)行相同操作的行如下所示

        edged = cv2.Canny(gray, 30, 200) #Perform Edge detection

        語法為destination_image = cv2.Canny(source_image,thresholdValue 1,thresholdValue 2)。閾值1和閾值2是最小和最大閾值。僅顯示強度梯度大于最小閾值且小于最大閾值的邊緣。結(jié)果圖像如下所示

        步驟4:現(xiàn)在我們可以開始在圖像上尋找輪廓

        contours=cv2.findContours(edged.copy(),cv2.RETR_TREE,                                            cv2.CHAIN_APPROX_SIMPLE)contours = imutils.grab_contours(contours)contours = sorted(contours,key=cv2.contourArea, reverse = True)[:10]screenCnt = None

        一旦檢測到計數(shù)器,我們就將它們從大到小進行排序,并只考慮前10個結(jié)果而忽略其他結(jié)果。在我們的圖像中,計數(shù)器可以是具有閉合表面的任何事物,但是在所有獲得的結(jié)果中,牌照號碼也將存在,因為它也是閉合表面。

        為了過濾獲得的結(jié)果中的車牌圖像,我們將遍歷所有結(jié)果,并檢查其具有四個側(cè)面和閉合圖形的矩形輪廓。由于車牌肯定是四邊形的矩形。

        for c in cnts:    # approximate the contour    peri = cv2.arcLength(c, True)    approx = cv2.approxPolyDP(c, 0.018 * peri, True)    # if our approximated contour has four points, then    # we can assume that we have found our screen    if len(approx) == 4:        screenCnt = approx        break

        找到正確的計數(shù)器后,我們將其保存在名為screenCnt的變量中,然后在其周圍繪制一個矩形框,以確保我們已正確檢測到車牌。

        步驟5:現(xiàn)在我們知道車牌在哪里,剩下的信息對我們來說幾乎沒有用。因此,我們可以對整個圖片進行遮罩,除了車牌所在的地方。相同的代碼如下所示

        # Masking the part other than the number platemask = np.zeros(gray.shape,np.uint8)new_image = cv2.drawContours(mask,[screenCnt],0,255,-1,)new_image = cv2.bitwise_and(img,img,mask=mask)

        被遮罩的新圖像將如下所示

        2.字符分割

        車牌識別的下一步是通過裁剪車牌并將其保存為新圖像,將車牌從圖像中分割出來然后,我們可以使用此圖像來檢測其中的字符。下面顯示了從主圖像裁剪出ROI(感興趣區(qū)域)圖像的代碼

        # Now crop(x, y) = np.where(mask == 255)(topx, topy) = (np.min(x), np.min(y))(bottomx, bottomy) = (np.max(x), np.max(y))Cropped = gray[topx:bottomx+1, topy:bottomy+1]

        結(jié)果圖像如下所示。通常添加到裁剪圖像中,如果需要,我們還可以對其進行灰色處理和邊緣化。這樣做是為了改善下一步的字符識別。但是我發(fā)現(xiàn)即使使用原始圖像也可以正常工作。

        3.字符識別

        車牌識別的最后一步是從分割的圖像中實際讀取車牌信息。就像前面的教程一樣,我們將使用pytesseract包從圖像讀取字符。相同的代碼如下

        #Read the number platetext = pytesseract.image_to_string(Cropped, config='--psm 11')print("Detected license plate Number is:",text)


        原始圖像上印有數(shù)字“ CZ20FSE”,并且我們的程序檢測到它在jupyter筆記本上打印了相同的值。

        車牌識別失敗案例

        車牌識別的完整代碼,其中包含程序和我們用來檢查程序的測試圖像。要記住,此方法的結(jié)果將不準確。準確度取決于圖像的清晰度,方向,曝光等。為了獲得更好的結(jié)果,您可以嘗試同時實現(xiàn)機器學(xué)習(xí)算法。

        這個案例中我們的程序能夠正確檢測車牌并進行裁剪。但是,Tesseract庫無法正確識別字符。OCR已將其識別為“ MH13CD 0036”,而不是實際的“ MH 13 CD 0096”。通過使用更好的方向圖像或配置Tesseract引擎,可以糾正此類問題。

        其他成功的例子

        大多數(shù)時候,圖像質(zhì)量和方向都是正確的,程序能夠識別車牌并從中讀取編號。下面的快照顯示了獲得的成功結(jié)果。

        完整代碼

        #@programming_feverimport cv2import imutilsimport numpy as npimport pytesseractpytesseract.pytesseract.tesseract_cmd = r'C:\Program Files (x86)\Tesseract-OCR\tesseract.exe'
        img = cv2.imread('D://skoda1.jpg',cv2.IMREAD_COLOR)img = cv2.resize(img, (600,400) )
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray = cv2.bilateralFilter(gray, 13, 15, 15)
        edged = cv2.Canny(gray, 30, 200) contours = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)contours = imutils.grab_contours(contours)contours = sorted(contours, key = cv2.contourArea, reverse = True)[:10]screenCnt = None
        for c in contours: peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, 0.018 * peri, True) if len(approx) == 4: screenCnt = approx break
        if screenCnt is None: detected = 0 print ("No contour detected")else: detected = 1
        if detected == 1: cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)
        mask = np.zeros(gray.shape,np.uint8)new_image = cv2.drawContours(mask,[screenCnt],0,255,-1,)new_image = cv2.bitwise_and(img,img,mask=mask)
        (x, y) = np.where(mask == 255)(topx, topy) = (np.min(x), np.min(y))(bottomx, bottomy) = (np.max(x), np.max(y))Cropped = gray[topx:bottomx+1, topy:bottomy+1]
        text = pytesseract.image_to_string(Cropped, config='--psm 11')print("programming_fever's License Plate Recognition\n")print("Detected license plate Number is:",text)img = cv2.resize(img,(500,300))Cropped = cv2.resize(Cropped,(400,200))cv2.imshow('car',img)cv2.imshow('Cropped',Cropped)
        cv2.waitKey(0)cv2.destroyAllWindows()


        瀏覽 38
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产一区二区电影在线观看 | 最新黄色在线网站 | 台湾亚洲精品一区二区tv | 黄色一级片免费看 | 啪啪不卡 | 午夜激情网 | 国产美色 | 久操免费在线视频 | 国产精品久久久久久久久毛片 | 超逼网址 |