Halcon 1D测量(1) :测量边缘对

首先先说明一下Hdevelop图形显示界面的坐标:基本上和其他环境中图像的坐标一样,左上角为(0,0),X轴为横轴,Y轴为纵轴,行Row指的是Y轴坐标,列Column指的是X轴坐标


关于gen_measure_rectangle2

它是获得一个测量句柄

Row, Column是矩形的中心

Length1, Length2是矩形区域的长和宽的一半,关于区域的宽度,尽量在包住边缘的同时设置的越大越好,因为设置的太小噪声太大

Phi是Rectangle旋转的角度,当为正时表示逆时针旋转,当为负时表示顺时针旋转

如果想看ROI是否合适可以利用gen_rectangle1查看

Interpolation表示插值的方法,因为当ROI不是垂直或者水平的话,那么他的Projection(下图中短的等距线)经过的就不是一个完整的像素,因为要计算它的平均值给Profile。它的值就需要插值,详细见solution_guide_iii_a_1d_measuring  A-12

Halcon 1D测量(1) :测量边缘对_第1张图片


Halcon 1D测量(1) :测量边缘对_第2张图片


关于measure_pairs

measure_pairs适用于有许多组边缘的图像,如果是一组边缘,也可以用measure_pos,下面的第一个例子就可以。使用他们时边缘要是一条直线,结果中包含了许多信息,每一个边缘RowEdge表示的是边缘的行坐标,ColumnEdge表示的是列坐标,Amplitude表示的是根据Transition边缘的梯度,IntraDistance表示的是一个边缘组之间的距离,InterDistance表示的是边缘组之间的距离,这两个距离可以计算物体的高度和计算物体的个数

Transition = ‘negative’时表示由像素值高转到低像素值的边缘放在RowEdgeFirst中,这里有一个参考方向,就是Rectangle旋转角度为0时,从左到右的方向

Sigma表示高斯滤波的参数,高斯滤波的是对Profile形成的曲线,Threshold是对他的一阶导数设置的阈值(下图粗线是Profile line经过的像素,细线是他的一阶导数,可以看出它大概有三组边缘)

如果要可视化边缘,需要利用RowEdge,Column,Phi自己确定边缘的开始点与结束点


Halcon 1D测量(1) :测量边缘对_第3张图片

注意,由于没有对摄像机进行标定,1D测量只能获得物体的像素的个数

*测量手机电池的高度有多少个像素

*
*读取图像
*
read_image (Image1, 'D:/picture/20130930153459.jpg')
get_image_size (Image1, Width, Height)

dev_close_window()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
*设置所画的区域是一个面还是轮廓
dev_set_draw ('margin')
*设置画的颜色
dev_set_color ('black')
*因为我使用的彩色RGB图像,先使他变成灰度图像
decompose3 (Image1, red, green, blue)
rgb3_to_gray (red, green, blue, ImageGray)
dev_display(ImageGray)

*
*设置ROI
*
*注意row和column是矩形的中心
row := 238
column := 300
*这个是矩形旋转的角度,角度是正的按逆时针转,负的按顺时针转
angle := rad(90)
*在length1

最后结果如下图:


Halcon 1D测量(1) :测量边缘对_第4张图片

*测量刻度尺

dev_close_window()

read_image (Image, 'D:/picture/20131001152907.jpeg')
decompose3 (Image, Red, Green, Blue)
rgb3_to_gray (Red, Green, Blue, ImageGray)
get_image_size (Image, Width, Height)


dev_close_window()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_set_draw ('margin')
dev_display (ImageGray)

Row := 169
Column := 636
*这里为什么要旋转-90度,自己想想去
Phi := rad(-90)
Length1 := 105
Length2 := 3


gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
gen_measure_rectangle2 (Row, Column, Phi, Length1, Length2, Width, Height, 'bicubic', MeasureHandle)

Sigma := 1.0
Threshold := 10
*旋转了-90度,表示顺时针旋转了90度,也就是表示从上至下,从像素值高到像素值低的放在RowEdgeFirst中
Transition := 'negative'
Select := 'all'
measure_pairs (ImageGray, MeasureHandle, 1, 30, Transition, Select, RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)

disp_line (WindowHandle, RowEdgeFirst , ColumnEdgeFirst- Length2, RowEdgeFirst, ColumnEdgeSecond + Length2)

avgLeadWidth := sum(IntraDistance)/|IntraDistance|
avgLeadDistance := sum(InterDistance)/|InterDistance|
numLeads := |IntraDistance|

disp_message (WindowHandle, '刻度个数: '+numLeads, 'window', 100, 200, 'black', 'false')
disp_message (WindowHandle, '平均宽度:  '+avgLeadWidth$'.2f', 'window',130, 200, 'black', 'false')
disp_message (WindowHandle, '平均距离:  '+avgLeadDistance$'.2f', 'window',160, 200, 'black', 'false')
stop()

*将之部分放大,首先定义一个区域
Row1 := 100
Column1 := 580
Row2 := 200
Column2 := 680
dev_set_color ('blue')
disp_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
disp_continue_message (WindowHandle, 'black', 'true')
stop()

*将这个区域放大,然后显示
dev_set_part (Row1, Column1, Row2, Column2)
dev_display (Image)
dev_set_color ('black')
dev_display (Rectangle)
*画出每一个边缘
NumRows := |RowEdgeFirst|
NumCols := |ColumnEdgeFirst|
Num := min([NumRows, NumCols])

for i:= 0 to Num - 1 by 1
    *先得到每一条边缘的中心点
    RowCoorFirst := RowEdgeFirst[i]
    ColCoorFirst := ColumnEdgeFirst[i]
    
    RowCoorSecond := RowEdgeSecond[i]
    ColCoorSecond := ColumnEdgeSecond[i]
    *得到边缘的开始点与结束点
    RowStartFirst := RowCoorFirst - sin(rad(90) - Phi)*Length2
    RowEndFirst := RowCoorFirst + sin(rad(90) - Phi)*Length2
    ColStartFirst := ColCoorFirst - cos(rad(90) - Phi)*Length2
    ColEndFirst := ColCoorFirst + cos(rad(90) - Phi)*Length2
    
    RowStartSecond := RowCoorSecond - sin(rad(90) - Phi)*Length2
    RowEndSecond := RowCoorSecond + sin(rad(90) - Phi)*Length2
    ColStartSecond := ColCoorSecond - cos(rad(90) - Phi)*Length2
    ColEndSecond := ColCoorSecond + cos(rad(90) - Phi)*Length2
    *画出边缘线
    gen_contour_polygon_xld(EdgeFirst,[RowStartFirst,RowEndFirst],[ColStartFirst,ColEndFirst])
    gen_contour_polygon_xld(EdgeSecond,[RowStartSecond,RowEndSecond],[ColStartSecond,ColEndSecond])
    dev_set_color ('red')
    dev_set_line_width (2)
    dev_display (EdgeFirst)
endfor
close_measure (MeasureHandle)
*重置参数
dev_set_part (0, 0, Height-1, Width-1)
dev_set_draw ('fill')
dev_set_line_width (1)


结果如下所示:

Halcon 1D测量(1) :测量边缘对_第5张图片

Halcon 1D测量(1) :测量边缘对_第6张图片

你可能感兴趣的:(图像处理,halcon)