Halcon学习笔记(五)几何定位+仿射+车牌识别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Thera_qing/article/details/96994252

定位

  • 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')  
  • 分解RGB通道
decompose3 (Image, Red, Green, Blue)  
  • 转化为HSV三种类型的图片
trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, '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
展开阅读全文

没有更多推荐了,返回首页