halcon中的一维测量

一维测量

像点到点的距离,边缘对的距离等沿着一维方向的测量都属于1D测量范畴。Halocn的一维测量首先构建矩形或者扇形的ROI测量对象,然后在ROI内画出等距离的、长度与ROI宽度一致的、垂直于ROI的轮廓线(profile line)的等距线。如下图所示。
在这里插入图片描述
测量ROI的轮廓线尽量与被测边缘垂直,宽度适当宽些,等距线的密集度考虑速度与精度综合选择,这样可以减少噪声。

然后,沿着垂直轮廓线的方向,计算出每一条等距线的平均灰度值,可以得出轮廓线的灰度直方图,同时可以选择使用高斯滤波器平滑灰度直方图。如下图所示。Halcon算子measure_pairs的参数Sigma指定了高斯滤波器的标准差。
在这里插入图片描述
最后,求出平滑灰度直方图的一阶导数,一阶导数的极值点作为边缘的亚像素精度候选点,只有一阶导数极值点的绝对值大于预先设定的阈值(测量算子的参数Threshold)边缘候选点才被选作为边缘中心点。Halcon测量算子最后得到每一条边缘与轮廓线的交点。
在这里插入图片描述

一维测量流程

在这里插入图片描述

一维测量相关算子

gen_measure_rectangle2( : : Row, Column, Phi, Length1, Length2, Width, Height, Interpolation : MeasureHandle)
名字:生成仿射矩形区域测量句柄
描述:用于提取垂直于仿射矩形的直边
参数:
Row:仿射矩形中心行坐标
Column:仿射矩形中心列坐标
Phi:仿射矩形的纵轴水平角,单位弧度 ,注意:测量矩形的测量方向的选择
Length1:仿射矩形宽度的一半
Length2:仿射矩形高度的一半
Width:图像的宽度
Height:图像的高度
Interpolation :插值类型
MeasureHandle:测量对象句柄
在这里插入图片描述
gen_measure_arc( : : CenterRow, CenterCol, Radius, AngleStart, AngleExtent, AnnulusRadius, Width, Height, Interpolation : MeasureHandle)
名字:生成环形区域测量句柄
描述:用于提取垂直环形圆弧的直边缘。
参数:
CenterRow:圆弧中心行坐标
CenterCol:圆弧中心列坐标
Radius:圆弧半径
AngleStart:圆弧起始角度
AngleExtent:圆弧角度范围
AnnulusRadius:环形带的半径(宽度的一半)
Width:图像的宽度
Height:图像的高度
Interpolation :插值类型
MeasureHandle:测量对象句柄
在这里插入图片描述
measure_pairs(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
名字:测量边缘对
描述:提取垂直于仿射矩形或环形圆弧的直边缘对。
参数:
Image:输入图像
MeasureHandle:测量对象句柄
Sigma:高斯平滑参数
Threshold:最小边缘幅度
Transition:边缘对极性,第一个与第二个相反
Select :选择边缘对
RowEdgeFirst:边缘点对的第一个边缘的行坐标
ColumnEdgeFirst:边缘点对的第一个边缘的列坐标
AmplitudeFirst:第一个边缘的幅度
RowEdgeSecond:第二个边缘行坐标
ColumnEdgeSecond:第二个边缘列坐标
AmplitudeSecond:第二个边缘幅度
IntraDistance:两个边缘对之间的距离
InterDistance:相邻边缘对之间的距离

注意:halcon中的坐标系与opencv中不一样
halcon坐标系如下图所示
在这里插入图片描述
opencv的坐标系如下
在这里插入图片描述
因此需要注意RowEdgeFirst返回的是y轴。

measure_pos(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdge, ColumnEdge, Amplitude, Distance)
名字:测量边缘对
描述:提取垂直于仿射矩形或圆弧的直边缘。
参数:
Image:输入图像
MeasureHandle:测量对象句柄
Sigma:高斯平滑系数
Threshold:最小边缘幅度
Transition:极性
*Select:边缘选择
RowEdge:找到的边缘中心的行坐标
ColumnEdge:找到的边缘中心列坐标
Amplitude:边缘幅度
Distance:相邻边缘之间的距离

measure_pairs与measure_pos的区别:一般,measure_pos函数会寻找所有满足条件的单个关键点,属于独立作战,而带pairs的函数是需要找到满足条件的一对点,如果只能找到一个点,没有另外一个点与之配对,则该点会被弃掉。幅度是指边缘处明暗灰度各自的均值差

translate_measure( : : MeasureHandle, Row, Column )(选用)
名字:转换一个度量对象
描述:一般用于一个程序中有很多测量矩形的情况,当使用第二个测量矩形时,不需要重新 gen_measure_rectangle2生成,将第二个测量矩形的中心坐标放到该算子的第二、三个参数当中即可,其第一个参数得到的句柄就相当于使用gen_measure_rectangle2算子正常生成的测量矩形句柄。然后使用measure_pos对该句柄进行正常计算。
参数:
MeasureHandle:测量句柄
Row:新参考点的行坐标
Column :新参考点的列坐标

案例

接下来以halcon一维测量自带的引脚间距和高度测量案例进行实操
打开halcon帮助文档,找到一维测量然后下拉到最后点击measure_pin.hdev
在这里插入图片描述

一、引脚间距测量

* Pin Measurement: Example for the application of the measure package
* including a lot of visualization operators
* 关闭窗口
dev_close_window ()
*读取自带的引脚图片
read_image (Image, 'ic_pin')
*获取图片的宽度和高度
get_image_size (Image, Width, Height)
*打开窗口,尺寸为图片宽高的1/2
dev_open_window (0, 0, Width / 2, Height / 2, 'black', WindowHandle)
*设置窗口显示字体
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
*把图片放到窗口
dev_display (Image)
*在屏幕显示暂停层序按F5继续操作的信息
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
*创建一个带角度的矩形,这里固定矩形框大小
Row := 47
Column := 485
Phi := 0
Length1 := 420
Length2 := 10
*设置颜色
dev_set_color ('green')
*设置绘制方式:这里绘制边框不填充
dev_set_draw ('margin')
*设置线条
dev_set_line_width (3)
*绘制矩形
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
*根据上面的矩形生成测量的roi区域
gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, 'nearest_neighbor', MeasureHandle)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*关闭自动把图像更新到窗口
dev_update_pc ('off')
dev_update_var ('off')
n := 1
*计算时间
count_seconds (Seconds1)
*提取垂直于仿射矩形的直边缘对
measure_pairs (Image, MeasureHandle, 1.5, 30, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, PinWidth, PinDistance)
count_seconds (Seconds2)
Time := Seconds2 - Seconds1
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_set_color ('red')
*绘制边缘对,输入为边缘点的行列坐标
disp_line (WindowHandle, RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond)
*计算每个边缘对的平均值
avgPinWidth := sum(PinWidth) / |PinWidth|
*计算相邻边缘对的平均值
avgPinDistance := sum(PinDistance) / |PinDistance|
numPins := |PinWidth|
dev_set_color ('yellow')
disp_message (WindowHandle, 'Number of pins: ' + numPins, 'image', 200, 100, 'yellow', 'false')
disp_message (WindowHandle, 'Average Pin Width:  ' + avgPinWidth, 'image', 260, 100, 'yellow', 'false')
disp_message (WindowHandle, 'Average Pin Distance:  ' + avgPinDistance, 'image', 320, 100, 'yellow', 'false')
* dump_window (WindowHandle, 'tiff_rgb', 'C:\\Temp\\pins_result')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()

