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