opencv入门—车牌初次定位
已经有一段时间没有更新博客,最近在忙着物联网技能大赛的一些准备,利用暑假空闲时间学习了opencv,大致的了解了相关的API的使用,这还只是做着搬砖的学习,要想深入到图像处理领域,还得将冈萨雷斯著作《数字图像处理》全部理解消化,光看书还是没有太大的作用,还得通过不断地实践发现问题,解决问题。
此次的车牌初次定位只针对蓝色车牌,不考虑的环境等外界因素,由于小编水平还不够,没有对轮廓进行漫水填充以及对轮廓进行相应的筛选,仅仅只根据蓝色车牌的颜色特征进行HSV的转化等操作来实现对车牌进行简单的定位。在后期将对该项目进行全面改进,请各位大佬多多指教。
import cv2
import numpy as np
#读取图片函数
def imread_photo(filename,flag):
return cv2.imread(filename,flag)
#得到mask灰度图像以及mask
def HSV(carboard):
#对图像进行高斯滤波,将噪声去除
carboard=cv2.GaussianBlur(carboard,(5,5),0,0)
hsv=cv2.cvtColor(carboard,cv2.COLOR_BGR2HSV)
#蓝色值的范围
minBlue=np.array([100,60,46])
maxBlue=np.array([124,255,255])
mask=cv2.inRange(hsv,minBlue,maxBlue)
blue_img=cv2.bitwise_and(carboard,carboard,mask=mask)
blue_gray=cv2.cvtColor(blue_img,cv2.COLOR_BGR2GRAY)
t,blue_gray_binary=cv2.threshold(blue_gray,100,255,cv2.THRESH_BINARY)
return blue_gray_binary,mask
#将mask图像的轮廓检测出来
def counters(img):
contours,hierarchy=cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
return contours,hierarchy
#将彩色图像转化为灰度图像,随及将灰度图像转化为二值图像
def Gray(carboard):
gray=cv2.cvtColor(carboard,cv2.COLOR_BGR2GRAY)
#将图像二值化
t,rst=cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
return rst
#进行形态学操作———开运算(将细小的连通线去除)
def open(image):
kernel = np.ones((5, 19), np.uint8)
closingimg = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
#cv2.imshow("closingimg", closingimg)
# 进行开运算
openingimg = cv2.morphologyEx(closingimg, cv2.MORPH_OPEN, kernel)
# 再次进行开运算
kernel = np.ones((11, 5), np.uint8)
openingimg = cv2.morphologyEx(openingimg, cv2.MORPH_OPEN, kernel)
#开运算
kernel = np.ones((11, 5), np.uint8)
openingimg = cv2.morphologyEx(openingimg, cv2.MORPH_OPEN, kernel)
#闭运算
kernel = np.ones((5, 19), np.uint8)
closingimg = cv2.morphologyEx(openingimg, cv2.MORPH_CLOSE, kernel)
#开运算
kernel = np.ones((11, 5), np.uint8)
openingimg = cv2.morphologyEx(closingimg, cv2.MORPH_OPEN, kernel)
return openingimg
#sobel算子边缘检测
def sobe(image):
sobel1=cv2.Sobel(image,cv2.CV_64F,1,0)
return sobel1
#矩形边框的绘制,返回值为左上角x,y坐标,以及x,y方向长度
def bound(count):
x,y,w,h=cv2.boundingRect(count)
return x,y,w,h
if __name__=="__main__":
carboard=imread_photo('H:\\python\\car.bmp',cv2.IMREAD_COLOR)
cv2.imshow("original",carboard)
#carboard_gray=cv.cvtColor(carboard,cv.COLOR_BGR2GRAY)#rgb图像转灰度图像
#对灰度图像进行高斯滤波,剔除噪声
carboard_gaussian=cv2.GaussianBlur(carboard,(5,5),0,0)
#通过转化hsv图像,将蓝色车牌区域筛选出来,找到mask区域
carboard1,mask=HSV(carboard)
opening1=open(carboard1)
counters1,hierarchy=counters(opening1)
x,y,w,h=bound(counters1[0])
brcnt=np.array([[[x,y]],[[x+w+3,y]],[[x+w+3,y+h+3]],[[x,y+h+3]]])#四个定位坐标点
result=cv2.drawContours(carboard,[brcnt],-1,(0,0,255),1)
cv2.imshow("end",result)
cv2.waitKey(0)
cv2.destroyAllWindows()
原图
完成后效果图如下