运行结果
在这里插入图片描述

二、引脚高度测量

Row := 508
Column := 200
Phi := -1.5708
Length1 := 482
Length2 := 35
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, 'nearest_neighbor', MeasureHandle)
stop ()

这里同样创建一个矩形用于确定测量的roi区域,生成结果如下
在这里插入图片描述
接着测量边缘并绘制

*测量边缘对
measure_pos (Image, MeasureHandle, 1.5, 30, 'all', 'all', RowEdge, ColumnEdge, Amplitude, Distance)
*计算第一对边缘的高度
PinHeight1 := RowEdge[1] - RowEdge[0]
*计算第二对边缘的高度
PinHeight2 := RowEdge[3] - RowEdge[2]
dev_set_color ('red')
disp_line (WindowHandle, RowEdge, ColumnEdge - Length2, RowEdge, ColumnEdge + Length2)
disp_message (WindowHandle, 'Pin Height:  ' + PinHeight1, 'image', RowEdge[1] + 40, ColumnEdge[1] + 100, 'yellow', 'false')
disp_message (WindowHandle, 'Pin Height:  ' + PinHeight2, 'image', RowEdge[3] - 120, ColumnEdge[3] + 100, 'yellow', 'false')

运行结果
在这里插入图片描述
需要注意的是measure_pos返回的RowEdge, ColumnEdge指的是四条边缘的中点坐标,如下图的所示:
在这里插入图片描述

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

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

