1、白纸黑字直接识别
halcon中有字符识别的案例,是可以直接读取本地模型进行ocr识别的,需要注意的是模型的选择以及识别的条件。这里我直接精简一个简单的demo写在下边,代码可以直接调用,需要注意的事,这里的模型我选择的是数字’Industrial_0-9_NoRej.omc,一般在用的这么多情况下,Industrial_我感觉是最好用的,这里只用到数字,所以选择0_9。
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*读取图片
read_image (Image, '125.bmp')
*彩色转灰度图
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Region, 0, 100)
*连通域处理
connection (Region, ConnectedRegions)
*排序 按照列
sort_region (ConnectedRegions, SortedRegions, 'first_point', 'true', 'column')
*读取ocr模型 内置训练好的
read_ocr_class_mlp ('Industrial_0-9_NoRej.omc', OCRHandle)
*字符识别
do_ocr_multi_class_mlp (SortedRegions, GrayImage, OCRHandle, Class, Confidence)
*显示结果
disp_message (WindowHandle, Class, 'window', 12, 12, 'black', 'true')
在以上例子中需要注意几点,第一点就是halcon的这个ocr字符识别,他是针对区域而言的,也就是需要先进行阈值分割,有了区域,再配上图片,那就能够识别;第二点就是这个图片,很多同学在自己做的时候,发现识别错误,这种情况下往往是图片的问题,halcon中的训练是白纸黑字形成的,如果你的背景图是白色,字符是黑色,那用上边的直接去做自然没有问题,但是如果是黑纸白字,这个时候就会出现问题?遇到这种情况怎么办呢?我们可以自己将图片反置。
2、黑纸白字反置识别
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*读取图片
read_image (Image, '125_hei.bmp')
*彩色转灰度图
rgb1_to_gray (Image, GrayImage)
*加上图像取反
invert_image (GrayImage, GrayImage)
threshold (GrayImage, Region, 0, 100)
*连通域处理
connection (Region, ConnectedRegions)
*排序 按照列
sort_region (ConnectedRegions, SortedRegions, 'first_point', 'true', 'column')
*读取ocr模型 内置训练好的
read_ocr_class_mlp ('Industrial_0-9_NoRej.omc', OCRHandle)
*字符识别
do_ocr_multi_class_mlp (SortedRegions, GrayImage, OCRHandle, Class, Confidence)
*显示结果
disp_message (WindowHandle, Class, 'window', 12, 12, 'black', 'true')
除此之外,halcon有背景颜色的要求外,还要求字符是水平的,也就是如果你的字符是弯曲的情况下,也是会识别错误的,遇到这种情况,需要对背景图以及字符进行旋转。
3、非水平字符旋转识别
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*读取图片
read_image (Image, '125_affine.bmp')
*彩色转灰度图
rgb1_to_gray (Image, GrayImage)
*阈值分割
threshold (GrayImage, Region, 0, 100)
*获取整体外接矩形 角度
smallest_rectangle2 (Region, Row, Column, Phi, Length1, Length2)
*计算将该角度转到水平的旋转矩阵
vector_angle_to_rigid (Row, Column, -Phi, Row, Column, 0, HomMat2D)
*对图像执行旋转
affine_trans_image (GrayImage, ImageAffineTrans, HomMat2D, 'constant', 'false')
*对区域执行旋转
affine_trans_region (Region, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
*连通域处理
connection (RegionAffineTrans, ConnectedRegions)
*排序 按照列
sort_region (ConnectedRegions, SortedRegions, 'first_point', 'true', 'column')
*读取ocr模型 内置训练好的
read_ocr_class_mlp ('Industrial_0-9_NoRej.omc', OCRHandle)
*字符识别 这个地方替换成旋转后的奥ImageAffineTrans
do_ocr_multi_class_mlp (SortedRegions, ImageAffineTrans, OCRHandle, Class, Confidence)
*显示结果
disp_message (WindowHandle, Class, 'window', 12, 12, 'black', 'true')
4、总结
以上三种情况是在自己使用ocr的过程中常遇到的几种识别错误的原因,上边我是用的数字做的识别,至于英文是一样的,当使用英文的时候记得选用Industrial_A-Z+_NoRej.omc模型,当既有英文也有数字时候,选用Industrial_0-9A-Z_NoRej.omc模型。
需要注意的是,halcon内置的模型中,只有针对数字与英文的,至于汉字是没有内置模型的,需要自己训练,当然对于一些奇怪的数字与英文,也是需要自己训练的。训练并不麻烦,后边我会写一下如何训练。