车牌定位html5,车牌识别(一)——车牌定位(附详细代码及注释)
車(chē)牌識(shí)別分三步:車(chē)牌定位,車(chē)牌字符分割,車(chē)牌字符識(shí)別。
本篇就車(chē)牌定位進(jìn)行講述。車(chē)牌定位顧名思義——找出車(chē)牌的位置。如何實(shí)現(xiàn),又分三步:圖像預(yù)處理,數(shù)學(xué)形態(tài)學(xué)粗定位,長(zhǎng)寬比例精確定位。
首先,對(duì)圖像預(yù)處理:
彩色圖像轉(zhuǎn)灰度圖
高斯濾波,中值濾波
邊緣化檢測(cè)
二值化操作
#-*- coding: utf-8 -*-
import cv2
import numpy as np
def Process(img):
# 高斯平滑
gaussian = cv2.GaussianBlur(img, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
#cv2.GaussianBlur(src,ksize,sigmaX[,sigmaxY[,borderType]]])高斯濾波函數(shù)
#src: 輸入圖像
#ksize: 高斯內(nèi)核大小,元組類(lèi)型
#sigmaX: 高斯核函數(shù)在X方向上的標(biāo)準(zhǔn)偏差
#sigmaY: 高斯核函數(shù)在Y方向上的標(biāo)準(zhǔn)偏差,如果sigmaY是0,則函數(shù)會(huì)自動(dòng)將sigmaY的值設(shè)置為與sigmaX相同的值,如果sigmaX和sigmaY都是0,這兩個(gè)值將由ksize[0]和ksize[1]計(jì)算而來(lái)。建議將size、sigmaX和sigmaY都指定出來(lái)。
#borderType: 推斷圖像外部像素的某種便捷模式,有默認(rèn)值cv2.BORDER_DEFAULT,如果沒(méi)有特殊需要不用更改,具體可以參考borderInterpolate()函數(shù)。
# 中值濾波
median = cv2.medianBlur(gaussian, 5)
#cv2.medianBlur(src,ksize)
#src: 輸入圖像
#ksize: 高斯內(nèi)核大小,元組類(lèi)型
# Sobel算子
# 梯度方向: x
sobel = cv2.Sobel(median, cv2.CV_8U, 1, 0, ksize=3)
# 利用Sobel方法可以進(jìn)行sobel邊緣檢測(cè)
# img表示源圖像,即進(jìn)行邊緣檢測(cè)的圖像
# 圖像深度是cv2.CV_8U、cv2.CV_16U、cv2.CV_16S、cv2.CV_32F以及cv2.CV_64F其中的某一個(gè)
# 第三和第四個(gè)參數(shù)分別是對(duì)X和Y方向的導(dǎo)數(shù)(即dx,dy),對(duì)于圖像來(lái)說(shuō)就是差分,這里1表示對(duì)X求偏導(dǎo)(差分),0表示不對(duì)Y求導(dǎo)(差分)。其中,X還可以求2次導(dǎo)。
# 注意:對(duì)X求導(dǎo)就是檢測(cè)X方向上是否有邊緣。
# 第五個(gè)參數(shù)ksize是指核的大小。
# 這里說(shuō)明一下,這個(gè)參數(shù)的前四個(gè)參數(shù)都沒(méi)有給誰(shuí)賦值,而ksize則是被賦值的對(duì)象
# 實(shí)際上,這是可省略的參數(shù),而前四個(gè)是不可省的參數(shù)。注意其中的不同點(diǎn)值化
ret, binary = cv2.threshold(sobel, 170, 255, cv2.THRESH_BINARY)
#灰度值小于175的點(diǎn)置0,灰度值大于175的點(diǎn)置255
#最后的參數(shù)是閾值類(lèi)型,對(duì)應(yīng)一個(gè)公式,一般用這個(gè)就可以
然后,數(shù)學(xué)形態(tài)學(xué)處理: 形態(tài)學(xué)處理的核心就是定義結(jié)構(gòu)元素,一般情況下對(duì)二值化圖像進(jìn)行的操作。
# 膨脹和腐蝕操作的核函數(shù)
element1 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 1))
element2 = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 7))
#第一個(gè)參數(shù)定義結(jié)構(gòu)元素,如橢圓(MORPH_ELLIPSE)、交叉形結(jié)構(gòu)(MORPH_CROSS)和矩形(MORPH_RECT)
#第二個(gè)參數(shù)就是指和函數(shù)的size,9×1
# 膨脹一次,讓輪廓突出
dilation = cv2.dilate(binary, element2, iterations=1)
# 腐蝕一次,去掉細(xì)小雜點(diǎn)
erosion = cv2.erode(dilation, element1, iterations=1)
# 再次膨脹,讓輪廓更明顯
dilation2 = cv2.dilate(erosion, element2, iterations=3)
#存儲(chǔ)中間圖片
cv2.imwrite("binary.png", binary)
cv2.imwrite("dilation.png", dilation)
cv2.imwrite("erosion.png", erosion)
cv2.imwrite("dilation2.png", dilation2)
return dilation2
最后:查找輪廓,精確定位
查找篩選輪廓
車(chē)牌長(zhǎng)寬比
顏色判斷(沒(méi)大必要)
def GetRegion(img):
regions = []
# 查找輪廓
_, contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#三個(gè)輸入?yún)?shù):輸入圖像(二值圖像),輪廓檢索方式,輪廓近似方法
#輪廓檢索方式:cv2.RETR_EXTERNAL只檢測(cè)外輪廓。cv2.RETR_LIST檢測(cè)的輪廓不建立等級(jí)關(guān)系。cv2.RETR_CCOMP建立兩個(gè)等級(jí)的輪廓,上面一層為外邊界,里面一層為內(nèi)孔的邊界信息。cv2.RETR_TREE建立一個(gè)等級(jí)樹(shù)結(jié)構(gòu)的輪廓
#輪廓近似方法:cv2.CHAIN_APPROX_NONE存儲(chǔ)所有邊界點(diǎn)。cv2.CHAIN_APPROX_SIMPLE壓縮垂直、水平、對(duì)角方向,只保留端點(diǎn)。cv2.CHAIN_APPROX_TX89_L1使用teh-Chini近似算法。cv2.CHAIN_APPROX_TC89_KCOS使用teh-Chini近似算法
#三個(gè)返回值:圖像,輪廓,輪廓的層析結(jié)構(gòu)
#篩選面積小的
for contour in contours:
#計(jì)算該輪廓的面積
area = cv2.contourArea(contour)
#面積小的都篩選掉
if (area < 2000):
continue
#輪廓近似,作用很小
epslion = 1e-3 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epslion, True)
#epsilon,是從輪廓到近似輪廓的最大距離。是一個(gè)準(zhǔn)確率參數(shù),好的epsilon的選擇可以得到正確的輸出。True決定曲線是否閉合。
# 找到最小的矩形,該矩形可能有方向
rect = cv2.minAreaRect(contour)
# box是四個(gè)點(diǎn)的坐標(biāo)
box = cv2.boxPoints(rect)
box = np.int0(box)
## 計(jì)算高和寬
height = abs(box[0][1] - box[2][1])
width = abs(box[0][0] - box[2][0])
#車(chē)牌正常情況下長(zhǎng)高比在2-5之間
ratio =float(width) / float(height)
if (ratio < 5 and ratio > 2):
regions.append(box)
return regions
def detect(img):
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 預(yù)處理及形態(tài)學(xué)處理,得到可以查找矩形的圖片
prc = Process(gray)
#得到車(chē)牌輪廓
regions = GetRegion(prc)
print('[INFO]:Detect %d license plates' % len(regions))
#用綠線畫(huà)出這些找到的輪廓
for box in regions:
cv2.drawContours(img, [box], 0, (0, 255, 0), 2)
#五個(gè)輸入?yún)?shù):原始圖像,輪廓,輪廓的索引(當(dāng)設(shè)置為-1時(shí),繪制所有輪廓),畫(huà)筆顏色,畫(huà)筆大小
#一個(gè)返回值:返回繪制了輪廓的圖像
cv2.imshow('Result', img)
#保存結(jié)果文件名
cv2.imwrite('result.jpg', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
#輸入的參數(shù)為圖片的路徑
img = cv2.imread('1.jpg')
detect(img)
總結(jié)
以上是生活随笔為你收集整理的车牌定位html5,车牌识别(一)——车牌定位(附详细代码及注释)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 合并两个数组并去重(ES5和ES6两种方
- 下一篇: 分布式队列编程:模型、实战