文章专栏
我的Halcon开发 CSDN 专栏
Halcon学习 练习项目gitee仓库
CSDN Major 博主Halcon文章推荐
随笔分类 - Halcon入门学习教程
前言
今天来学直线测距,主要是用来测量连点之间的线段距离。感觉是用来得到工业产品精度的。
文章解读
- 一维测距是非常简单的
- 这里提供了一个强明暗对比的示例
- 你可以对示例边缘的左侧和右侧间距进行测距
- 一维测距的优点是,开销低,速度快,效果好。
流程图
获取图片->创建测距对象->测距
官方案例
Inspecting a Fuse(检查保险丝)
- 分析线段的组成部分
- 进行对称性分析测量,返回对称图像的边缘的宽度和间距
- 程序将最新的一部分进行分析并且得到XLD轮廓
这章算子的概念有点多
Halcon算子_measure_pairs
Halcon 测量之measure_pos算子介绍(四)
Halcon 测量之gen_measure_rectangle2算子介绍(三)
常见图像上采样算法
一维测量中measure_pos和measure_pairs算子
这里遇到的两个十分重要的算子,[gen_measure_rectangle2]和[measure_pairs],由于太过于抽象,需要深入理解,选中算子按下F1进入文档。对我这种英语文盲有点痛苦。
gen_measure_rectangle2
- gen_measure_rectangle2用于处理直线边缘,垂直于矩形轴线。矩形轴线默认方向为水平,即默认处理竖直的边缘。如果想处理水平的边缘,则需要将ROI区域进行旋转。其它的,看不下了辣
mearsur_paris
这位更是重量级,算子的参数基本看不懂。简单来说这个就是用于处理对称边缘的。
如果Transition = ‘positive’,则在矩形长轴方向上具有从暗到亮过渡的边缘点将在RowEdgeFirst和ColumnEdgeFirst中返回。在这种情况下,在RowEdgeSecond和ColumnEdgeSecond中返回具有明暗转换的相应边。如果Transition = ‘negative’,则行为完全相反。如果Transition = ‘all’,第一个检测到的边定义了RowEdgeFirst和ColumnEdgeFirst的过渡。即,根据测量对象的位置,返回具有光-暗-光过渡的边缘对或具有暗-光-暗过渡的边缘对。这适用于测量相对于背景具有不同亮度的物体。
还是给图看得懂
代码注释
第一次接触,是真的没看懂。有机会到时候多看看其它的案例融会贯通一下
* fuse.hdev: measuring the width of a fuse wire
*
dev_update_window ('off')
dev_close_window ()
* ****
* step: acquire image
* ****
read_image (Fuse, 'fuse')
get_image_size (Fuse, Width, Height)
dev_open_window_fit_image (Fuse, 0, 0, Width, Height, WindowID)
set_display_font (WindowID, 12, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (3)
dev_display (Fuse)
set_display_font (WindowID, 12, 'mono', 'true', 'false')
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* step: 创建测距ROI
* ****
* -> 手动定义 ROI
Row := 297
Column := 545
Length1 := 80
Length2 := 10
* rad为度数转弧度。90表达逆时针旋转90°
Angle := rad(90)
* 生成2型矩阵。1型矩形:绝对坐标生成。2型矩形:中心点坐标+长宽+偏转角
gen_rectangle2 (ROI, Row, Column, Angle, Length1, Length2)
* -> 2型矩形测距,获得测距句柄,测试'bicubic'只是算法选择,对结果影响不大
gen_measure_rectangle2 (Row, Column, Angle, Length1, Length2, Width, Height, 'bicubic', MeasureHandle)
dev_display (ROI)
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* step: measure
* ****
* 对称性测距。获得对称两边的数据
measure_pairs (Fuse, MeasureHandle, 1, 1, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* step: visualize results
* ****
for i := 0 to |RowEdgeFirst| - 1 by 1
* 设置边缘的上下边距
gen_contour_polygon_xld (EdgeFirst, [-sin(Angle + rad(90)) * Length2 + RowEdgeFirst[i],-sin(Angle - rad(90)) * Length2 + RowEdgeFirst[i]], [cos(Angle + rad(90)) * Length2 + ColumnEdgeFirst[i],cos(Angle - rad(90)) * Length2 + ColumnEdgeFirst[i]])
gen_contour_polygon_xld (EdgeSecond, [-sin(Angle + rad(90)) * Length2 + RowEdgeSecond[i],-sin(Angle - rad(90)) * Length2 + RowEdgeSecond[i]], [cos(Angle + rad(90)) * Length2 + ColumnEdgeSecond[i],cos(Angle - rad(90)) * Length2 + ColumnEdgeSecond[i]])
* 绘画出上下边缘
dev_set_color ('cyan')
dev_display (EdgeFirst)
dev_set_color ('magenta')
dev_display (EdgeSecond)
dev_set_color ('blue')
* 设置text光标起点,和write_string搭配使用
if (i == 0)
set_tposition (WindowID, RowEdgeFirst[i] + 5, ColumnEdgeFirst[i] + 20)
else
set_tposition (WindowID, RowEdgeFirst[i] - 40, ColumnEdgeFirst[i] + 20)
endif
write_string (WindowID, 'width: ' + IntraDistance[i] + ' pix')
endfor
disp_continue_message (WindowID, 'black', 'true')
stop ()
* ****
* step: destroy measure object
* ****
close_measure (MeasureHandle)
dev_update_window ('on')
dev_clear_window ()