车牌识别-仿射变换
同样是车牌识别,此次的车牌识别,需要进行连续两次的仿射变化,才能成功识别。
代码如下:
* 读图像
read_image (Chepai2, 'E:/halcon实战/chepai2.jpg')
* rgb图像转灰度图像
rgb1_to_gray(Chepai2, GrayImage)
* 1. 此次blob分析,主要是获得一个区域,从而得到区域的角度
* 阈值处理
threshold (GrayImage, Regions, 217, 255)
* 计算连通域,得到联通域
connection(Regions, ConnectedRegions)
* 特征直方图,通过height、area、width特征筛选区域
select_shape (ConnectedRegions, SelectedRegions, ['height','area','width'], 'and', [66.69,0,25.52], [87.47,1004.62,55.33])
* 将所有区域连成一个区域
union1(SelectedRegions, RegionUnion)
* 将区域转成矩形区域
shape_trans(RegionUnion, RegionTrans, 'rectangle2')
* 获得联通区域的角度
orientation_region(RegionTrans, Phi)
* 获取区域的中心点和面积
area_center(RegionTrans, Area, Row, Column)
* 2. 进行仿射变换,将图像转正
* 获得进行仿射变换的矩阵
vector_angle_to_rigid(Row, Column, Phi, Row, Column, 0, HomMat2D1)
* 仿射变换
affine_trans_image(GrayImage, ImageAffinTrans, HomMat2D1, 'constant', 'false')
* 3. 此次Blob分析,主要是从转正后的区域获得一个区域,从而能得到文字的倾斜角度
* 再次进行阈值处理
threshold (ImageAffinTrans, Regions2, 202, 255)
* 计算联通域,得到联通域
connection(Regions2, ConnectedRegions2)
* 特征直方图,通过height、area、width特征筛选区域
select_shape (ConnectedRegions2, SelectedRegions2, ['height','area'], 'and', [61.07,473.44], [106.36,1374.13])
* 将区域联合成一个区域
union1(SelectedRegions2, RegionUnion1)
* 听过联合区域,得到文字的倾斜角度
text_line_slant(RegionUnion1, ImageAffinTrans, 75, -0.523599, 0.523599, SlantAngle)
* 4. 再次进行仿射变换,将图像转正
hom_mat2d_identity (HomMat2DIdentity)
hom_mat2d_slant (HomMat2DIdentity, -SlantAngle, 'x', 0, 0, HomMat2DSlant)
affine_trans_image(ImageAffinTrans, ImageAffinTrans1, HomMat2DSlant, 'constant', 'false')
* 5. 此次Blob分析,得到需要被识别的字符区域
* 阈值处理
threshold (ImageAffinTrans1, Regions3, 204, 253)
* 计算连通域,获得连通域
connection(Regions3, ConnectedRegions3)
* 特征直方图,通过height、area、width特征筛选区域
select_shape (ConnectedRegions3, SelectedRegions3, ['height','area','width'], 'and', [42.5,493.24,20.86], [81.06,938.56,80.61])
* 对区域按列排序
sort_region(SelectedRegions3, SortedRegions, 'character', 'true', 'column')
* 6. 进行字符识别
* 翻转图像,将背景和前景反转
invert_image(ImageAffinTrans1, ImageInvert2)
* 读分类器
read_ocr_class_mlp('Document_0-9A-Z_NoRej.omc',OCRHandle2)
* 进行字符识别
do_ocr_multi_class_mlp(SortedRegions, ImageInvert2, OCRHandle2, Class2, Confidence2)
* 释放分类器资源
clear_ocr_class_mlp(OCRHandle2)
以上代码,处理的是如下的车牌图片:
进行第一次仿射变换,将车牌图像进行第一次转正,得到如下图像:
我们可以看到,图像确实转正了。但是,在这个图像上,我们进行字符识别,会发现,无法正确的识别字符。
通过分析,通过将以上图像中的各个字符区域转成矩形区域,如下图所示:
我们可以看到,某一些字符的矩形区域之间是重叠的,同时,我们也可以看到,确实就是这些有重复的字符区域,在识别的时候,出现识别出错的现象。所以,我们需要将这个图像再次进行转正处理。
进行第二次仿射变换,将车牌图像进行第二次转正处理,得到如下图像:
再次对以上图像的字符区域,转成矩形区域,确认各个字符区域之间是佛还有重叠,如下图所示:
此时,各个字符之间没有重叠了。在这个图像的基础上进行字符识别,此时,已经可以正确的进行字符识别了,如下图所示:
更多halcon代码分析,见如下公众号:
qq_2253266237: 您好,请问您这些代码是halcon的自带例程 还是您自己的分享
eason603: 您好,將式(3)平方的話,如果pz是負的是不是負號就被強制給消了,這個問題怎麼解決
eason603: 您好,在求角3時將含有pz的參數給平方了,這樣pz如果為負是不是無法判斷?
远方青木: 机器人正逆解那块完全跟matlab里对不上啊
果冻不冻: 我认为作者的是对的,两个式子的第一项,三角函数的角度应该是θ2+θ3