halcon-轴断面检测定位

news2025/5/24 12:12:13

前言

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

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 1
    read_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.coloradmin.cn/o/1593476.html

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

相关文章

Linux部署自动化运维平台Spug

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件…

C/C++基础----常量和基本数据类型

HelloWorld #include <iostream>using namespace std;int main() {// 打印cout << "Hello,World!" << endl;return 0; }c/c文件和关系 c和c是包含关系&#xff0c;c相当于是c的plus版本c的编译器也可以编译c语言c文件.cpp结尾.h为头文件.c为c语言…

C++中的STL——list类的基本使用

目录 list类介绍 list类定义 list类常见构造 list类的有效元素个数操作 size()函数 list遍历操作 list元素修改操作 assign()函数 push_front()函数 push_back()函数 pop_front()函数 pop_back()函数 insert()函数 erase()函数 swap()函数 resize()函数 clear…

Mac环境 llamafile 部署大语言模型LLM

文章目录 Github官网本地部署 llamafile 是一种可在你自己的电脑上运行的可执行大型语言模型&#xff08;LLM&#xff09;&#xff0c;它包含了给定的开放 LLM 的权重&#xff0c;以及运行该模型所需的一切。让人惊喜的是&#xff0c;你无需进行任何安装或配置。 Github https…

CSS3新增

一些CSS3新增的功能 课程视频链接 目录 CSS3概述私有前缀长度单位remvwvhvmaxvmin 颜色设置方式rgbahslhsla 选择器动态伪类目标伪类语言伪类UI伪类结构伪类否定伪类伪元素 盒子属性box-sizing问题插播 宽度与设置的不同 resizebox-shadowopacity 背景属性background-originb…

CCS在线调试时实时修改变量值

在使用CCS调试dsp芯片时&#xff0c;发现CCS软件有一个非常好的功能&#xff0c;在仿真调试的时候可以实时修改代码中变量的值。这个功能在调试switch语句的时候非常好用&#xff0c;比如想要执行哪个case语句&#xff0c;直接在仿真界面里面修改switch语句入口参数就行。   …

机器学习周记(第三十四周:文献阅读[GNet-LS])2024.4.8~2024.4.14

目录 摘要 ABSTRACT 1 论文信息 1.1 论文标题 1.2 论文摘要 1.3 论文模型 1.3.1 数据处理 1.3.2 GNet-LS 2 相关代码 摘要 本周阅读了一篇时间序列预测论文。论文模型为GNet-LS&#xff0c;主要包含四个模块&#xff1a;粒度划分模块&#xff08;GD&#xff09;&…

回归预测 | Matlab实现WOA-BP鲸鱼算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现WOA-BP鲸鱼算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现WOA-BP鲸鱼算法优化BP神经网络多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab实现WOA-BP鲸鱼算法优化BP神经网络多变量回归预测&#xff08;完整源码…

通过一篇文章让你了解Linux的重要性

Linux 前言一、什么是Linux后台vs前台为何大多数公司选择使用Linux作为后台服务器 二、Linux的背景介绍UNIX发展的历史Linux发展历史开源官网发行版本DebianUbuntu红帽企业级LinuxCentOSFedoraKali Linux 三、国内企业后台和用户使用Linux现状IT服务器Linux系统应用领域嵌入式L…

容器受到攻击时该如何应对,容器安全给你答案

容器是一个软件包&#xff0c;其中包含在任何操作系统和基础架构上运行所需的所有依赖项&#xff0c;包括代码、配置文件、库和系统工具。每个容器都包含一个运行时环境&#xff0c;使应用程序能够在各种计算环境之间迁移——例如&#xff0c;从物理机迁移到云。 容器提供了许…

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

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

书生·浦语2.0(InternLM2)大模型实战--Day03 LMDeploy量化部署 | LLMVLM实战

课程视频&#xff1a;https://www.bilibili.com/video/BV1tr421x75B/课程文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/lmdeploy/README.md课程作业&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/lmdeploy/homework.md平台&#xff1a;In…

记一次IP访问MySQL失败多次被自动锁定导致无法连接问题,解决方法一条SQL足以。

&#x1f469;&#x1f3fd;‍&#x1f4bb;个人主页&#xff1a;阿木木AEcru &#x1f525; 系列专栏&#xff1a;《Docker容器化部署系列》 《Java每日面筋》 &#x1f4b9;每一次技术突破&#xff0c;都是对自我能力的挑战和超越。 前言 今天下午还在带着耳机摸鱼&#xff…

Acrobat Pro DC 2021---PDF编辑与管理,打造高效PDF工作流程 含Mac+win

Acrobat Pro DC 2021包括全面的PDF编辑、OCR识别、多种输出格式转换以及强大的文件安全性保护。用户可轻松编辑、合并、转换PDF文件&#xff0c;同时支持将扫描文档转换为可编辑的PDF。可将PDF转换为Word、Excel、PowerPoint等格式&#xff0c;提高工作效率。 Mac电脑&#xf…

Java中volatile关键字

保证了不同线程对这个变量进行操作时的可见性&#xff0c;即一个线程修改了某个变量的值&#xff0c;这新值对其他线程来说是立即可见的,volatile关键字会强制将修改的值立即写入主存。 1.volatile的可见性 一个典型的例子&#xff1a;永不停止的循环。 public class Forever…

最前沿・量子退火建模方法(1) : subQUBO讲解和python实现

前言 量子退火机在小规模问题上的效果得到了有效验证&#xff0c;但是由于物理量子比特的大规模制备以及噪声的影响&#xff0c;还没有办法再大规模的场景下应用。 这时候就需要我们思考&#xff0c;如何通过软件的方法怎么样把大的问题分解成小的问题&#xff0c;以便通过现在…

LRUCache原理及源码实现

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

Pixel-GS:用于3D高斯溅射的具有像素感知梯度的密度控制

Pixel-GS: Density Control with Pixel-aware Gradient for 3D Gaussian Splatting Pixel-GS&#xff1a;用于3D高斯溅射的具有像素感知梯度的密度控制 Zheng Zhang  Wenbo Hu†  Yixing Lao   老宜兴市郑张文博胡 † Tong He  Hengshuang Zhao† 赵同和恒双 †1122113311 …

1.open3d处理点云数据的常见方法

1. 点云的读取、可视化、保存 在这里是读取的点云的pcd文件&#xff0c;代码如下&#xff1a; import open3d as o3dif __name__ __main__:#1.点云读取point o3d.io.read_point_cloud("E:\daima\huawei\img\change2.pcd")print(">",point)#2.点云可视…

SpringMVC(一)【入门】

前言 学完了大数据基本组件&#xff0c;SpringMVC 也得了解了解&#xff0c;为的是之后 SpringBoot 能够快速掌握。SpringMVC 可能在大数据工作中用的不多&#xff0c;但是 SSM 毕竟是现在就业必知必会的东西了。SpringBoot 在数仓开发可能会经常用到&#xff0c;所以不废话学吧…