halcon-轴断面检测定位

前言

通常情况下轴检测时,通常会检测轴的各个阶段的长度。但是由于各种原因,在轴断面的区域现实不明显,无法正确提取,这时候需要根据轴断面的突出部分进行检测,但是由于部分轴的粗轴和细轴区域的宽度差距相当接近,所以就需要通过另外的处理,将轴的断面进行单独提取

1.halcon程序

* Image Acquisition 01: Code generated by Image Acquisition 01
list_files ('D:/2024Work/work/4.12断层检测', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1read_image (Image, ImageFiles[Index])*gen_rectangle1 (ROI_0, 707.927, 631.228, 1072.01, 1398.08)*gen_rectangle1 (ROI_0, 735.583, 1488.93, 1089.37, 2298.93)gen_rectangle1 (ROI_0, 761.136, 824.068, 1021.81, 1090.71)reduce_domain (Image, ROI_0, ImageReduced)*矫正图像binary_threshold (ImageReduced, Region, 'max_separability', 'dark', UsedThreshold)erosion_circle (Region, RegionErosion,1)smallest_rectangle2 (RegionErosion, Row, Column, Phi2, Length1, Length2)vector_angle_to_rigid (Row, Column, Phi2, Row, Column, 1.5707963, HomMat2D)affine_trans_image (ImageReduced, ImageAffineTrans, HomMat2D, 'constant', 'false')reduce_domain (ImageAffineTrans, ROI_0, ImageReduced2)*获取断面下半部分binary_threshold (ImageReduced2, Region2, 'smooth_histo', 'dark', UsedThreshold1)*将上下断面进行联合shape_trans (Region2, RegionTrans, 'convex')*取区域的最大内接矩形inner_rectangle1 (RegionTrans, Row1, Column1, Row2, Column2)*创建矩形区域。根据实际情况,可以对内接矩形的左右列坐标进行修改,使得较粗的部分可以较多*较细的部分尽可能的少gen_rectangle1 (Rectangle1, Row1, Column1-4, Row2, Column2-3)*求取差值,将轴区域与内接矩形区域求差值,可得粗轴外轮廓difference (Region2, Rectangle1, RegionDifference)*剔除细轴多余的区域opening_circle (RegionDifference, RegionOpening1, 1)connection (RegionOpening1, ConnectedRegions)select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 200.96, 10000)union1 (SelectedRegions, RegionUnion)*进行横向闭运算,将粗轴进行相连接。closing_rectangle1 (RegionUnion, RegionClosing, 1000000000, 1)opening_circle (RegionClosing, RegionOpening, 5)connection (RegionOpening, ConnectedRegions1)    select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 10833.3, 363400.6)shape_trans (SelectedRegions1, RegionTrans1, 'convex')*获取断面上半部分*做差值提取到断面上半部分,剔除多余的噪点difference (Region2, RegionTrans1, RegionDifference2)connection (RegionDifference2, ConnectedRegions3)   select_shape (ConnectedRegions3, SelectedRegions3, 'area', 'and', 5196.22, 500000)opening_circle (SelectedRegions3, RegionOpening2, 3.5)*上下部分*对上下部分进行膨胀取交集dilation_circle (RegionOpening2, RegionDilation2, 1)dilation_circle (RegionTrans1, RegionDilation3, 3)intersection (RegionDilation2, RegionDilation3, RegionIntersection1)*结果显示skeleton (RegionIntersection1, Skeleton)junctions_skeleton (Skeleton, EndPoints, JuncPoints)get_region_points (EndPoints, Rows1, Columns1)gen_cross_contour_xld (Cross, Rows1[0], Columns1[0], 50, 0)gen_cross_contour_xld (Cross1, Rows1[1], Columns1[1], 50, 0)dev_display (ImageAffineTrans)dev_display (Cross)dev_display (Cross1)stop ()
endfor

在这里插入图片描述

2.程序解析

2.1图像矫正

在进行检测前,需要将图像矫正在垂直状态,在几何图像中是最大内接矩形是不容易判断的,例如在圆中的最大内接矩形是无限个。所以halcon并没有提供带角度的最大内接矩形,只是提供了垂直角度下的最大内接矩形。所以,我们需要对图像进行矫正到垂直。

    *矫正图像binary_threshold (ImageReduced, Region, 'max_separability', 'dark', UsedThreshold)erosion_circle (Region, RegionErosion,1)smallest_rectangle2 (RegionErosion, Row, Column, Phi2, Length1, Length2)vector_angle_to_rigid (Row, Column, Phi2, Row, Column, 1.5707963, HomMat2D)affine_trans_image (ImageReduced, ImageAffineTrans, HomMat2D, 'constant', 'false')reduce_domain (ImageAffineTrans, ROI_0, ImageReduced2)

2.2获取断面粗轴部分

本文中以,断面的下半部分作为轴的粗轴部分。首先是将上下断面区域进行联合,取区域的内接矩形,做差值后,就可以提取出粗轴的部分。
在这里插入图片描述
在这里插入图片描述

