halcon measure_pos和measure_pairs详解

这两个算子作为halcon一维测量的关键,看了这两个算子的多个博客,也没搞清楚里面几个参数的意义和测量的原理,决定自己详细试一下,将测试的过程详细记录下来,供以后需要参考的朋友使用,本文将从以下几个点说明二者的功能和区别:

  1. 两个测量算子的原理说明及直观认识
  2. 参数说明
  3. 一些注意事项
    1.两个测量算子的原理说明及直观认识
    借用halcon的一张图片:

测量原理说明

两个算子是根据测量矩形的长轴中心线(图上从Start到End带箭头的那根线)上的像素变化,对有明暗变化的关键点进行寻找,也就是说只有测量的中心线是有效测量区域,矩形的其它区域并没有测量功用(后来测试发现有奇怪的现象发生,即使中心线没有与被测图形相交,但是中心线上仍然有被找到的行列点,现象很特别,但是实际使用中并不建议大家这样做)。
measure_pos函数会寻找所有满足条件的单个关键点,属于独立作战,而带pairs的函数是需要找到满足条件的一对点,如果只能找到一个点,没有另外一个点与之配对,则该点会被弃掉。
因为halcon自带例子中的图片包含的情况种类不多,且画线的指示容易误导大家对测量原理的认识,所以自己画了张图片,图片中包含各种可能存在的情况,并对其一一测试。
自绘测试图
测试了几种情况,供大家参考,图中绿色的圆圈为measure_pos函数找到的关键点,蓝色的线条为measure_pairs函数找到的边缘对之间的连线。
测试1
测试2
测试3
测试4
测试5
测试6
测试7
测试8(异常测试)

测试代码如下:

dev_close_window ()

read_image(img_mea, 'meas_test.jpg')
get_image_pointer1(img_mea, Pointer1, Type1, width_img, height_img)
* dev_get_window(hWnd)
dev_open_window_fit_image (img_mea, 0, 0, 1000, 1000, hWnd)
set_display_font (hWnd, 14, 'mono', 'true', 'false')
dev_display(img_mea)
dev_set_draw ('margin')
dev_set_line_width (3)

draw_rectangle2(hWnd, Row3, Column3, Phi3, Length13, Length23)
Interpolation := 'nearest_neighbor'
gen_rectangle2 (Rectangle, Row3, Column3, Phi3, Length13, Length23)
dev_display (Rectangle)
gen_measure_rectangle2 (Row3, Column3, Phi3, Length13, Length23, \
                        width_img, height_img, Interpolation, hMeas)
* dev_display (Rectangle)
Sigma := 1.0
Threshold := 30
Transition := 'all'
Select := 'all'
measure_pos (img_mea, hMeas, Sigma, Threshold, Transition, \
             Select, RowEdge, ColumnEdge, Amplitude, Distance)

dev_set_color ('green')
* disp_line (hWnd, RowEdge, ColumnEdge - Length23, RowEdge, ColumnEdge + Length23)
tuple_length (RowEdge, pos_num)
tuple_gen_const (pos_num, 2, cir_radius)
gen_circle(pos_cir, RowEdge, ColumnEdge, cir_radius)
dev_display (pos_cir)


gen_measure_rectangle2 (Row3, Column3, Phi3, Length13, Length23, \
                        width_img, height_img, Interpolation, hMeas2)

measure_pairs (img_mea, hMeas2, Sigma, Threshold, Transition, \
               Select, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, \
               RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, \
               IntraDistance, InterDistance)

dev_set_color ('blue')


gen_region_line (RegionLines, RowEdgeFirst, ColumnEdgeFirst, \
                 RowEdgeSecond, ColumnEdgeSecond)
dev_display (RegionLines)

2.参数说明
measure_pos(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdge, ColumnEdge, Amplitude, Distance)

Image:被测量的图像;
MeasureHandle:测量句柄,传入gen_measure_rectangle2生成的测量矩形;
Sigma (input_control):高斯平滑系数,默认1.0
Threshold:可被函数认为是黑白变化的最小阈值,我的理解是相邻两个像素的灰度值变化超过Threshold时,函数认为是一个边缘;
Transition:边缘变化的种类,黑变白,白变黑还是二者皆算;
Select:找到的边缘选择全部还是第一个,最后一个;
RowEdge:边缘的Y值,可能多个;
ColumnEdge:边缘的X值,可能多个;
Amplitude:边缘两侧的两个像素的灰度差值;
Distance:连续两个边缘的距离。
以下图为例:1和2点之间的Distance为二者间蓝线距离,2,3点之间的距离为图中红色连线的距离。
pos函数距离说明

measure_pairs(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
IntraDistance是同一个边缘对之间的距离,如下图中蓝色线的距离;
InterDistance是两个边缘对之间的距离,图中是两根蓝色线段之间空白处的距离。
相同的参数不再赘述,相同参数时,找到的关键点与pos函数相同,只是该函数测量的为边缘对,不配对的关键点会被忽略掉。
paris函数

3.一些注意事项:
一、正常情况下,测量矩形的长轴应尽量与被测量边缘保持垂直,不垂直时会有噪点出现,同样情况下会使测量变的复杂;
二、两个函数找到的关键点是完全相同的,pairs函数会因配对问题将部分关键点忽略;
三、同一个测量矩形,长轴具有2个方向,不同的方向会导致测量的边缘变化方式和第一个边缘产生变化,测量时候需要注意。

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值