定位

  • 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