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





关于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自己确定边缘的开始点与结束点



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




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


*
*读取图像
*
read_image (Image1, 'D:\\halcon\\example\\手机电池.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<length2的情况下,measure——pairs没有值,不管怎样调整参数???
*length1和length2是矩形的两个半轴的长,明白了这个下面在计算多边形轮廓的时候要用到
length1 := 200
length2 := 10
*注意这里的矩形框的参数是自己调整的
gen_rectangle2 (Rectangle, row, column, angle, length1, length2)
*这里的测量矩形框也就是上面显示的部分
gen_measure_rectangle2 (row, column, angle, length1, length2, Width, Height, 'nearest_neighbor', MeasureHandle)


disp_continue_message (WindowHandle, 'black', 'true')


stop()




*注意这个算子可以计算许多组边缘,然后将获得的边缘组放在RowEdgeFirst, ColumnEdgeFirst, RowEdgeSecond, ColumnEdgeSecond中
*根据Thansition的不同值,所获得的边缘组的先后顺序不同,例如为'negative'意思是将‘从白至黑’的边缘 中心点 的坐标放在RowEdgeFirst,注意这里的参考方向,是角度为0时,是从左往右方向 
*ColumnEdgeFirst中,‘从黑到白’放在RowEdgeSecond, ColumnEdgeSecond中
*                    sigma:高斯滤波=0.9,小于l1/2; 最小边缘幅度=30;
*若矩形为0度,矩形是长边跟水平角度为0,第一条为左边的边,以此类推,为positive时,那么从dark-light的边中心点放到fist,从light-dark的放到second;当为90°时类推,negative相反
*all 返回所有的边缘,first返回第一条边缘,last返回最后一条边缘
*中心坐标,过渡灰度幅值
measure_pairs (Image1, MeasureHandle, 0.9, 30, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)


disp_continue_message (WindowHandle, 'black', 'true')


stop()


*
*可视化结果
*
*根据分组的个数,来画线,这个个数就是RowEdgeFirst组的个数,也就是边缘的个数
for i := 0 to |RowEdgeFirst|-1 by 1    
    *这个算子是画出多边形的亚像素轮廓,其中第二个和第三个参数可以是元素,即表示有多个点,两个点组成一条直线
    *至于每一个点是怎么计算的,我们已经知道了旋转的角度和每一条边的中心点,这个大家自己就可以在纸上用三角函数得出来每一个开始结束点
    *的坐标了
    gen_contour_polygon_xld (EdgeFirst, [RowEdgeFirst[i] - sin(rad(90) - angle)*length2,RowEdgeFirst[i] + sin(rad(90) - angle)*length2], [ColumnEdgeFirst[i] - cos(rad(90) - angle)*length2,ColumnEdgeFirst[i] + cos(rad(90) - angle)*length2])
    gen_contour_polygon_xld (EdgeSecond, [RowEdgeSecond[i] - sin(rad(90) - angle)*length2,RowEdgeSecond[i] + sin(rad(90) - angle)*length2], [ColumnEdgeFirst[i] - cos(rad(90) - angle)*length2,ColumnEdgeFirst[i] + cos(rad(90) - angle)*length2])
    dev_set_color ('cyan')
    dev_display (EdgeFirst)
    dev_set_color ('red')
    dev_display (EdgeSecond)
    dev_set_color ('blue')
    *这是设置文本在那里显示
    if (i = 0)
        set_tposition (WindowHandle, RowEdgeFirst[i] + 5, ColumnEdgeFirst[i]+20)
    else
        set_tposition (WindowHandle, RowEdgeFirst[i] - 40, ColumnEdgeFirst[i]+20)
    endif
    *从文本显示的地方写入字符串,写出像素
    write_string (WindowHandle, 'width: '+IntraDistance[i]+' pix')
endfor
disp_continue_message (WindowHandle, 'black', 'true')
stop ()

* 销毁

close_measure (MeasureHandle)
dev_update_window ('on')
dev_clear_window ()




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值