halcon学习备忘五(图像选择,剪切,obj循环,ocr识别)

1、在分割完轮廓线或者其他一些线条后,我们需要进行一些筛选来获得我们想要的曲线,我们可以通过以下的算子来进行

(1).select_contours_xld( )  可以通过该算子设定筛选标准,比如根据线的长度contour_length或者曲率curvature来直接进行选择 。

(2).get_contour_global_attrib_xld( ) 通过该算子获得曲线的全局参数,例如曲率等,然后根据参数判断选择合适的曲线,如果想选择圆弧的话,可以将参数设置为‘cont_approx',然后用for循环进行遍历分割的每个曲线,不同形状的曲线该参数值不同,直线为-1,椭圆为0,圆为1 。

2、区域剪切与轮廓剪切

(1).clip_region_rel( ) 通过该算子可以对区域上下左右四边进行切割,比如都设置为5,那么每边上都去除5个像素,然后剩下的就是切割出来的区域了

(2).clip_contours_xld( ) 通过该算子设定的区域即row1-row2 , column1-column2 ,然后将区域内的轮廓剪切下来。

3、obj的循环判断

一个简单的例子就明白了

count_obj(obj,num)

get_empty_obj(final_obj)

for i:=1 to num by 1

select_obj(obj,selectedobj,i)

......相关处理

if(某个条件)

concat_obj(final_obj,selectedobj,final_obj)

endif

endfor

通过以上处理,就可以将满足一定条件的obj选出来,放到final_obj里面了。

4、MLP光学字符识别

(1)单字符识别用do_ocr_single_class_mlp( )

主要步骤如下:

a).图像分割,将字符区域从背景中分离出来,每个字符一个区域。

b).读取ocr的mlp分类器read_ocr_class_mlp(FontName , OCRHandle) ,FontName是已经存在的分类器名称,可以是'Industrial_0-9'或者'Industrial_0-9A-Z'也可以是自己训练好的分类器。

c).for循环读取每个字符区域,通过do_ocr_single_class_mlp( )进行每个字符识别,结果保存在Class里面,Confidence是可信度。可以用来做评估。

d).清除分类器clear_ocr_class_mlp(OCRHandle)

(2)多字符识别用do_ocr_multi_class_mlp( )

多字符识别的步骤和单字符识别步骤基本一样,不同的是具体识别算子分别用各自的,多字符识别的时候,将分割好的字符区域排好序后,直接将该区域集合作为输入,得到的识别结果全部保存在结果数组里面,无需for循环一个一个输入字符区域。

(3)区别与说明

一般情况下都会用多字符识别,因为它的速度要比运用for循环进行单字符识别的速度快。但是多字符识别只能给出每个字符的最可能识别结果,而单字符识别可以给出前n个可能的识别结果,每个结果都有一个可信度,按降序排列。即,如果需要用到前几个可能的结果时,那么就得用单字符识别了,否则都用多字符识别。对于分类器的训练,如果仅用到0-9和A-Z的字符识别的话,halcon以及提供训练好的分类器了,当然也可以自己训练分类器,然后保存训练好的分类器,下次用时直接读取就Ok了。例子可以参考halcon例程bottle.hdev、bottlet.hdev、engraved.hdev、engravedt.hdev。






你可能感兴趣的:(机器视觉,图像处理)