首页 > 其他分享 >Halcon教程:多方法提取轮廓坐标

Halcon教程:多方法提取轮廓坐标

时间:2024-11-12 18:18:46浏览次数:3  
标签:教程 提取 xld 分割 Halcon 获取 坐标 轮廓

欢迎来到广州研为官方频道!我们将在频道中不断更新运动控制案例讲解、小型项目代码讲解、运动控制知识科普、机器视觉知识科普等内容,只为与您一起交流分享运动控制的那些事。


目录

1 轮廓加工 Contour Processing

2 edges_sub_pix提取图像轮廓

3 轮廓获取轮廓坐标

3.1获取轮廓所有坐标点

3.2分割轮廓并获取坐标点

4 轮廓坐标的排列顺序

5 示例参考


        在使用设备对物体进行轮廓加工时,如何使用视觉进行辅助加工:视觉提取物体轮廓后该如何将轮廓变成一系列带有方向的坐标点并传输至设备。

        本文将从如何提取轮廓到如何对轮廓坐标进行提取进行介绍,每一步操作都会展示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

相关文章

  • nvm-windows 安装教程
    1卸载本地node.js2安装NVM2.1下载GitHub:https://github.com/coreybutler/nvm-windows版本列表:https://github.com/coreybutler/nvm-windows/tags2.2安装1、选择安装目录2、选择nodejs安装目录3、检查是否安装完成4、检查环境变量2.3配置路径和下载源#编辑......
  • 2024最新版漏洞挖掘教程,零基础入门到精通, 收藏这篇就够了_网络安全挖洞全流程保姆级
    经常有小伙伴问我。为什么自己总是挖不到漏洞呢?渗透到底是什么样的流程呢?所以全网最详细的渗透测试流程来了!!!全篇文章内容较长,请耐心观看!渗透测试渗透测试其实就是通过一些手段来找到网站,APP,网络服务,软件,服务器等网络设备和应用的漏洞,告诉管理员有哪些漏洞,怎么......
  • Git最新最新详细教程、安装(从入门到精通!!!!企业级实战!!!工作必备!!!结合IDEA、Github、Gitee实
    可以不用看第4章Git客户端便捷操作,第5章GitLab的部署与使用!!!!初学者第1章Git概述Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。Git易于学习,占地面积小,性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能......
  • 【大模型】HuggingFace模型转一键llamafile包完整教程,通义千问成功案例分享
    随着通义千问开源版的发布,越来越多的用户希望能在本地部署这款优秀的中文大模型。然而,传统的部署方式往往需要复杂的环境配置,让很多非技术背景的用户望而却步。今天,我要向大家介绍一个革命性的方案:将通义千问转换为Llamafile格式,实现真正的一键运行!有关llamafile的特点,我......
  • wxWidgets GUI设计教程 - 数据处理与表单
    wxWidgetsGUI设计教程-数据处理与表单目标本教程将详细介绍在wxWidgets中实现数据处理和表单管理的方法。通过学习如何在GUI应用中创建和管理表单,可以实现用户数据的录入、校验与展示,从而构建功能丰富的交互界面。本教程将从简单的表单布局开始,逐步深入数据校验、数据......
  • 软件著作权申请教程(超详细)(2024新版)软著申请
                    目录一、注册账号与实名登记二、材料准备三、申请步骤1.办理身份2.软件申请信息3.软件开发信息4.软件功能与特点5.填报完成一、注册账号与实名登记    首先我们需要在官网里面注册一个账号,并且完成实名认证,一般是注册【个......
  • 这可能是最好的Spring教程!即便无基础也能看懂的入门Spring,仍在持续更新。
    开启这样一个系列的原因    这一段时间都在学spring,但是在学习的过程中一直都很难找到一个通俗易懂,又带了学习体系的文章教程,很多地方都不懂,需要自己去慢慢查询和理解,感觉学起来很耗时,所以我自己就像写一个这样能通俗易懂的Spring入门,让其他想我一样的小白也能速通入门。 ......
  • 【教程】第四章:任务与评论插件 —— 如虎添翼,顺利掌握
    回顾上一节小伙伴们还记得上一节的挑战任务吗?我们要为任务表配置状态和附件字段,并在任务列表里展示它们。别急,咱们先揭晓答案!状态字段的配置:选择下拉菜单(单选)字段,填写选项标签:未开始、进行中、待审核、已完成、已取消、已归档。颜色根据你的喜好自由设置,给任务增添一点......
  • 使用halcon完成一维码、二维码的识别
    图片素材 通过网盘分享的文件:图片5链接:https://pan.baidu.com/s/1r9SG4lZ3ZQ5S-NGVsFx70w?pwd=BFDJ提取码:BFDJ读码一维码创建读码句柄create_bar_code_model([],[],BarCodeHandle)参数一:输入通用参数可以调整条形码模型的名称。参数二:通用参数可以调整条形码......
  • Python小白学习教程从入门到入坑------第二十九课 访问模式(语法进阶)
    目录一、访问模式1.1 r1.2 w1.3 + 1.3.1r+1.3.2w+1.3.3a+1.4a一、访问模式模式可做操作若文件不存在是否覆盖r只能读报错-r+可读可写报错是w只能写创建是w+可读可写创建是a只能写创建否,追加写a+可读可写创建否,追加写1.1 rr:只读模式(默认模式),文件......