相关文章

抖音数据挖掘软件|视频内容提取

针对用户获取抖音视频的需求,我们开发了一款功能强大的工具,旨在解决用户在获取抖音视频时需要逐个复制链接、下载的繁琐问题。我们希望用户能够通过简单的关键词搜索,实现自动批量抓取视频,并根据需要进行选择性批量下载。因此&a…

从ChatGPT到Sora,来了解大模型训练中的存储

1 从chatGPT到Sora 2022年底,OpenAI推出人工智能聊天机器人ChatGPT,开启了大模型领域的“竞速跑”模式。2024年2月15日,随着视频生成模型Sora的横空出世,OpenAI再度掀起热潮。 Sora将视频生成内容拉到了一个全新的高度&#xff0c…

Socket、UDP、TCP协议和简单实现基于UDP的客户端服务端

目录 Socket TCP和UDP区别 UDP:无连接,不可靠传输,面向数据报,全双工 TCP:有连接,可靠传输,面向字节流,全双工 无连接和有连接 可靠传输和不可靠传输 面向数据报和面向字节流…

Visual Studio:Entity设置表之间的关联关系

1、选择表并右键-》新增-》关联 2、设置关联的表及关联关系并“确定”即可

RabbitMQ入门指南

文章目录 RabbitMQ 的作用为什么使用RabbitMQ数据隔离work模式交换机如何声明队列和交换机消息转换器生产者重连生产者确认MQ持久化消费者的可靠性1. 消费者确认机制2. 消费失败问题3. 业务幂等性 如何保证消息不丢失消息重复消费问题RabbitMQ中死信交换机?延迟队列…

基于qt的图书管理系统----03核心界面设计

参考b站:视频连接 源码github:github 目录 1 添加软件图标2 打包程序3 三个管理界面设计4 代码编写4.1 加载界面4.2 点击按钮切换界面4.3 组团添加样式4.4 搭建表头4.5 表格相关操作 从别人那里下载的项目会有这个文件,里边是别人配置的路径…

EasyRecovery破解版补丁免费钥匙下载

说起数据恢复软件,相信没有小伙伴不知道EasyRecovery这个软件吧,该软件具有快捷、高效、便捷的特点,且提供的功能也非常全面,不仅可以恢复各样被删除的文件、视频、图片等,还可以支持SD卡数据恢复,TF卡等各…

面试经典150题——生命游戏

​"Push yourself, because no one else is going to do it for you." - Unknown 1. 题目描述 2. 题目分析与解析 2.1 思路一——暴力求解 之所以先暴力求解,是因为我开始也没什么更好的思路,所以就先写一种解决方案,没准写着写…

istio系列教程

