在Halcon中如何将一段轮廓等分
在视觉算法的设计中,有时候会遇到将一段轮廓等分成N段的需求,而Halcon中对于这一需求是没有现成的算子支持的,这个时候就需要我们自己去设计来实现这一功能了。我的思路是这样的,轮廓是由一个个像素点或者亚像素点组成,首先得到轮廓的像素点集合,然后将这些点等分成几个集合,通过gen_contour_polygon_xld把等分好的点集合连接在一起即可。代码如下:
1 get_contour_xld (OneContour, Row, Col) 2 if(|Row| < Num) 3 return () 4 endif 5 gen_empty_obj (Bisection_Contour) 6 contourNum := |Row|/Num 7 for Index := 0 to Num - 1 by 1 8 beginPoint := Index * (contourNum) - 1 9 if (beginPoint < 0) 10 beginPoint := 0 11 endif 12 Rowx := Row[beginPoint : (Index + 1) * (contourNum) - 1] 13 Colx := Col[beginPoint: (Index + 1) * (contourNum) - 1] 14 gen_contour_polygon_xld (Contour,Rowx,Colx) 15 concat_obj (Bisection_Contour, Contour, Bisection_Contour) 16 endfor 17 return ()
以下为将一段圆形轮廓等分的实例代码
1 read_image (Circle, 'C:/Users/Niqiao/Desktop/circle.png') 2 edges_sub_pix (Circle, Edges, 'canny', 1, 20, 40) 3 bisection_contour (Edges, Bisection_Contour, 7)
以上为封装好的算法,我将其命名为:bisection_contour。但是需要注意的是,如果一段轮廓的点集数量不能将等分的段数Num整除时,因为在这里两个整型相除会出现精度的损失,从而造成了可能会出现这段轮廓的有几个像素点访问不到的情况。
v