Halcon实现尺子刻度像素标定(亚像素精度)- 新手入门教程

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本


一、功能概述

这是一份面向Halcon新手的入门级代码教程,核心功能是:读取尺子图像后,通过手动绘制测量区域,提取尺子0.1mm刻度线的边缘对,计算出“0.1毫米”对应的平均像素数量,完成像素尺寸到物理尺寸的标定,为后续基于视觉的尺寸测量打下基础。代码采用亚像素精度检测,保证了测量的准确性,同时全程有可视化反馈,方便新手理解每一步的作用。
在这里插入图片描述

二、完整可运行代码

测试图片:
在这里插入图片描述

完整代码:

* 初始化窗口
dev_close_window ()
* 读取尺子图像,替换为实际图片路径
read_image (Image, 'E:/code/zhp/Project/Shaver/halcon/measure_size/pic_size/111.BMP')  
* 获取图像尺寸
get_image_size (Image, Width, Height)
* 打开适配图像尺寸的显示窗口
dev_open_window_fit_size (0, 0, Width, Height, -1, -1, WindowHandle)
* 设置显示字体
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
* 显示原始图像
dev_display (Image)
* 设置显示颜色为白色
dev_set_color ('white')

* 提示用户绘制测量矩形区域
disp_message (WindowHandle, '请在尺子刻度处绘制矩形测量区域', 'window', 12, 12, 'black', 'true')
* 手动绘制矩形测量区域(也可固定Row/Col/Phi/Length1/Length2)
draw_rectangle2 (WindowHandle, Row, Col, Phi, Length1, Length2)

* 创建矩形测量句柄,采用双线性插值保证亚像素精度
gen_measure_rectangle2 (Row, Col, Phi, Length1, Length2, Width, Height, 'bilinear', MeasureHandle)

* 定义measure_pairs参数:高斯平滑系数
MPSigma := 1.5          
* 定义measure_pairs参数:边缘幅值阈值
MPThreshold := 5        
* 定义measure_pairs参数:边缘过渡类型(黑到白为positive,白到黑为negative)
MPTransition := 'negative'  
* 定义measure_pairs参数:提取所有边缘对
MPSelect := 'all'      

* 提取刻度线的边缘对
measure_pairs (Image, MeasureHandle, MPSigma, MPThreshold, MPTransition, MPSelect, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)

* 计算每对边缘的行中心坐标
RowPitchLine := (RowEdgeFirst + RowEdgeSecond) / 2.0  
* 计算每对边缘的列中心坐标
ColPitchLine := (ColumnEdgeFirst + ColumnEdgeSecond) / 2.0  

* 计算相邻刻度中心的像素距离(列方向,适配水平尺子)
distance_pp (RowPitchLine[0:|RowPitchLine| - 2], ColPitchLine[0:|ColPitchLine| - 2], RowPitchLine[1:|RowPitchLine| - 1], ColPitchLine[1:|ColPitchLine| - 1], PixelDistance)

* 计算0.1mm对应的平均像素数(基于尺子0.1mm刻度间隔)
AvgPixelPer0_1mm := mean(PixelDistance)

* 生成刻度中心十字标记
gen_cross_contour_xld (Cross, RowPitchLine, ColPitchLine, 6, 0.45)
* 显示十字标记
dev_display (Cross)
* 设置绘制模式为轮廓
dev_set_draw ('margin')
* 生成测量矩形轮廓
gen_rectangle2 (Rectangle, Row, Col, Phi, Length1, Length2)
* 显示测量矩形
dev_display (Rectangle)
* 恢复绘制模式为填充
dev_set_draw ('fill')

* 显示0.1mm对应的平均像素数
disp_message (WindowHandle, '0.1mm对应的平均像素数: ' + AvgPixelPer0_1mm$'.2f', 'window', 36, 12, 'black', 'true')
* 显示单组刻度的像素距离
disp_message (WindowHandle, '单组刻度像素距离: ' + PixelDistance$'.1f', 'window', 60, 12, 'black', 'true')

* 释放测量句柄资源
close_measure (MeasureHandle)

三、代码分步详细解析

3.1 环境初始化与图像加载

这部分是Halcon视觉程序的“标配开头”,主要作用是清理环境、加载图像并创建适配的显示窗口。

dev_close_window ()  * 关闭已有窗口,避免多个窗口干扰
read_image (Image, '你的图片路径.BMP')  * 读取图像,新手注意路径格式:用/或\\,不要用\
get_image_size (Image, Width, Height)  * 获取图像宽高,为后续创建窗口用
dev_open_window_fit_size (0, 0, Width, Height, -1, -1, WindowHandle)  * 创建适配图像大小的窗口
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')  * 设置字体:字号14、等宽、加粗
dev_display (Image)  * 显示原始图像
dev_set_color ('white')  * 后续绘制的文字/图形用白色,对比明显

新手重点:替换read_image里的路径为自己的尺子图片路径,路径错误会直接报错!

3.2 手动绘制测量区域

让用户通过鼠标选择要测量的刻度区域,是交互式操作的核心。

disp_message (WindowHandle, '请在尺子刻度处绘制矩形测量区域', 'window', 12, 12, 'black', 'true')
draw_rectangle2 (WindowHandle, Row, Col, Phi, Length1, Length2)

