halcon学习笔记-车牌号识别

1.读取图像

快捷键:ctrl+r,以这张车牌为例:

在这里插入图片描述

2.图像三通道分割

由于图像中颜色区分明显,尤其是车牌号与背景之间的色差较大,用颜色特征进行分割比较合适。通过三通道分割,将RGB图分成三层独立的图像,分别是红色、绿色和蓝色通道。

decompose3 (Image9, Image1, Image2, Image3)

3.三通道转换成hsv空间

只用于颜色对比明显的图。
hsv:分别代表色度分量、饱和度分量以及亮度分量。

trans_from_rgb (Image1, Image2, Image3, ImageResult1, ImageResult2, ImageResult3, 'hsv')

4.从以上处理过的图像中选取其中一张

选择车牌最突出的。本次选择亮度分量:
在这里插入图片描述

5.二值化处理

目的:从整个图像中含有ROI的区域。
由于图像本身就是单通道的,可以直接二值化处理。打开灰度直方图,然后通过调整阈值,图像选中的区域也跟着发生变化。
调至:完全覆盖车牌,其他区域尽量少并且跟车牌的区域明显区分开。然后点击“插入代码”即可。
红色就是被选中的区域。
在这里插入图片描述

在这里插入图片描述

6.断开连通域

目的:用不同的连通域将二值化后的图像区分RIO和其他区域。
在halcon中同一种颜色代表一个连通域,因此为了将车牌从图像中分割开来,需要将其与其他区域变成不同的颜色,也就是不同的连通域。此处用到算子`。

connection (Regions, ConnectedRegions)

在这里插入图片描述

7.特征提取

目的:提取RIO。
通过特征直方图经过多个特征提取出车牌。
注意:特征直方图的使用一定是在断开连通域之后欧进行的。
所用算子:

select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 3737.11, 6228.

在这里插入图片描述

在这里插入图片描述

8.填充孔洞

分割出来的区域存在多个大大小小的孔洞,需要进行填补。使用算子:

fill_up (SelectedRegions, RegionFillUp)

在这里插入图片描述

9.矫正和分割

目的:将原本倾斜的图像摆正。
通过计算图像的倾角和中心。然后绕中心旋转一定的倾角将图像水平放置。算子:

orientation_region (RegionFillUp, Phi)#计算倾斜角度
area_center (RegionFillUp, Area, Row, Column)#区域面积和中心坐标计算
vector_angle_to_rigid (Row, Column, Phi, Row, Column,rad(180), HomMat2D)
affine_trans_image (Image9, ImageAffinTrans, HomMat2D, 'constant', 'false')
affine_trans_region (RegionFillUp, RegionAffineTrans, HomMat2D, 'nearest_neighbor')

在这里插入图片描述
在这里插入图片描述

10.字符定位。

操作跟上面的相似。原理相通。
在这里插入图片描述

11.字符分割

在这里插入图片描述

12.字符识别和显示

要用到分类器mlp,算子:

do_ocr_multi_class_mlp (SortedRegions, ImageInvert, OCRHandle1, Class, Confidence)
smallest_rectangle1 (SortedRegions, Row1, Column11, Row21, Column2)
count_obj (SortedRegions, Number)
for i := 1 to Number by 1
    disp_message (3600, Class, 'window', Row, Column, 'black', 'true')
endfor

在这里插入图片描述

读取图像
read_image (Image9, 'C:/Users/Administrator/Desktop/halcon/练习/车牌9.jpg')
*车牌校正以及定位
decompose3 (Image9, Image1, Image2, Image3)
trans_from_rgb (Image1, Image2, Image3, ImageResult1, ImageResult2, ImageResult3, 'hsv')
threshold (ImageResult3, Regions, 119, 255)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 3737.11, 6228.52)
fill_up (SelectedRegions, RegionFillUp)
orientation_region (RegionFillUp, Phi)
area_center (RegionFillUp, Area, Row, Column)
vector_angle_to_rigid (Row, Column, Phi, Row, Column,rad(180), HomMat2D)
affine_trans_image (Image9, ImageAffinTrans, HomMat2D, 'constant', 'false')
affine_trans_region (RegionFillUp, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
reduce_domain (ImageAffinTrans, RegionAffineTrans, ImageReduced)

*字符定位
rgb1_to_gray (ImageReduced, GrayImage)
invert_image (GrayImage, ImageInvert)
threshold (GrayImage, Regions1, 196, 253)
connection (Regions1, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 38.95, 180.78)
select_shape (SelectedRegions1, SelectedRegions2, 'area', 'and', 107.653, 154.592)

*排序和读取字符
sort_region (SelectedRegions2, SortedRegions, 'first_point', 'true', 'column')
read_ocr_class_mlp ('Document_0-9A-Z_NoRej.omc', OCRHandle1)
do_ocr_multi_class_mlp (SortedRegions, ImageInvert, OCRHandle1, Class, Confidence)
*显示字符
smallest_rectangle1 (SortedRegions, Row1, Column11, Row21, Column2)
count_obj (SortedRegions, Number)
for i := 1 to Number by 1
    disp_message (3600, Class, 'window', Row, Column, 'black', 'true')
endfor

猜你喜欢

转载自blog.csdn.net/weixin_51244852/article/details/115333178#comments_20388143