最近由于要接触halcon就开始学习halcon课程,看得是超人视觉得视频,今天学了车牌识别,觉得使用halcon确实很方便,学习的思路也很重要,所以花点时间记一记。
首先,获取一张含有车牌的图片后将其转换到灰度空间,由于很难完成一次性对数字的提取,所以先把车牌的整体区域分割出来,实验中可以发现若直接转成灰度图进行二值化分割的效果还是不怎么好的,所以将其转换为HSV,从变量窗口可以看出对其S空间进行操作容易些(对我使用的图片),进行阈值分割后要使用connection()将整体分成各个不同的连通域(阈值分割时尽量不让车牌断开,如果断开再进行拼接),再进行特征分割,使用形态学和填充,这时可以得到车牌大体区域。
其次,得到车牌区域后,由于车牌并不总是“水平”放置的,所以要使用仿射变换调整图片,在halcon中使用affine_trans_image(...),affine_trans_region(...)函数。
再者,对上述提取的车牌进行阈值分割,这时需要注意所要识别的字母和数字需为黑,不然识别出错。
接着就直接上程序了:
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
**车牌分割
read_image (Img, 'C:/Users/Logan/Desktop/img.jpeg')
decompose3 (Img, Img_R, Img_G, Img_B)
trans_from_rgb (Img_R, Img_G, Img_B, Image_H, Image_S, Image_V, 'hsv')
threshold (Image_S, Regions, 21, 255)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 4220.78, 6168.83)
dilation_rectangle1 (SelectedRegions, RegionDilation, 32, 32)
area_center (RegionDilation, Area, Row, Column)
orientation_region (RegionDilation, Phi)
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
affine_trans_image (Img, ImageAffineTrans, HomMat2D, 'constant', 'false')
affine_trans_region (RegionDilation, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
reduce_domain (ImageAffineTrans, RegionAffineTrans, ImageReduced)
**字符分割
rgb1_to_gray (ImageReduced, GrayImage)
*所识别的数字需为黑色
invert_image (GrayImage, ImageInvert)
threshold (GrayImage, Regions1, 183, 242)
connection (Regions1, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, 'column', 'and', 282.11, 500)
sort_region (SelectedRegions1, SortedRegions, 'first_point', 'true', 'column')
read_ocr_class_mlp ('Industrial_0-9A-Z_NoRej.omc', OCRHandle)
do_ocr_multi_class_mlp (SortedRegions, ImageInvert, OCRHandle, Class, Confidence)
*显示
smallest_rectangle1 (SortedRegions, Row1, Column1, Row2, Column2)
count_obj (SortedRegions, Number)
for i:=1 to Number by 1
disp_message (WindowHandle, Class[i-1], 'ImageAffineTrans', Row2[i-1], Column1[i-1], 'blue', 'true')
endfor
效果图如下: