文章目录
一、功能概述
这是一份面向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 新手避坑点
- 图像路径错误:必须用
/或\\,比如E:\\code\\111.BMP,不要用E:\code\111.BMP; - 测量区域选得差:尽量选刻度清晰、无反光、无模糊的区域,否则检测不到边缘;
- 边缘类型选错:如果刻度是白底黑字用
'negative',黑底白字用'positive'; - 忘记释放句柄:长期运行会导致内存泄漏,程序越来越卡。
五、整体总结
- 这份代码的核心是通过尺子刻度完成像素-物理尺寸的标定,是视觉测量的基础步骤;
- 关键是
measure_pairs的参数调优和亚像素测量句柄的创建,保证了测量精度; - 新手可以先跑通代码,再逐步修改参数(比如
MPSigma、MPThreshold),观察结果变化,理解参数的作用。
后续如果需要测量其他物体的尺寸,只需用本次标定得到的AvgPixelPer0_1mm(0.1mm对应像素数),将像素距离换算成物理尺寸即可。
- 新手入门教程&spm=1001.2101.3001.5002&articleId=156266153&d=1&t=3&u=91c05ab781b643bebcdb035520dee789)
1854

被折叠的 条评论
为什么被折叠?



