Halcon程序及其讲解。 个人学习笔记 read_image (Image, ‘D:/shijue/学习笔记/OCR识别/OCR环形字符识别.png’) rgb1_to_gray (Image, GrayImage) threshold (GrayImage, Regions, 0, 222) shape_trans (Regions, RegionTrans, ‘outer_circle’) *外接圆 complement (Regions, RegionComplement) *补集 connection (RegionComplement, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 0, 186779) smallest_circle (Regions, Row, Column, Radius) smallest_circle (SelectedRegions, Row1, Column1, Radius1) *极坐标转化拉直 polar_trans_image_ext (GrayImage, PolarTransImage,Row, Column, rad(60),rad(420), Radius-50,Radius1+20, 1440, 100, ‘bilinear’) mirror_image (PolarTransImage, ImageMirror1, ‘column’) invert_image (ImageMirror1, ImageInvert) scale_image (ImageInvert, ImageScaled, 7.08333, -1502) binary_threshold (ImageScaled, Region, ‘max_separability’, ‘light’, UsedThreshold) connection (Region, ConnectedRegions1) dilation_rectangle1 (ConnectedRegions1, RegionDilation, 5, 5) union1 (RegionDilation, RegionUnion) connection (RegionUnion, ConnectedRegions2) select_shape (ConnectedRegions2, SelectedRegions1, ‘area’, ‘and’, 466.35, 2000) intersection (SelectedRegions1, Region, RegionIntersection) sort_region (RegionIntersection, SortedRegions, ‘character’, ‘true’, ‘row’) read_ocr_class_mlp (‘Industrial_0-9A-Z_NoRej.omc’, OCRHandle) do_ocr_multi_class_mlp (SortedRegions, ImageMirror1, OCRHandle, Class, Confidence) smallest_rectangle1 (SortedRegions, Row1, Column1, Row2, Column2) dev_display (ImageMirror1) dev_get_window (WindowHandle) disp_message (WindowHandle, Class,‘ImageMirror1’, Row1, Column1, ‘green’, ‘false’) stop () 实现效果
单步具体讲解: read_image (Image, ‘D:/shijue/学习笔记/OCR识别/OCR环形字符识别.png’) //读图 rgb1_to_gray (Image, GrayImage) //rgb转灰度图。 threshold (GrayImage, Regions, 0, 222) //灰度阀值提取,选择圆圈部分。
shape_trans (Regions, RegionTrans, ‘outer_circle’) //将内部区域进行填充,用于求取最大圆的半径和圆心坐标 complement (Regions, RegionComplement) //对灰度阀值后的图像进行取补集 connection (RegionComplement, ConnectedRegions) //断开 select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 0, 186779) //选择最小的圆,用于求内圈圆的半径和圆心
smallest_circle (Regions, Row, Column, Radius) //求取最大圆的圆心和半径 smallest_circle (SelectedRegions, Row1, Column1, Radius1) //求取最小圆的圆心和半径 *极坐标转化拉直 polar_trans_image_ext (GrayImage, PolarTransImage,Row, Column, rad(60),rad(420), Radius-50,Radius1+20, 1440, 100, ‘bilinear’) //将圆形图像进行极坐标转化。GrayImage:输入的图像。PolarTransImage:输出的图像。Column:最大圆。rad(60):开始点【由于从0度开始,字符段出现断开的现象,所以可以自由选取开始点】。rad(420):结束点【如果我们只需要获取一部分的字符段,则可以控制终止点进行提取】。Radius-50:为最大直径-50像素的区域。Radius1+20:为最小直径+20的区域。【目的是去除除了所需要字符的多余部分】。1440:图像拉直后存放的窗口的长度。100:图像拉直后存放图像窗口的宽度。‘bilinear’:双线性转化。 mirror_image (PolarTransImage, ImageMirror1, ‘column’) //极坐标转化的图像为逆时针,所以拉直后进行横向镜像翻转。
invert_image (ImageMirror1, ImageInvert) //灰度转化,将暗的部分变亮,将亮的部分变暗。方便后面提取字符 scale_image (ImageInvert, ImageScaled, 7.08333, -1502) //灰度直方图缩放提取,直接提取字符部分,有噪声不影响 binary_threshold (ImageScaled, Region, ‘max_separability’, ‘light’, UsedThreshold) //快速二值化去除噪声 connection (Region, ConnectedRegions1) //断开 dilation_rectangle1 (ConnectedRegions1, RegionDilation, 5, 5) //膨胀形成的样子应该可以看清楚单个字符没有断开的地方
union1 (RegionDilation, RegionUnion) //形成一个连通域 connection (RegionUnion, ConnectedRegions2) //在断开 select_shape (ConnectedRegions2, SelectedRegions1, ‘area’, ‘and’, 466.35, 2000) //特征选择,去除不需要的部分。一定需要保证单个字符为一个连通域即可
intersection (SelectedRegions1, Region, RegionIntersection) //取交集。对单个连通域与拉直二值化翻转后的图像进行取交集
sort_region (RegionIntersection, SortedRegions, ‘character’, ‘true’, ‘row’) //排序 read_ocr_class_mlp (‘Industrial_0-9A-Z_NoRej.omc’, OCRHandle) //读取分类器。工业字体。由于halcon的自带分类器没有&这个字符,所以在没有特殊必须需要的情况,可以跳过&的识别,如果需要,则可以复制一份分类器,自己在原有的基础上使用OCR助手进行添加符号 do_ocr_multi_class_mlp (SortedRegions, ImageMirror1, OCRHandle, Class, Confidence) //分类器识别 //显示部分 smallest_rectangle1 (SortedRegions, Row1, Column1, Row2, Column2) dev_display (ImageMirror1) dev_get_window (WindowHandle) disp_message (WindowHandle, Class,‘ImageMirror1’, Row1, Column1, ‘green’, ‘false’) stop ()
总结:对于环形字符而言,OCR识别和其他状态的字符一样,第一摆正字符。对于环形字符来说,先获取到最大圆,在获取到最小圆,然后对这个区域进行拉直,然后剩下和其他OCR识别的套路是一样的。在遇到特
|