一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

基于OpenCV 的車(chē)牌識(shí)別

 小白學(xué)視覺(jué) 2021-01-28

重磅干貨,第一時(shí)間送達(dá)

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

車(chē)牌識(shí)別的相關(guān)步驟

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

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

3. 字符識(shí)別:現(xiàn)在,我們?cè)谏弦徊街蝎@得的新圖像肯定可以寫(xiě)上一些字符(數(shù)字/字母)。因此,我們可以對(duì)其執(zhí)行OCR(光學(xué)字符識(shí)別)以檢測(cè)數(shù)字。

1.車(chē)牌檢測(cè)

讓我們以汽車(chē)的樣本圖像為例,首先檢測(cè)該汽車(chē)上的車(chē)牌。然后,我們還將使用相同的圖像進(jìn)行字符分割和字符識(shí)別。如果您想直接進(jìn)入代碼而無(wú)需解釋?zhuān)瑒t可以向下滾動(dòng)至此頁(yè)面的底部,提供完整的代碼,或訪問(wèn)以下鏈接。https://github.com/GeekyPRAVEE/OpenCV-Projects/blob/master/LicensePlateRecoginition.ipynb

在次使用的測(cè)試圖像如下所示。

圖片來(lái)源鏈接:https : //rb.gy/lxmiuv

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

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

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

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

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

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

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

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

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

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

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

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

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

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

找到正確的計(jì)數(shù)器后,我們將其保存在名為screenCnt的變量中,然后在其周?chē)L制一個(gè)矩形框,以確保我們已正確檢測(cè)到車(chē)牌。

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

# 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.字符分割

車(chē)牌識(shí)別的下一步是通過(guò)裁剪車(chē)牌并將其保存為新圖像,將車(chē)牌從圖像中分割出來(lái)然后,我們可以使用此圖像來(lái)檢測(cè)其中的字符。下面顯示了從主圖像裁剪出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é)果圖像如下所示。通常添加到裁剪圖像中,如果需要,我們還可以對(duì)其進(jìn)行灰色處理和邊緣化。這樣做是為了改善下一步的字符識(shí)別。但是我發(fā)現(xiàn)即使使用原始圖像也可以正常工作。

3.字符識(shí)別

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

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


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

車(chē)牌識(shí)別失敗案例

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

這個(gè)案例中我們的程序能夠正確檢測(cè)車(chē)牌并進(jìn)行裁剪。但是,Tesseract庫(kù)無(wú)法正確識(shí)別字符。OCR已將其識(shí)別為“ MH13CD 0036”,而不是實(shí)際的“ MH 13 CD 0096”。通過(guò)使用更好的方向圖像或配置Tesseract引擎,可以糾正此類(lèi)問(wèn)題

其他成功的例子

大多數(shù)時(shí)候,圖像質(zhì)量和方向都是正確的,程序能夠識(shí)別車(chē)牌并從中讀取編號(hào)。下面的快照顯示了獲得的成功結(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()

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

流群

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多

    老司机精品视频在线免费| 又色又爽又无遮挡的视频 | 青青久久亚洲婷婷中文网| 久久精品色妇熟妇丰满人妻91| 欧美国产日韩在线综合| 欧美精品一区久久精品| 超薄丝袜足一区二区三区| 亚洲国产精品一区二区毛片| 国产精品一区二区成人在线| 中文字幕高清免费日韩视频| 中文字幕区自拍偷拍区| 国产精品一区二区三区黄色片| 在线观看视频日韩精品| 午夜精品久久久99热连载| 在线免费视频你懂的观看| 91在线播放在线播放观看| 亚洲中文在线男人的天堂| 日本精品视频一二三区| 亚洲欧洲一区二区综合精品| 九九九热视频最新在线| 成人欧美一区二区三区视频| 午夜亚洲精品理论片在线观看| 国产伦精品一区二区三区高清版| 国产精品一区二区三区激情| 国产欧美日韩精品自拍| 欧美日韩精品久久第一页| 麻豆精品在线一区二区三区| 精品al亚洲麻豆一区| 97人妻精品一区二区三区免| 精品国产亚洲免费91| 亚洲中文字幕人妻av| 欧美午夜一区二区福利视频| 在线日韩欧美国产自拍| 日韩欧美一区二区不卡看片| 欧美美女视频在线免费看| 天堂av一区一区一区| 亚洲国产精品久久精品成人| 日韩黄色一级片免费收看| 九九蜜桃视频香蕉视频| 成人日韩在线播放视频| 日韩精品在线观看一区|