通过halcon实现车牌识别,大致分为读取图像、车牌定位、角度修正、分割、识别显示几部分。
一、读取照片
打开halcon,在菜单栏文件选型中读取图像,或者直接写read_image算子导入图像。
二、定位车牌
1.颜色空间转换
利用decompose3算子和trans_from_rgb算子,将图像转为hsv颜色空间图像,选取车牌部分最明显的一张。此例子中选择的是ImageResualt2,
2.阈值分割
通过阈值分割大致选出包含车牌区域。
用connection算子将图像分割成不同的连通域。
通过形态学方法,特征选择等进一步确定车牌所在位置。
在特征选择时,首选通过面积(area)来定位车牌,如果通过面积不能确定,可以增加宽度,长度等特征进行筛选。另外在特征直方图中,每一个峰值即代表一个特征区域。
如果选出的车牌区域不是一个完整的连通域,而是几个相邻的连通域,可以使用union算子将他们连成一个连通域进行定位。
将连通域用算子shape_trans转换成一个矩形区域。
该区域即是车牌所在区域。
三、角度修正
由于识别字符采用的是halcon内部的训练集,所以需要将倾斜的字符转正。
首先通过orientation_region算子获得该矩形区域的倾斜角度,然后将图像修正。
对矩形区域的旋转要先找到矩形的中心,然后通过算子vector_angle_to_rigid构建仿射变换模板,其算子使用方法为
vector_angle_to_rigid( : : Row1, Column1, Angle1, Row2, Column2, Angle2 : HomMat2D)
参数描述
我们需要注意的参数是angle1和angle2,angle1是输入图像的角度,angle2是输出图像的角度,为了方便我们的理解和运算,我们输入的角度设置为phi(上一步求得),如果phi为正数角度转为rad(180),如果phi为负数角度转为rad(0).
而phi的正负是由于参考坐标的不同而引起的,在此我们不进行深入理解。
然后使用生成的模型,用算子将原图像和矩形区域都进行仿射变换。
四、分割
使用reduce_domain算子对图像进行分割,将车牌分离出来。
然后对图像进行转灰度图。
阈值分割
连通域分割
多种特征联合选择,一般使用面积,宽度,高度
对区域进行排序,按照character进行排序
五、识别显示
利用算子read_ocr_class_mlp选择ocr模型,Industrial_0-9A-Z_NoRej.omc
利用算子do_ocr_multi_class_mlp进行识别
显示结果
以下为代码
*读入图像
read_image (Chepai, '/chepai1.jpg')
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*定位
decompose3 (Chepai, Image1, Image2, Image3)
trans_from_rgb (Image1, Image2, Image3, ImageResult1, ImageResult2, ImageResult3, 'hsv')
threshold (ImageResult2, Regions, 85, 255)
opening_rectangle1 (Regions, RegionOpening, 3, 3)
fill_up (RegionOpening, RegionFillUp)
connection (RegionFillUp, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions2, 'area', 'and', 7546.3, 10000)
union1 (SelectedRegions2, RegionUnion)
shape_trans (RegionUnion, RegionTrans, 'rectangle2')
*角度修正
orientation_region (RegionTrans, Phi)
area_center (RegionTrans, Area, Row, Column)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(180), HomMat2D)
affine_trans_image (Chepai, ImageAffineTrans, HomMat2D, 'constant', 'false')
affine_trans_region (RegionTrans, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
*分割
reduce_domain (ImageAffineTrans, RegionAffineTrans, ImageReduced)
rgb1_to_gray (ImageReduced, GrayImage)
threshold (GrayImage, Regions1, 193, 249)
connection (Regions1, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions, ['area','column','column2'], 'and', [20.83,243.06,125.46], [434.72,500,500])
sort_region (SelectedRegions, SortedRegions, 'character', 'true', 'column')
invert_image (GrayImage, ImageInvert)
*识别
read_ocr_class_mlp ('Industrial_0-9A-Z_NoRej.omc', OCRHandle)
do_ocr_multi_class_mlp (SortedRegions, ImageInvert, OCRHandle, Class, Confidence)
disp_message (WindowHandle, Class, 'window', 0, 0, 'blue', 'true')
亦人亦仙
发布了1 篇原创文章 · 获赞 0 · 访问量 20
私信
关注