首先先说明一下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:/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<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中 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 ()
最后结果如下图:
*测量刻度尺 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)
结果如下所示:
————————————————
版权声明:本文为CSDN博主「Fred_Yang2013」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fred_yang2013/article/details/12205925

