Halcon轮廓的处理

news2024/9/28 17:23:57

Halcon轮廓的处理

文章目录

  • Halcon轮廓的处理
    • 1. 轮廓分割
    • 2. 轮廓的筛选
    • 3. 轮廓的连接
    • 4. 轮廓的拟合

输出了目标的轮廓后,接下来还需要对轮廓进行处理,这主要基于以下3个原因。
(1)对于某些测量任务而言,并不需要分析目标的整个轮廓,可能只需要局部的一段轮廓就够了。而有时由于 ROI(感兴趣区域)选择得过大,因此需要对提取的轮廓进行分割,以得到所需的部分。
(2)在提取轮廓或线条的过程中,可能会有一些杂点或背景区域被误认为是轮廓也被提取了出来,所以需要做一些剔除,以得到完全需要的区域。
(3)提取出的轮廓线条可能会有一些不连续,而某些检测中需要轮廓是闭合的,因此需要做一些连接或者填补。

1. 轮廓分割

首先要介绍的是轮廓分割,可以使用segment_contours_xId 算子将轮廓分割成线段、圆弧或着椭圆等预定义的形状,分割出的各个线段可以使用select_obj算子单独进行选择。
如果只需要分割成线段,则可以使用gen_polygons_xld算子和split_contours_xld算子的组合,这两步操作的结果类似于segment_contours_xld算子的功能。两种方式的区别主要在于对轮廓进行分割后的处理,使用两步组合法,将生成XLD多边形类型的轮廓。

2. 轮廓的筛选

对于轮廓处理来说,很重要的一步是抑制不相关的轮廓,可以使用select_shape_xld算子实现这一功能。该算子的功能非常强大,与select_shape算子类似,它使用一步操作就能提取输入区域的多种特征并进行筛选。该算子提供了30多种不同的形状特征,通过指定不同特征的阈值并结合多种特征进行评估,能非常灵活地提取出理想的轮廓部分。也可以选择select_contours_xld算子,它包含了更多线性结构的典型特征。如果需要用鼠标进行交互操作,如实时选择一些轮廓,可以使用select_xld_point算子,通过单击鼠标来选取轮廓。

3. 轮廓的连接

如果轮廓的线条是不连续的,那么断开的部分会被当成独立的部分,后续的处理过程会更加棘手。这时可以试着将断开的部分连接起来,使用union_collinear_contours_xld算子或者 union_straight_contours_xld算子,就可以实现这一功能。前者适用于共线的连接,后者适用于同方向的邻近轮廓。还可以选择 union_adjacent_contours_xld算子,它适用于端点邻近的情况。
Halcon 也提供了一个shape_trans_xld算子用于修改形状,把轮廓转换成包围的圆或者矩形等。还可以使用union2_closed_contours_xld等算子合并闭合轮廓。
下面以一个简单的例子进行说明。图(a)为输入的图像;图(b)为使用edges_sub_pix 算子提取出的亚像素边缘的图像,分别用不同的颜色显示;图(c)为使用 segment_contours_xld 算子对上一步的轮廓进行分割,并使用select_contours_xld算子选择较长的边缘得到的结果;图(d)为对相邻但不相连的边缘使用union_adjacent_contours_xld算子进行连接的效果。
在这里插入图片描述
实现代码如下:

dev_close_window ()
read_image (Image, 'data/shapes')
rgb1_to_gray (Image, GrayImage)
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width , Height, 'black', WindowHandle)
*提取出的亚像素边缘edge的图像,得到了一个初始的轮廓
edges_sub_pix (GrayImage, Edges, 'canny', 2.5, 15, 40)
*对上一步的轮廓进行分割
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 2)
*提取出轮廓中较长的部分线段
select_contours_xld (ContoursSplit, SelectedContours, 'contour_length', 20, Width / 2, -0.5, 0.5)
*对相邻的轮廓段进行连接
union_adjacent_contours_xld (SelectedContours, UnionContours, 20, 1, 'attr_keep')

