OpenCV(项目)车牌识别1

您所在的位置:网站首页 linux是什么车牌 OpenCV(项目)车牌识别1

OpenCV(项目)车牌识别1

2024-01-21 16:18| 来源: 网络整理| 查看: 265

目录

一、形态学车牌提取(简单:单情景)

 1、读取图片,转灰度图

 2、提取轮廓(Sobel算子提取y方向边缘)

3、自适应二值化

4、闭运算处理,把图像闭合、揉团,使图像区域化

5、腐蚀/膨胀去噪得到车牌区域

5-1、横向腐蚀、膨胀

5-2、纵向腐蚀、膨胀

6、获取外轮廓

6-1、得到轮廓

 6-2、画出轮廓并显示

7、截取得到车牌

二、形态学车牌提取(优化:多情景)

1、转灰度图

2、顶帽运算

3、Sobel算子提取Y方向边缘

4、二值化图像

5、开运算分割(纵向分割)

6、闭运算合并

7、横/纵方向腐蚀/膨胀

7-1、纵方向: 腐蚀+膨胀

 7-2、横方向:膨胀+腐蚀

 8、腐蚀膨胀:去噪

 9、获取外轮廓

10、 根据车牌特征找到车牌轮廓

代码

 参考资料

一、形态学车牌提取(简单:单情景)

(单图片还不错,但多图片不准确)

 1、读取图片,转灰度图 # 1、读取图片,转灰度图 img = cv.imread('Resource/car.jpg') gray = cv.cvtColor(img, cv.COLOR_RGB2GRAY) cv.imshow('gray', gray)

 2、提取轮廓(Sobel算子提取y方向边缘)

 为什么对Y方向取边缘:让图像变“瘦”,便于把车牌揉成一团。

# 2、提取轮廓(Sobel算子提取y方向) y = cv.Sobel(gray, cv.CV_16S, 1, 0) # 注:对x/y微分和得到x/y方向图像相反 要得到x/y方向边缘,就要求y/x方向的微分。 absY = cv.convertScaleAbs(y) cv.imshow('Y', absY)

 

3、自适应二值化

注:threshold函数返回两个参数,第二个参数才是二进制图像!!! 

# 3、自适应二值化 ret, binary = cv.threshold(absY, 0, 255, cv.THRESH_OTSU) cv.imshow('binary', binary)

4、闭运算处理,把图像闭合、揉团,使图像区域化 闭运算处理,图像区域化,便于找到车牌区域,进而得到轮廓

测试多组图片,发现(17, 5)的卷积核比较好,能达到目的。 

# 4、闭运算处理,把图像闭合、揉团,使图像区域化,便于找到车牌区域,进而得到轮廓 kernel = cv.getStructuringElement(cv.MORPH_RECT, (17,5)) print('kernel= \n', kernel) close = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel) cv.imshow('close', close)

 (这里采用矩形卷积核处理。)

5、腐蚀/膨胀去噪得到车牌区域

上面虽然得到了二进制图像,且得到了大致区域,但是噪声(杂质)仍然太多,下面通过腐蚀、膨胀去噪。

5-1、横向腐蚀、膨胀 # 5-1、水平方向腐蚀/膨胀 erode = cv.morphologyEx(close, cv.MORPH_ERODE, kernel_x) cv.imshow('erode_x', erode) dilate = cv.morphologyEx(erode, cv.MORPH_DILATE, kernel_x) cv.imshow('dilate_x', dilate)

 

横向处理完之后,继续对纵向进行处理。 

5-2、纵向腐蚀、膨胀 # 5-2、竖直方向腐蚀/膨胀 erode = cv.morphologyEx(dilate, cv.MORPH_ERODE, kernel_y) cv.imshow('erode_y', erode) dilate = cv.morphologyEx(erode, cv.MORPH_DILATE, kernel_y) cv.imshow('dilate_y', dilate)

 

 如上图,得到了想要的结果,基本只剩下几个轮廓了,且车牌区域保留完好,不影响车牌的定位。

6、获取外轮廓

这里想先把包括车牌轮廓的外轮廓一起显示。

6-1、得到轮廓 # 6-1、得到轮廓 contours, hierarchy = cv.findContours(dilate_y, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

 6-2、画出轮廓并显示 # 6-2、画出轮廓 cv.drawContours(img_copy, contours, -1, (255,0,255), 2) cv.imshow('Contours', img_copy)

获取轮廓代码及效果: 

# 6、获取外轮廓 img_copy = img.copy() # 6-1、得到轮廓 contours, hierarchy = cv.findContours(dilate_y, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # 6-2、画出轮廓并显示 cv.drawContours(img_copy, contours, -1, (255,0,255), 2) cv.imshow('Contours', img_copy)

7、截取得到车牌

 首先判断车牌的特征(比如宽:高一般在3~4),然后根据这个特征进行判断,只保留符合特征的图片(车牌)。

# 7、遍历所有轮廓,找到车牌轮廓 for contour in contours: # 7-1、得到矩形区域:左顶点坐标、宽和高 rect = cv.boundingRect(contour) # 7-2、判断宽高比例是否符合车牌标准,截取符合图片 if rect[2]>rect[3]*3 and rect[2]rect[3]*3 and rect[2]rect[3]*3 and rect[2]


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3