几种取XLD轮廓的算子_一

提取XLD


拆分XLD 轮廓
segment_contours_xld


select_shape_xld


xld的长度
length_xld

*共同的一条直线
union_collinear_contours_xld
*共同的一个圆
union_cocircular_contours_xld

选择特征XLD轮廓
select_contours_xld


取XLD轮廓点坐标
get_contour_xld


 ** XLD转 region
 gen_region_contour_xld (ContoursUnion, Region, 'filled')

** region  转 XLD
gen_contour_region_xld (SelectedRegions, Contours, 'border')

**XLD轮廓取差集
difference_closed_contours_xld (Contour_zuo, CroppedContours1, ContoursDifference)

*** XLD轮廓取并集
union2_closed_contours_xld (ContoursDifference, ContOut, ContoursUnion)

拟合
fit_line_contour_xld
gen_contour_polygon_xld

** 截取XLD轮廓
crop_contours_xld

*两条线 求交点
intersection_lines


*点画成轮廓
gen_contour_polygon_xld

创建十字XLD轮廓
gen_cross_contour_xld


这个 XLD 的仿射变换
hom_mat2d_rotate
affine_trans_contour_xld


点到直线的距离
distance_pl

** 裁剪XLD轮廓
** 参数 trans_Contour 输入轮廓, CroppedContour 输出轮廓,
** 参数 Row1, Column1, Row2, Column2 裁剪区域的上下边界,
** 参数'true'是否闭合轮廓

crop_contours_xld(trans_Contour, CroppedContour, \
                  Row1, Column1, Row2, Column2, 'true')

**选择形状特征XLD轮廓
select_shape_xld(CroppedContour,SelectedXLD, 'contlength',\
                 'and',Max-1, Max+1)
** 注意第三个参数 ,如果是 ‘direction’  就可以选择近似垂直和水平的XLD轮廓

**点到线的投影
** 参数 RowBegin1, ColBegin1 输入点的行列坐标,
** 参数 RowBeginSP,0 起始点行列, RowEndSP,ColEndSP 终点行列
** 参数 RowProj1, ColProj1 投影点行列
projection_pl (RowBegin1, ColBegin1, RowBeginSP,0, \
               RowEndSP,ColEndSP, RowProj1, ColProj1)

*创建多边形XLD轮廓
gen_contour_polygon_xld (Line_width, [RowProj1,RowProj2], \
                         [ColProj1,ColProj2])

**创建十字XLD轮廓
gen_cross_contour_xld (Cross3,(RowBegin1+RowEnd1)/2,\
                       (ColBegin1+ColEnd1)/2, 1, 0.785398)

**点到直线的距离
** 参数 (RowBegin1+RowEnd1)/2, (ColBegin1+ColEnd1)/2 点坐标,
** 参数 RowProj1, ColProj1,RowProj2, ColProj2 线的起点和终点坐标
** 参数 Distance 点到直线的距离
distance_pl ((RowBegin1+RowEnd1)/2, (ColBegin1+ColEnd1)/2, \
             RowProj1, ColProj1,RowProj2, ColProj2, Distance)


area_center (Regions, Area, Row, Column)
****取区域轮廓长度
contlength (Regions, ContLength)



这个HALCON 的轮廓分割和连接

gen_rectangle2_contour_xld (Rectangle, 300, 200, 0, 100.5, 20.5)
get_contour_xld (Rectangle, Row, Col)
tuple_remove (Row, 4, Row)
tuple_remove (Col, 4, Col)
gen_contour_polygon_xld (Contour, Row, Col)
*将轮廓的两个端点连起来 不论连线是否与轮廓相交
close_contours_xld (Contour, ClosedContours)
***************例程segment_contours_xld ***************

read_image (Image, ‘pumpe’)
edges_sub_pix (Image, Edges, ‘canny’, 1.5, 15, 40)
*分割轮廓 分割为线 圆(弧) 椭圆(弧)
segment_contours_xld (Edges, ContoursSplit, ‘lines_circles’, 5, 4, 2)
select_contours_xld (ContoursSplit, SelectedContours, ‘contour_length’, 0.5, 200, -0.5, 0.5)
*按轮廓端点的距离 链接
union_adjacent_contours_xld (SelectedContours, UnionContours, 10, 1, ‘attr_keep’)
*链接同一直线上的轮廓
union_collinear_contours_xld (UnionContours, UnionContours1, 10, 1, 2, 0.1, ‘attr_keep’)
*链接同一圆周上的轮廓
union_cocircular_contours_xld (UnionContours1, UnionContours2, 0.5, 0.1, 0.2, 30, 10, 10, ‘true’, 1)

 edges_sub_pix 算子
几种取XLD轮廓的算子_一_第1张图片

  edges_sub_pix 算子
适合 边缘细节没那么复杂的
结合 median_image 算子,先模糊处理图像

这个地方 高低阈值,不宜设置过小,容易导致QT程序崩溃。

 

平滑系数(Alpha)   ---   输入元组(input_control)
(输入参数<<==)平滑滤波的参数。值越小,滤波效果越强,获得的边缘细节越少。对于'cnny',刚好相反,值越小,滤波效果越弱,获得的边缘效果越多。

低阀值(Low)   ---   输入元组(input_control)
(输入参数<<==)磁滞阀值操作的低阈值。

高阀值(High)   ---   输入元组(input_control)
(输入参数<<==)磁滞阀值操作的低阈值。

 gen_contour_region_xld

几种取XLD轮廓的算子_一_第2张图片

 

接下来取轮廓

如果使用 edges_sub_pix 算子,由于上面的图像非常的细碎

几种取XLD轮廓的算子_一_第3张图片

 所以用这种
    *将刻度区域的region变成contour
    ** 转换区域到XLD轮廓
    gen_contour_region_xld (SelectedRegions, Contours, 'border')

几种取XLD轮廓的算子_一_第4张图片

 比如 求这种 内部复杂,但是需要提取外部轮廓的。
先在 灰度图上(先做图像增强),把整体抠出来,。再使用这个算子
几种取XLD轮廓的算子_一_第5张图片

 几种取XLD轮廓的算子_一_第6张图片

 

你可能感兴趣的:(HALCON,计算机视觉)