istio学习记录——安装https://suxueit.com/article_detail/otVbfI0BWZdDRfKqvP3Gistio学习记录——体验bookinfo及可视化观测https://suxueit.com/article_detail/o9VdfI0BWZdDRfKqlv0r istio学习记录——kiali介绍https://suxueit.com/article_detail/pNVbfY0BWZdDRfKqX_0K …

VBA实现快速逆透视

实例需求:将工作表中的数据(多维度交叉),对日期进行逆透视,转换为下表的格式。 示例代码如下。 Sub UnpivotTable()Dim oSht As WorksheetDim inLastRow As Long, inLastCol As LongDim outLastRow As Long, outCol …

橘子学es原理01之准备工作

es本身是具备很好的使用特性的,我指的是他的部署方面的,至于后期的使用和运维那还是很一眼难尽的。 我们从这一篇开始就着重于es的一些原理性的的一些探讨,当然我们也会有一些操作性的,业务性的会分为多个栏目来写。比如前面我写的…

ES6内置对象 - Map

Map(Map对象保存键值对,键值均不限制类型) 特点: 有序(Set集合是无序的);键值对(键可以是任意类型);键名不能重复(如果重复,则覆盖&…

Git的基本操作和原理

目录 写在前面的话 为什么要有Git(git初识)? Git安装(Centos为例) Git基本操作 创建Git本地仓库 Git配置 认识工作区、暂存区、版本库 概念认识 添加文件 查看.git文件 修改文件 版本回退 撤销修改 情况一:…

UnityWebGL 设置全屏

这是Unity导出Web默认打开的页面尺寸 修改后效果 修改 index.html 文件 1.div元素的id属性值为"unity-container",宽度和高度都设置为100%,意味着该div元素将占据整个父容器的空间。canvas元素的id属性值为"unity-canvas"&#xff…

Code-Audit(代码审计)习题记录6-7

介绍: 自己懒得搭建靶场了,靶场地址是 GitHub - CHYbeta/Code-Audit-Challenges: Code-Audit-Challenges为了方便在公网练习,可以随地访问,本文所有的题目均来源于网站HSCSEC-Code Audit 6、习题6 题目内容如下: 源代…

Autoencoder深度学习中的无监督学习神经网络

在当今的深度学习领域中,自动编码器(Autoencoder)是一种常见的无监督学习神经网络模型,用于学习有效的数据表示。自动编码器在许多领域都有广泛的应用,包括特征提取、降维、图像去噪、生成模型等。 自动编码器的基本原…

Redis篇之缓存雪崩、击穿、穿透详解

学习材料:https://xiaolincoding.com/redis/cluster/cache_problem.html 缓存雪崩 什么是缓存雪崩 在面对业务量较大的查询场景时,会把数据库中的数据缓存至redis中,避免大量的读写请求同时访问mysql客户端导致系统崩溃。这种情况下&#x…

Linux运维-Web服务器的配置与管理(PHP)

Web服务器的配置与管理(PHP) 项目场景 某企业在CentOS上搭建Web服务系统,以PHP作为网页开发环境,以MySQL为后台数据库。 基础知识 PHP PHP原始为Personal Home Page的缩写,已经正式更名为 “PHP: Hypertext Preprocessor”(超…

持续集成,持续交付和持续部署的概念,以及GitLab CI / CD的介绍

引言:上一期我们部署好了gitlab极狐网页版,今天我们介绍一下GitLabCI / CD 目录 一、为什么要 CI / CD 方法 1、持续集成 2、持续交付 3、持续部署 二、GitLab CI / CD简介 三、GitLab CI / CD 的工作原理 4、基本CI / CD工作流程 5、首次设置 …

Unity之PUN2插件实现多人联机射击游戏

目录 📖一、准备工作 📺二、UI界面处理 📱2.1 登录UI并连接PUN2服务器 📱2.2 游戏大厅界面UI 📱2.3 创建房间UI 📱2.4 进入房间UI 📱2.5 玩家准备状态 📱2.6 加载战斗场景…