本例中使用edges_sub_pix算子提取出亚像素边缘的图像,在得到了初始轮廓之后,使用segment_contours_xld算子对上一步的轮廓进行分割,这是为了测试后面的轮廓合并。由于分割轮廓后会得到许多小的线段,为了移除这些小线段,为后面测试轮廓合并留下空间,需要使用select_contours_xld 算子提取出轮廓中较长的部分线段。选择的特征是contour_length,也可以选择其他特征,如direction 表示方向,curvature表示曲率等。还可以根据线段两端的距离阈值选择closed或者open。
选择出符合条件的轮廓之后,再对相邻的轮廓段进行连接。因为这幅图中的非连续线段不存在共线或者方向相同,而只有端点比较邻近,所以这种情况就选择使用union_ adjacent_contours_xld算子。这里设置了一个判断值20,如果两个端点之间的距离小于该值,就可以将它们相连。连接的顺序是,距离短的优先连接。
后面的attrkeep 参数表示输出的轮廓保留之前的cdges sub_pix算子提取出的各种特征。如果要计算的轮廓比较多,而计算速度是一个比较重要的考量点,或者某些轮廓在合并后特征将发生改变,保留原来的特征将失去意义,那么这里也可以选择 attr_forget 参数,不对输出的轮廓复制它们原有的特征。

4. 轮廓的拟合

前面得到的轮廓有可能是不规则的,实际检测中可能需要将其进行拟合,以得到规则的轮廓,便于后续处理。Halcon 提供了几种不同形状的拟合算子,简要介绍如下。
(1)拟合直线使用fitline_contour_xld算子,该算子提供了多种拟合的方法,大部分都是用于抑制非相关轮廓线的。该算子会返回线段和线段两端的坐标。其配合gen_contour_polygon_xld算子可以查看直线的显示结果。
(2)拟合圆形使用fit_circle_contour_xld算子,其也有许多拟合方法可选,将返回圆的中心坐标和半径。可以使用gen_circle_contour_xld算子查看拟和结果。
(3)拟合矩形选择fitrectangle2_contour_xld算子,该算子返回的主要是矩形的中心坐标和边长,以及矩形的旋转角度。其配合gen_rectangle2_contour_xld算子可以显示拟合结果。
(4)拟合椭圆形可以用fit_ellipse_contour_xld算子,将返回椭圆的中心坐标、长轴和短轴的半径,以及椭圆的角度和方向特征。其搭配使用gen_ellipse_contour_xld算子,可以显示轮廓曲线。
举例说明,如图所示。图(a)为输入的图像,图(b)为经阈值处理后得到的区域图像。图(c)为生成的亚像素轮廓图。图(d)为使用fit_circle_contour_xld算子和gen_circle_contour xld算子进行轮廓拟合后得到的圆形轮廓图。
在这里插入图片描述
实现代码如下:

dev_close_window ()
*读取了图像并创建显示窗口
read_image (Image, 'data/flower')
rgb1_to_gray (Image, GrayImage)
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width , Height, 'black', WindowHandle)
dev_set_color ('white')
*对图像进行阈值处理
threshold (GrayImage, Region, 130, 255)
*使用闭运算进行填充
closing_circle (Region, Region, 20.5)
*获取前景目标的初始轮廓
gen_contour_region_xld (Region, Contour, 'border')
*拟合圆形轮廓
fit_circle_contour_xld (Contour, 'atukey', -1, 2, 0, 10, 1, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
*生成该拟合的圆形轮廓
gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, 4 * acos(0), 'positive', 1)

本例中先对图像进行阈值处理,提取出较亮的前景部分。由于提取出的较亮部分存在许多断开的部分和小的缝隙,因此使用闭运算进行填充,图(b)为闭运算后的结果;然后使用gen_contour_region_xld 算子获取前景目标的初始轮廓,即图(b)中白色部分的轮廓,结果显示在图(c)中;最后,使用fit_circle_contour_xld算子拟合圆形轮廓,得出圆形的特征参数,并用gen_circle_contour_xld算子生成该圆形轮廓。这样就实现了轮廓的拟合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1386888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ArkTS中自定义组件