操作说明:运行代码后,会弹出图像窗口,用鼠标拖选一个包含多根0.1mm刻度线的矩形区域(尽量选刻度清晰、无模糊的区域)。

  • Row/Col:矩形中心的行/列坐标
  • Phi:矩形旋转角度(水平尺子为0)
  • Length1/Length2:矩形的半高/半宽
    在这里插入图片描述

3.3 创建亚像素测量句柄

这是保证测量精度的关键步骤,gen_measure_rectangle2专门用于创建“测量模板”,后续的边缘检测都基于这个模板。

gen_measure_rectangle2 (Row, Col, Phi, Length1, Length2, Width, Height, 'bilinear', MeasureHandle)

核心参数解释

  • 'bilinear':双线性插值,实现亚像素精度(新手理解:普通检测是按像素整数坐标,亚像素能精确到0.1个像素,精度更高)
  • MeasureHandle:测量句柄(新手理解:相当于测量工具的“身份证”,后续操作都要用到)

3.4 设置边缘检测参数并提取边缘对

measure_pairs是Halcon提取平行边缘对的核心函数,专门用于检测刻度线、直线边缘等成对的边缘。

* 先定义参数
MPSigma := 1.5          * 高斯平滑:过滤图像噪声,1.5是常用值
MPThreshold := 5        * 边缘幅值阈值:只有边缘强度>5才会被检测,过滤弱边缘
MPTransition := 'negative'  * 边缘类型:白到黑(尺子刻度是黑色,背景白色)
MPSelect := 'all'       * 提取所有边缘对

* 提取边缘对
measure_pairs (Image, MeasureHandle, MPSigma, MPThreshold, MPTransition, MPSelect, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)

输出参数说明

  • RowEdgeFirst/ColumnEdgeFirst:第一组边缘的行/列坐标(比如刻度线左侧边缘)
  • RowEdgeSecond/ColumnEdgeSecond:第二组边缘的行/列坐标(比如刻度线右侧边缘)
  • IntraDistance:每对边缘内部的距离(单根刻度线的宽度)
  • InterDistance:相邻边缘对之间的距离

3.5 计算像素-物理尺寸对应关系

这部分是标定的核心,通过计算相邻刻度中心的像素距离,得到0.1mm对应的像素数。

* 计算每根刻度线的中心坐标(左右边缘的中点)
RowPitchLine := (RowEdgeFirst + RowEdgeSecond) / 2.0  
ColPitchLine := (ColumnEdgeFirst + ColumnEdgeSecond) / 2.0  

* 计算相邻刻度中心的像素距离(列方向,水平尺子)
distance_pp (RowPitchLine[0:|RowPitchLine| - 2], ColPitchLine[0:|ColPitchLine| - 2], RowPitchLine[1:|RowPitchLine| - 1], ColPitchLine[1:|ColPitchLine| - 1], PixelDistance)

* 计算平均值(0.1mm对应的像素数)
AvgPixelPer0_1mm := mean(PixelDistance)

新手重点:如果你的尺子是垂直的,把ColPitchLine换成RowPitchLine即可。

3.6 可视化结果与资源释放

可视化让新手能直观看到检测结果,资源释放是Halcon程序的“标配结尾”。

* 绘制刻度中心十字标记
gen_cross_contour_xld (Cross, RowPitchLine, ColPitchLine, 6, 0.45)
dev_display (Cross)

* 绘制测量矩形(只显示边框)
dev_set_draw ('margin')
gen_rectangle2 (Rectangle, Row, Col, Phi, Length1, Length2)
dev_display (Rectangle)
dev_set_draw ('fill')

* 显示标定结果
disp_message (WindowHandle, '0.1mm对应的平均像素数: ' + AvgPixelPer0_1mm$'.2f', 'window', 36, 12, 'black', 'true')
disp_message (WindowHandle, '单组刻度像素距离: ' + PixelDistance$'.1f', 'window', 60, 12, 'black', 'true')

* 释放测量句柄(必须做!否则会占用内存)
close_measure (MeasureHandle)

在这里插入图片描述

四、关键知识点总结

4.1 核心函数作用

函数名核心作用新手记忆点
gen_measure_rectangle2创建亚像素测量句柄测量前先“造工具”
measure_pairs提取成对边缘专门测刻度线、直线边缘
distance_pp计算两点间像素距离像素距离计算核心
close_measure释放测量句柄用完工具要“归还”

4.2 新手避坑点

  1. 图像路径错误:必须用/\\,比如E:\\code\\111.BMP,不要用E:\code\111.BMP
  2. 测量区域选得差:尽量选刻度清晰、无反光、无模糊的区域,否则检测不到边缘;
  3. 边缘类型选错:如果刻度是白底黑字用'negative',黑底白字用'positive'
  4. 忘记释放句柄:长期运行会导致内存泄漏,程序越来越卡。

五、整体总结

  1. 这份代码的核心是通过尺子刻度完成像素-物理尺寸的标定,是视觉测量的基础步骤;
  2. 关键是measure_pairs的参数调优和亚像素测量句柄的创建,保证了测量精度;
  3. 新手可以先跑通代码,再逐步修改参数(比如MPSigmaMPThreshold),观察结果变化,理解参数的作用。

后续如果需要测量其他物体的尺寸,只需用本次标定得到的AvgPixelPer0_1mm(0.1mm对应像素数),将像素距离换算成物理尺寸即可。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值