这两个算子作为halcon一维测量的关键,看了这两个算子的多个博客,也没搞清楚里面几个参数的意义和测量的原理,决定自己详细试一下,将测试的过程详细记录下来,供以后需要参考的朋友使用,本文将从以下几个点说明二者的功能和区别:
- 两个测量算子的原理说明及直观认识
- 参数说明
- 一些注意事项
1.两个测量算子的原理说明及直观认识
借用halcon的一张图片:
两个算子是根据测量矩形的长轴中心线(图上从Start到End带箭头的那根线)上的像素变化,对有明暗变化的关键点进行寻找,也就是说只有测量的中心线是有效测量区域,矩形的其它区域并没有测量功用(后来测试发现有奇怪的现象发生,即使中心线没有与被测图形相交,但是中心线上仍然有被找到的行列点,现象很特别,但是实际使用中并不建议大家这样做)。
measure_pos函数会寻找所有满足条件的单个关键点,属于独立作战,而带pairs的函数是需要找到满足条件的一对点,如果只能找到一个点,没有另外一个点与之配对,则该点会被弃掉。
因为halcon自带例子中的图片包含的情况种类不多,且画线的指示容易误导大家对测量原理的认识,所以自己画了张图片,图片中包含各种可能存在的情况,并对其一一测试。
测试了几种情况,供大家参考,图中绿色的圆圈为measure_pos函数找到的关键点,蓝色的线条为measure_pairs函数找到的边缘对之间的连线。
测试代码如下:
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点之间的距离为图中红色连线的距离。
measure_pairs(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
IntraDistance是同一个边缘对之间的距离,如下图中蓝色线的距离;
InterDistance是两个边缘对之间的距离,图中是两根蓝色线段之间空白处的距离。
相同的参数不再赘述,相同参数时,找到的关键点与pos函数相同,只是该函数测量的为边缘对,不配对的关键点会被忽略掉。
3.一些注意事项:
一、正常情况下,测量矩形的长轴应尽量与被测量边缘保持垂直,不垂直时会有噪点出现,同样情况下会使测量变的复杂;
二、两个函数找到的关键点是完全相同的,pairs函数会因配对问题将部分关键点忽略;
三、同一个测量矩形,长轴具有2个方向,不同的方向会导致测量的边缘变化方式和第一个边缘产生变化,测量时候需要注意。