欢迎来到广州研为官方频道!我们将在频道中不断更新运动控制案例讲解、小型项目代码讲解、运动控制知识科普、机器视觉知识科普等内容,只为与您一起交流分享运动控制的那些事。
目录
在使用设备对物体进行轮廓加工时,如何使用视觉进行辅助加工:视觉提取物体轮廓后该如何将轮廓变成一系列带有方向的坐标点并传输至设备。
本文将从如何提取轮廓到如何对轮廓坐标进行提取进行介绍,每一步操作都会展示Halcon代码(使用Halcon示例图片,所有人都能使用)
视觉辅助轮廓加工示例可参考:运动控制与机器视觉融合案例介绍:轮廓提取与运动
@广州研为发布
1 轮廓加工 Contour Processing
轮廓加工适用于高精度轮廓测量与加工,适用于物体存在以下特征
- 物体特征不由均匀的区域表达
- 物体特征(边缘)有清晰的灰度值或颜色的过渡
- 没有封闭轮廓边界的
2 edges_sub_pix提取图像轮廓
使用亚像素精度的提取轮廓方法提取轮廓比像素精度提取轮廓,更能够还原图像中物体的轮廓细节,带来的好处就是测量将更加精准。edges_sub_pix的参数如下
edges_sub_pix(Image, Edges, Filter, Alpha, Low, High)
Image:需要提取轮廓的图像
Edges:计算所得轮廓(输出)
Fileter:计算图像边缘时所采用的滤波
Alpha: 滤波参数
Low: 低阈值
Hight: 高阈值
函数通过不同的滤波FIlter以及滤波参数Alpha计算边缘将获得不同的边缘,此处以Canny滤波作为例子介绍edges_sub_pix,关于其余滤波的操作可前往Halcon使用手册查看。
使用类似迟滞阈值算法提取图像亚像素边缘。
- 低阈值Low/ LThread: 当像素幅值低于低阈值时, 该位置不产生边缘
- 高阈值Hight/ HThread: 当像素幅值高于高阈值时, 边缘将被保留
- 介于低阈值与高阈值间的点, 若与高阈值点相接则视该点为边缘
像素幅值:可以简单理解为该部分像素值变化的剧烈程度, 边缘的幅值普遍大于纯色背景的幅值。
3 轮廓获取轮廓坐标
获取轮廓坐标的方式有很多,每一种方法都有各自的优劣,在使用上可根据实际需求进行选择或组合。
3.1获取轮廓所有坐标点
在获取轮廓坐标点时,一般的想法是直接获取轮廓所有坐标点并进行输出,我们先初步列举出这种方法的优缺点:
- 轮廓坐标密度高,坐标轨迹还原轮廓的程度高
- 对于大面积的轮廓坐标数量过于庞大,大部分坐标点是可优化的
- 无法选择轮廓中的某一段进行处理
在初步了解优缺点之后,我们可以通过实际演示进一步理解这些优缺点所带来的情况:
*获取轮廓所有坐标
*图像是Halcon示例图像,可根据自身情况选择对应路径下的相同图片进行尝试
dev_close_window ()
read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-17.12-Progress/examples/images/metal-parts/metal-part-model-03.png')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
dev_set_colored (12)
*获取图像轮廓
edges_sub_pix (Image, Edges, 'canny', 1, 20, 40)
count_obj (Edges, Number)
for Index := 1 to Number by 1
*获取指定轮廓
select_obj (Edges, ObjectSelected, Index)
*获取轮廓所有的坐标点
get_contour_xld (ObjectSelected, Row, Col)
*显示坐标点
disp_cross (WindowHandle, Row, Col, 6, 3)
stop()
endfor
程序处理后获取坐标的效果如下图所示,该轮廓像素面积:6813,坐标点数量:444
从提取的坐标点以及结合轮廓加工的经验来看,对于轮廓规则的物体坐标点数量偏多的,并且可以发现该轮廓的部分坐标点是意义不大的:在直线段部分可被优化的坐标点非常多,在规则的圆弧段部分也存在非常多可优化的坐标点。
可以得知,提取所有坐标点的方法对于规则轮廓的物体是比较不实用的,并且这种方法并不能指定轮廓中某一线段进行加工。
3.2分割轮廓并获取坐标点
使用函数对轮廓进行有选择性的分割,针对不同属性的线段指定不一样的坐标点提取操作。使用函数segment_contours_xld进行操作
segment_contours_xld(Contours,ContoursSplit,Mode,SmoothCont,MaxLineDist1, MaxLineDist2)
Counours:输入轮廓
ContourSpllit:分割后轮廓(输出)
Mode:分割模式:直线段;直线段+圆弧;直线段+椭圆弧
SmoothCount:轮廓平滑参数
MaxLineDist1:轮廓与近似线最大间距1
MaxLineDist2:轮廓与近似线最大间距2
函数的分割原理与Ramer算法相近,设置最大距离的方式判断当前线段是否需要分割,轮廓分割流程这里只做简要介绍,流程如下图所示。
通过分割轮廓的方式获取坐标点,我们可以对轮廓做进一步操作,简单的操作代码如下所示:
- 选取目标轮廓段
- 针对不同类型线段输出密度不同的坐标:直线段输出更少的坐标,圆弧输出完整坐标
dev_close_window ()
read_image (Image, 'C:/Users/Public/Documents/MVTec/HALCON-17.12-Progress/examples/images/metal-parts/metal-part-model-03.png')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
dev_set_colored (12)
edges_sub_pix (Image, Edges, 'canny', 1, 20, 40)
count_obj (Edges, Number)
for Index := 1 to Number by 1
select_obj (Edges, ObjectSelected, Index)
dev_display (ObjectSelected)
*轮廓分割,以直线段与圆弧为基础轮廓分割轮廓
segment_contours_xld (ObjectSelected, ContoursSplit, 'lines_circles', 3, 4, 2)
count_obj (ContoursSplit, Number1)
for Index1 := 1 to Number1 by 1
select_obj (ContoursSplit, ObjectSelected1, Index1)
*获取线段的属性:线段可以是直线段,椭圆弧,圆弧
get_contour_global_attrib_xld (ObjectSelected1, 'cont_approx', Attrib)
*属性Attrib = -1_直线段 0_椭圆弧 1_圆弧
if(Attrib == -1)
*在直线段中
*直线段减少坐标点输出,再次使用分割而不是输出轮廓所有坐标点
segment_contours_xld (ObjectSelected1, ContoursSplit1, 'lines', 3, 1, 0.1)
*通过分割轮廓获取线段中心点的方式简化坐标点数量
area_center_points_xld (ContoursSplit1, Area1, Row3, Column2)
*显示直线段所有坐标点
gen_cross_contour_xld (Cross1, Row3, Column2, 12, 3)
elseif(Attrib == 1)
*在圆弧段中
*针对圆弧进行坐标点密化,即获取所有坐标点
*获取圆弧坐标点
get_contour_xld (ObjectSelected1, Row2, Col1)
*获取轮廓点数量
contour_point_num_xld (ObjectSelected1, Length1)
*显示圆弧所有坐标点
gen_cross_contour_xld (Cross1, Row2, Col1, 3, 0)
endif
endfor
endfor
分割结果如下如所示,虽然轮廓的可操作性变强了,但可以通过结果发现缺点:对于分割后线段的属性是直线段,圆弧,椭圆弧无法干预。当认为线段出现错误的属性时只能通过调整分割参数将分割线段长度减短,通过这种方法加强线段属性判断的准确度。
4 轮廓坐标的排列顺序
有了文章前面的讲解,这部分内容十分简单,对于轮廓坐标的输出方向我们可以使用函数area_center_xld进行查看。通过参数PointOrder,我们可以在输出坐标点前查看轮廓坐标的排列顺序。
area_center_xld(XLD,Area,Row,Column,PointOrder)
XLD:输入轮廓
Area:轮廓面积
Row,Column:轮廓中心坐标
PointOrder:轮廓坐标排列顺序,positive -- 逆时针 negative -- 顺时针
5 示例参考
视觉辅助轮廓加工示例可参考:运动控制与机器视觉融合案例介绍:轮廓提取与运动
总结:
本文中介绍了在使用设备对物体进行轮廓加工时,如何使用视觉进行辅助加工:视觉提取物体轮廓后该如何将轮廓变成一系列带有方向的坐标点并传输至设备。
至此文章就以接近尾声,十分感谢大家观看,如果大家觉得文章有帮助不妨点赞收藏,你们的关注既是对我们最大的鼓励!
如果需要对机器视觉应用进行快速开发的同学,可以试着使用我们的编程平台通过选择模块“获取轮廓坐标”对代码一键生成,查看轮廓分割并排序的完整处理流程。
标签:教程,提取,xld,分割,Halcon,获取,坐标,轮廓 From: https://blog.csdn.net/gzyanwei/article/details/143639933