*获取断面下半部分binary_threshold (ImageReduced2, Region2, 'smooth_histo', 'dark', UsedThreshold1)*将上下断面进行联合shape_trans (Region2, RegionTrans, 'convex')*取区域的最大内接矩形inner_rectangle1 (RegionTrans, Row1, Column1, Row2, Column2)*创建矩形区域。根据实际情况,可以对内接矩形的左右列坐标进行修改,使得较粗的部分可以较多*较细的部分尽可能的少gen_rectangle1 (Rectangle1, Row1, Column1-4, Row2, Column2-3)*求取差值,将轴区域与内接矩形区域求差值,可得粗轴外轮廓difference (Region2, Rectangle1, RegionDifference)*剔除细轴多余的区域opening_circle (RegionDifference, RegionOpening1, 1)connection (RegionOpening1, ConnectedRegions)select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 200.96, 10000)union1 (SelectedRegions, RegionUnion)*进行横向闭运算,将粗轴进行相连接。closing_rectangle1 (RegionUnion, RegionClosing, 1000000000, 1)opening_circle (RegionClosing, RegionOpening, 5)connection (RegionOpening, ConnectedRegions1)    select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 10833.3, 363400.6)shape_trans (SelectedRegions1, RegionTrans1, 'convex')

2.3获取断面细轴部分

将整个轴的区域减去粗轴的区域,获得的就是断面区域

    difference (Region2, RegionTrans1, RegionDifference2)connection (RegionDifference2, ConnectedRegions3)   select_shape (ConnectedRegions3, SelectedRegions3, 'area', 'and', 5196.22, 500000)opening_circle (SelectedRegions3, RegionOpening2, 3.5)

2.4获取断面并显示

对上下部分进行膨胀,膨胀后取交集,即可获取到断面区域的。可以根据实际情况条件膨胀的参数使得结果在所需要的位置

*上下部分*对上下部分进行膨胀取交集dilation_circle (RegionOpening2, RegionDilation2, 1)dilation_circle (RegionTrans1, RegionDilation3, 3)intersection (RegionDilation2, RegionDilation3, RegionIntersection1)*结果显示skeleton (RegionIntersection1, Skeleton)junctions_skeleton (Skeleton, EndPoints, JuncPoints)get_region_points (EndPoints, Rows1, Columns1)gen_cross_contour_xld (Cross, Rows1[0], Columns1[0], 50, 0)gen_cross_contour_xld (Cross1, Rows1[1], Columns1[1], 50, 0)dev_display (ImageAffineTrans)dev_display (Cross)dev_display (Cross1)

总结

断面检测的核心在于对区域的内接矩形和差值的运用。通过内接矩形剔除细轴的区域,在不断通过差值进行计算即可。

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

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

相关文章

windows SDK编程 --- 第一个程序

一、基础知识 1.Unicode 和 ANSI 在 Windows 编程中,Unicode 和 ANSI 是两种不同的字符编码方法,它们用于定义如何在计算机中表示和存储字符数据。 ANSI ANSI(American National Standards Institute)编码是一种基于单字节的字符…

使用阿里云试用Elasticsearch学习:4. 聚合——2

近似聚合 如果所有的数据都在一台机器上,那么生活会容易许多。 CS201 课上教的经典算法就足够应付这些问题。如果所有的数据都在一台机器上,那么也就不需要像 Elasticsearch 这样的分布式软件了。不过一旦我们开始分布式存储数据,就需要小心…

Vue的学习之旅-part6-循环的集中写法与ES6增强语法

Vue的学习之旅-循环的集中写法与ES6增强语法 vue中的几种循环写法for循环for in 循环 for(let i in data){}for of 循环 for(let item of data){}reduce() 遍历 reduce( function( preValue, item){} , 0 ) ES6增强写法 类似语法糖简写对象简写函数简写 动态组件中使用 <kee…

AI应用实战2:使用scikit-learn进行回归任务实战

代码仓库在gitlab&#xff0c;本博客对应于02文件夹。 1.问题分析 在此篇博客中我们来对回归任务进行实战演练&#xff0c;背景是直播带货平台的业绩预测。第一步&#xff0c;就是分析问题。 问题痛点&#xff1a; 在直播带货平台上&#xff0c;由于市场环境多变、用户行为复…

5 个让日常编码更简单的 Python 库

今天我们一起来研究一些非常有用的第三方模块&#xff0c;可以使得我们的日常编码变得更加简单方便 sh https://github.com/amoffat/sh 如果曾经在 Python 中使用过 subprocess 库&#xff0c;那么我们很有可能对它感到失望&#xff0c;它不是最直观的库&#xff0c;可能还有些…

ubuntu 更改 ssh 默认端口 22 以加固安全

出于加固安全考虑&#xff0c;一般公司会禁用 ssh 的 22 端口号&#xff0c;因此我们需要改为其他端口。 1、ssh 命令行登录 进入台式机&#xff0c;修改 /etc/ssh/sshd_config 文件中的 Port 配置行&#xff0c;将 22 改为 8022&#xff0c;保存修改后&#xff0c;重启 ssh 服…

【汇编】存储器