ArkTS中自定义组件 一、组件位置二、Hello.ets自定义组件自定义组件 三、Second.ets父组件 一、组件位置 一个项目下所有的自定义的组件名不可以重复,无论是否在一个ets文件中 二、Hello.ets自定义组件 自定义组件 1:组件必须使用Component装饰 2&#…

最新智能AI系统ChatGPT网站程序源码+详细图文搭建部署教程,Midjourney绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

Spring Boot接口请求响应慢,超过10秒以上,如无法优化SQL或代码的情况下,建议写入数据库或缓存中,请求接口时从数据库或缓存中读取返回

举例 Override public Map<String, Object> getCockpitStaffAttendanceTask() {Map<String, Object> map new HashMap<>();int chuqin 0; //出勤int queqin 0; //缺勤int chidao 0; //迟到int zaotui 0; //早退//获取所有设备卡号 并且已经绑定了人Lis…

Redis之bigkey

目录 1、什么是bigkey&#xff1f; 2、bigkey大的小 3、bigkey有哪些危害&#xff1f; 4、bigkey如何产生&#xff1f; 5、bigkey如何发现&#xff1f; 6、bigkey如何删除&#xff1f; 7、BigKey调优&#xff0c;惰性释放lazyfree 8、生产上限制keys * /flushdb/flushal…

python爬虫之线程与多进程知识点记录

一、线程 1、概念 线程 在一个进程的内部&#xff0c;要同时干多件事&#xff0c;就需要同时运行多个“子任务”&#xff0c;我们把进程内的这些“子任务”叫做线程 是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。一条线程指…

统计学-R语言-4.1

文章目录 前言编写R函数图形的控制和布局par函数layout函数 练习 前言 安装完R软件之后就可以对其进行代码的编写了。 编写R函数 如果对数据分析有些特殊需要&#xff0c;已有的R包或函数不能满足&#xff0c;可以在R中编写自己的函数。函数的定义格式如下所示&#xff1a; …

DFT新手入门:VASPKIT生成模版INCAR

新手学习VASP计算时一般需要自行准备好VASP所需要的四个输入文件:INCAR POSCAR KPOINTS POTCAR。 其中POSCAR为计算任务的模型文件&#xff0c;POTCAR为与POSCAR中元素所对应的赝势&#xff0c;可根据要求选取。 KPOINTS的设置需要根据精度确定&#xff0c;一般通过vaspkit的1…

鸿蒙开发OpenHarmony组件复用案例

概述 在开发应用时&#xff0c;有些场景下的自定义组件具有相同的组件布局结构&#xff0c;仅有状态变量等承载数据的差异。这样的组件缓存起来&#xff0c;需要使用到该组件时直接复用&#xff0c; 减少重复创建和渲染的时间&#xff0c;从而提高应用页面的加载速度和响应速度…

Win10专业版系统搭建DNS解析服务

Win10专业版 纯新手&#xff0c;也没弄过Linux的。不喜勿喷&#xff0c;有问题请指出 第一天一头雾水整了几个小时没结果&#xff0c;第二天豁然开朗&#xff0c;10分钟明白了第一天的问题所在。 Win10 安卓&#xff1a; iOS&#xff1a; 搭建DNS服务器的意义&#xff1a; 屏蔽…

【Axure高保真原型】移入放大对应区域的饼图

今天和大家分享移入放大对应扇形区域的饼图的原型模板&#xff0c;鼠标移入时&#xff0c;对应扇形区域的会放大&#xff0c;并且的项目和数据弹窗&#xff0c;弹窗可以跟随鼠标移动。这个原型是用Axure原生元件制作的&#xff0c;所以不需要联网或者调用外部图表……具体效果可…

2024年烟花爆竹储存证考试题库及烟花爆竹储存试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年烟花爆竹储存证考试题库及烟花爆竹储存试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机…

多示例学习 (multi-instance learning, MIL) 学习路线 (归类、重点文章列举、持续更新)

文章目录 0 要点 0 要点 说明&#xff1a;本文在于能够让大家能够更加快速地了解MIL这个领域&#xff0c;因此将从以下几个方面重点介绍MIL&#xff1a; MIL背景介绍&#xff1b;理论MIL概述&#xff1a; 注意力网络&#xff1b;对比学习&#xff1b;介入学习&#xff1b;强化…

sylar高性能服务器-日志(P15-P20)内容记录

以下内容是sylar高性能服务器视频的简单记录&#xff0c;如果你在调试代码时遇到了困难那么下面内容会有帮助。 文章目录 p15&#xff1a;配置变更事件一、函数二、结果展示 p16&#xff1a;日志系统的整合1一、函数二、小结 p17-18&#xff1a;日志系统的整合2、3一、函数二、…

网络命令行工具nc的使用复习

之前写过nc的博文&#xff1b;下面复习一下&#xff1b; 可以把nc放到C:\Windows\System32下&#xff1b; nc -l -p 9007&#xff0c;-l 是监听模式&#xff0c;-p指定端口&#xff0c;作为服务端监听9007端口&#xff1b; nc 127.0.0.1 9007&#xff0c;作为客户端去连接指定…

基于算术电路的全同态加密方案介绍

基于算术电路的全同态加密方案介绍 摘 要&#xff1a; 云计算技术目前已经发展得相对成熟&#xff0c;应用也逐步得到普及&#xff0c;它所具有的强大的数据处理能力&#xff0c;能够帮助个体用户计算复杂的数据。但它带来便利的同时&#xff0c;也催生了一系列用户隐私数据保…

Vue2.组件通信

样式冲突 写在组件中的样式默认会全局生效。容易造成多个组件之间的样式冲突问题。 可以给组件加上scoped属性&#xff0c;让样式只作用于当前组件。 原理&#xff1a; 给当前组件模板的所有元素&#xff0c;加上一个自定义属性data-v-hash值&#xff0c;用以区分不同的组件。…

七大排序(含快排+归并的递归版和非递归版)

文章目录 前言一、冒泡排序二、选择排序三、插入排序四、希尔排序五、堆排序六、快速排序快排的递归方式快排的非递归方式 七、归并排序自上而下的递归自下而上的迭代 总结 前言 排序&#xff1a; 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的…

二分图带权最大匹配-KM算法详解

文章目录 零、前言一、红娘再牵线二、二分图带权最大完备匹配2.1二分图带权最大匹配2.2概念2.3KM算法2.3.1交错树2.3.2顶标2.3.3相等子图2.3.4算法原理2.3.5算法实现 三、OJ练习3.1奔小康赚大钱3.2Ants 零、前言 关于二分图&#xff1a;二分图及染色法判定-CSDN博客 关于二分…

Vue + JS + tauri 开发一个简单的PC端桌面应用程序

Vue JS tauri 开发一个简单的PC端桌面应用程序 文章目录 Vue JS tauri 开发一个简单的PC端桌面应用程序1. 环境准备1.1 安装 Microsoft Visual Studio C 生成工具[^2]1.2 安装 Rust[^3] 2. 使用 vite 打包工具创建一个 vue 应用2.1 使用Vite创建前端Vue项目2.2 更改Vite打包…

vue中使用高德地图渲染多个不同类型的点,根据勾选数据 类型不同打点显示隐藏

一、在index.html文件中引入高德地图JavaScript API的2.0版本SDK <script src"https://webapi.amap.com/maps?v2.0&key你的高德地图Key"></script>二、创建一个Vue组件&#xff0c;用于渲染地图和点位 html <template><div class"m…