定位
- Blob分析
- 模板匹配
仿射
使用单位矩阵求仿射矩阵
示例:affine_trans_region.hdev
- 单位矩阵
hom_mat2d_identity (HomMat2DIdentity) - 平移矩阵
hom_mat2d_translate() - 旋转矩阵
hom_mat2d_rotate(HomMat2DIdentity, -0.3, 256, 256, HomMat2DRotate)输入是原矩阵,输出是旋转矩阵,旋转角度是顺时针0.3度,旋转中心点是(256,256) - 缩放矩阵
hom_mat2d_scale (HomMat2DRotate, 1.5, 0.5, 256, 256, HomMat2DScale)缩放点是(256,256),(1.5,0.5)表示x轴上缩放1.5倍,y轴上缩放0.5倍 - 仿射操作
对区域仿射
affine_trans_region (Region, egionAffineTrans, HomMat2DScale, 'nearest_neighbor')对图像仿射affine_trans_image()对XLD进行仿射affine_trans_xld()……
使用模板匹配
示例:check_blister.hdev
access_channel (ImageOrig, Image1, 1) 获取第一通道的图片
threshold (Image1, Region, 90, 255) 阈值化
shape_trans (Region, Blister, 'convex') 凸化
orientation_region (Blister, Phi) 测量偏移角度
area_center (Blister, Area1, Row, Column) 测量面积及中心点坐标
vector_angle_to_rigid (Row1, Column1, Phi, Row2, Column2, 0, HomMat2D) 获得图片绕(Row1,Column1)点旋转Phi后得到中心点为(Row2,Column2),偏移角度为0的图片所需要的仿射矩阵

affine_trans_image (ImageOrig, Image2, HomMat2D, 'constant', 'false') 将仿射矩阵应用于图片
车牌识别
1、借助助手快速识别
第一步:打开一张车牌图片read_image (Image, 'F:/Code/picTest/CarNumber/3.jpg')
第二步:转化为灰度图片 rgb1_to_gray (Image, GrayImage)
第三步:利用助手打开新的OCR
并根据OCR中第2点,点击任意一个绿笔头(一般选第一个,正矩形)绘制需要读取的区域,右击鼠标确定
第四步:在OCR中第3点输入你所希望读取的文本内容
第五步:勾选OCR中第4点第一项
第六步:应用快速设置
最后得到车牌识别号

2、Blob分析+mlp分类器实现
第一步:读取图片
第二步:灰度化
第三步:翻转图片亮度invert_image (GrayImage, ImageInvert)
第四步:对灰度图片阈值化threshold (GrayImage, Regions1, 96, 204)
第五步:Blob分析提取车牌号,这里见halcon学习笔记(二)实现相机物体抓取得到仅含有车牌号的区域,注意这里运用到了多个特征选择
connection (Regions1, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ['area','row'], 'and', [0,164.27], [2945.62,191.47])
select_shape (SelectedRegions, SelectedRegions1, ['area','ratio'], 'and', [0,0], [200,2.0846])
select_shape (SelectedRegions1, SelectedRegions2, ['area','ratio','column'], 'and', [0,1.5793,138.85], [200,2,500])
第六步:对区域进行排序sort_region (SelectedRegions2, SortedRegions, 'character', 'true', 'column')按照列对字母进行排序。
第七步:读取OCR分类器read_ocr_class_mlp ('Industrial_0-9A-Z_NoRej.omc', OCRHandle)这里需要注意的是要选'Industrial_0-9A-Z_NoRej.omc'字体,及数字0-9及字母A-Z,根据以后需求不同加以更改,每一个字体不同内容可以在OCR助手字体旁边的放大镜中看。
第八步:进行分类do_ocr_multi_class_mlp (SortedRegions, ImageInvert, OCRHandle, Class, Confidence)由于这是识别字是黑的,背景是白的。所以在第三步对图片进行了翻转。
最后得到分类结果
3、定位与区域分割
如果直接在RGB情况下阈值化效果不好,考虑颜色空间的转换,RGB转化为HSV
read_image (Image, 'F:/Code/picTest/CarNumber/4.jpg') 读取图片
decompose3 (Image, Red, Green, Blue) 分解RGB通道
trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, 'hsv') 转化为HSV三种类型的图片
threshold (Saturation, Regions, 0, 90) 对其中最明显的图片进行阈值分割
connection (Regions, ConnectedRegions) 打散
一定要保证车牌区域是完整的,如果断开了,要么调用unionl算子将其联合成一个区域,要么先膨胀将其接上!!!
如果车牌字符与边框相连,要么重新阈值化找到没有连接的阈值;要么开运算打断
select_shape (ConnectedRegions, SelectedRegions, ['area','row'], 'and', [4041.92,186], [11826.4,354.42]) 选择车牌的大致区域
fill_up (SelectedRegions, RegionFillUp) 填充孔洞
opening_rectangle1 (RegionFillUp, RegionOpening, 20, 30) 剔除矩形外多余元素(视情况而定)
opening_circle (RegionOpening4, RegionOpening4, 3.5) 剔除多余元素
shape_trans (RegionOpening4, RegionTrans, 'rectangle2') 将形状转换成矩形
orientation_region (RegionTrans, Phi) 得到区域的偏转角度
area_center (RegionTrans, Area, Row, Column) 计算区域面积和中心点坐标
vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D) 得到摆正图片的仿射矩阵
affine_trans_image (Image, ImageAffineTrans, HomMat2D, 'constant', 'false') 仿射矩阵应用于图片
affine_trans_region (RegionTrans, RegionAffineTrans, HomMat2D, 'nearest_neighbor') 仿射矩阵应用于区域
reduce_domain (ImageAffineTrans, RegionAffineTrans, ImageReduced) 从图片中截取该矩形区域
rgb1_to_gray (ImageReduced, GrayImage) 将截取的区域转化为灰度图片
……后续操作即前面提到的Blob分析得到车牌字符,最后分类器识别字符
显示
smallest_rectangle1 (RegionOpening2, Row1, Column1, Row2, Column2)
count_obj (RegionOpening2, Number)
for i := 1 to Number by 1
disp_message (WindowHandle, Class[i-1], 'image', Row2[i-1], Column1[i-1], 'green', 'false')
endfor