存储器 计算机存储器可分为内部存储器&#xff08;又称内存或主存&#xff09;和外部存储器&#xff0c;其中内存是CPU能直接寻址的储存空间&#xff0c;由半导体器件制成 存储单元的地址和内容 计算机存储信息的基本单位是一个二进制位&#xff0c;一位可存储一个二进制数&…

企业利器大曝光:CRM系统功能剖析

企业存在的根本目标是吸引并留住顾客。为了能够追踪顾客的信息以及与他们保持联系&#xff0c;不论企业规模大小&#xff0c;都长期使用了多种传统的手工方式。——彼得德鲁克 CRM系统的功能有哪些&#xff1f;如何做客户管理一直是企业管理中的热门话题&#xff0c;CRM&#…

[大模型]Qwen1.5-7B-Chat-GPTQ-Int4 部署环境

Qwen1.5-7B-Chat-GPTQ-Int4 部署环境 说明 Qwen1.5-72b 版本有BF16、INT8、INT4三个版本&#xff0c;三个版本性能接近。由于BF16版本需要144GB的显存&#xff0c;让普通用户忘却止步&#xff0c;而INT4版本只需要48GB即可推理&#xff0c;给普通用户本地化部署创造了机会。&…

C语言——数据在内存中的存储

引言 数据是程序运行的核心。当我们用C语言编写程序时&#xff0c;我们实际上是在操纵内存中的数据。这些数据在内存中是如何储存的&#xff0c;今天我们就来学习这些内容。 基本数据类型 1.整型 int: 基本整型&#xff0c;通常占用4个字节 short: 短整型&#xff0c;通常占用…

Gradle 在 Spring 中的使用-ApiHug准备-工具篇-006

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace ApiHug …

【arduino】控制N位数码管

以下以四位共阳极数码管为例&#xff1b; 本文所有说明均以注释的方式进行。 使用方法&#xff1a; #include "DigitalTube.h" //每位共阳极对应的引脚int digital[4] {8, 11, 12, 7};//参数分别为a f b g e c d dp digital(共阳极引脚数组) length(digital长度)D…

LRUCache原理及源码实现

目录 LRUCache简介&#xff1a; LRUCache的实现&#xff1a; LinkedHashMap方法实现&#xff1a; 自己实现链表&#xff1a; 前言&#xff1a; 有需要本文章源码的友友请前往&#xff1a;LRUCache源码 LRUCache简介&#xff1a; LRU是Least Recently Used的缩写&#xf…

ChatGPT-4 Turbo 今天开放啦!附如何查询GPT-4 是否为 Turbo

2024年4月12日&#xff0c;OpenAI在X上宣布GPT-4 Turbo开放了&#xff01;提高了写作、数学、逻辑推理和编码方面的能力。另外最重要的是&#xff0c;响应速度更快了&#xff01;&#xff01; ChatGPT4 Turbo 如何升级&#xff1f;解决国内无法升级GPT4 Turbo的问题&#xff0…

设计模式-代理模式(Proxy)

1. 概念 代理模式&#xff08;Proxy Pattern&#xff09;是程序设计中的一种结构型设计模式。它为一个对象提供一个代理对象&#xff0c;并由代理对象控制对该对象的访问。 2. 原理结构图 抽象角色&#xff08;Subject&#xff09;&#xff1a;这是一个接口或抽象类&#xff0…

ros2 launch gazebo_ros gazebo.launch.py无法启动

我的系统是ubuntu20.04&#xff0c;ros2的版本是humble&#xff0c;当运行gazebo仿真时&#xff0c;运行 ros2 launch gazebo_ros gazebo.launch.py命令&#xff0c;会出现以下问题&#xff1a; 此时&#xff0c;这个页面会卡死在第六行&#xff0c;gazebo也不会打开 但最后单…

哈希函数算法

概述 为了实现哈希集合这一数据结构&#xff0c;有以下几个关键问题需要解决&#xff1a; 哈希函数&#xff1a;能够将集合中任意可能的元素映射到一个固定范围的整数值&#xff0c;并将该元素存储到整数值对应的地址上。冲突处理&#xff1a;由于不同元素可能映射到相同的整…

C语言中局部变量和全局变量是否可以重名?为什么?

可以重名 在C语言中, 局部变量指的是定义在函数内的变量, 全局变量指的是定义在函数外的变量 他们在程序中的使用方法是不同的, 当重名时, 局部变量在其所在的作用域内具有更高的优先级, 会覆盖或者说隐藏同名的全局变量 具体来说: 局部变量的生命周期只在函数内部,如果出了…

【C++类和对象】构造函数与析构函数

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

Stacked Hourglass Networks for Human Pose Estimation 用于人体姿态估计的堆叠沙漏网络

Stacked Hourglass Networks for Human Pose Estimation 用于人体姿态估计的堆叠沙漏网络 这是一篇关于人体姿态估计的研究论文&#xff0c;标题为“Stacked Hourglass Networks for Human Pose Estimation”&#xff0c;作者是 Alejandro Newell, Kaiyu Yang, 和 Jia Deng&a…