1.gen_measure_rectangle2( : : Row, Column, Phi, Length1, Length2, Width, Height, Interpolation : MeasureHandle)gen_measure re_rectangle2准备提取垂直于矩形主轴的直线边缘。
矩形的中心在参数Row, Column中传递.
矩形主轴的方向为Ph。
两个轴的长度,即,矩形直径的一半为Length1和Length2中。
要了解一维测量的概念,请参阅一维测量章节的介绍。
创建的结果保存在句柄MeasureHandle,用于后续调用。
边缘提取算法在算子measure_pos的文档中进行了描述。
如前所述,一维灰度值剖面的计算可以采用不同的插值方法。
对于Interpolation = 'nearest_neighbor',测量中的灰度值由最近像素的灰度值得到,即,通过常数插值。
对于Interpolation = 'bilinear',使用双线性插值,
而对于Interpolation = 'bicubic',使用双三次插值。
为了以最佳速度执行实际测量,可用于多个测量的所有计算都已经在操作符gen_measure re_rectangle2中执行。
为此,在measure rehandle中构造并返回一个优化的数据结构,即所谓的度量对象。
对执行测量的图像的大小必须在参数Width, Height中指定。
系统参数“int_zoom”(参见set_system)影响用于构造度量对象计算的准确性和速度。
如果'int_zooming'设置为'true',则使用定点算法执行内部计算,从而缩短执行时间。
然而,这种模式下的几何精度略低。
如果'int_zooming'设置为'false',则使用浮点数算法执行内部计算,从而获得最大的几何精度,同时显著增加了执行时间。
2.measure_pairs(Image : : MeasureHandle, Sigma, Threshold, Transition, Select : RowEdgeFirst,
ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
函数measure re_pair用于提取垂直于矩形或环形圆弧主轴的直线边缘对。
measure_pairs的提取算法与measure_pos算法相同。
此外,函数将边缘分组为成为对:
如果Transition = 'positive',则在矩形主轴方向上具有从暗到亮转换的边缘点,在RowEdgeFirst和ColumnEdgeFirst中返回。
在这情况下,具有从亮到暗转换的对应边缘,在RowEdgeSecond和columnedgesececond中返回。
如果Transition = 'negative',则行为正好相反。
如果Transition = 'all',则第一个检测到的边缘定义RowEdgeFirst和ColumnEdgeFirst。
即根据测量对象的位置,返回具有亮-暗-亮过渡的边缘对或具有暗-亮-暗过渡的边缘对。
这是非常有用,例如,测量对象相对于背景有不同的亮度。
如果发现多个具有相同转换的连续边,则将第一个边用作对元素。
这种行为可能会在一些应用中导致一些问题,可以将Threshold选择小些,以抑制相同转换的连续边缘。
对于这些应用,存在第二种配对模式,该模式只选择连续上升和下降边缘序列中各自最强的边缘。
此模式是通过将“_strong”附加到参数Transition(例如“negative_strong”)来选择的。
最后,可以选择返回哪些边对。
如果Select设置为'all',则返回所有边缘对。
如果将其设置为“first”,则只返回提取的边缘对中的第一个。
而将其设置为“last”,则只返回最后一个。
提取的边缘作为位于矩形主轴上的单点返回。
相应的边缘振幅 在AmplitudeFirst , AmplitudeSecond返回。
每个边缘对之间的距离在intrdistance中返回,
相邻边缘对之间的距离在InterDistance中返回。
其中IntraDistance对应EdgeFirst与edgeecond 之间的距离,
InterDistance对应edgeecond 与EdgeFirst[i+1]之间的距离,即的元组的元组间距离包含一个元素。
参数Sigma,Threshold为处理过程中用到的高斯平滑系数,和最低边缘阈值。
3.close_measure( : : MeasureHandle : )
close_measure删除measure rehandle给出的度量对象。
用于度量对象的内存被释放。
4.write_measure( : : MeasureHandle, FileName : )
write_measure将gen_measure re_rectangle2等创建的度量对象写入文件FileName 。
度量对象由句柄measure rehandle定义。
可以使用read_measure读取度量对象。
度量对象的默认HALCON文件扩展名是'msr'。
5.serialize_measure( : : MeasureHandle : SerializedItemHandle)
serialize_measure串行化度量对象的数据(有关串行化的基本原理,请参阅fwrite_serialized_item)。
度量对象由句柄measure rehandle定义。
串行化的度量对象由句柄SerializedItemHandle返回,可以通过deserialize_measure反序列化。
6.deserialize_measure( : : SerializedItemHandle : MeasureHandle)
deserialize_measure反串行化一个由serialize_measure串行化的度量对象。
串行化的度量对象由句柄SerializedItemHandle定义。
反串行化的值存储在句柄MeasureHandle。
7.translate_measure( : : MeasureHandle, Row, Column : )
translate_measure将measure句柄给出的度量对象的参考点移动为点(Row, Column )。
如果度量对象和被平移的度量对象完全位于图像中,则度量对象将有效地移动到新的参考点。
否则,使用创建度量对象MeasureHandle时指定的参数和新的参考点,
利用函数gen_measure_rectangle2或gen_measure_arc重新生成度量对象。
以上函数综合使用例程为:
dev_close_window ()
read_image (Fuse, 'fuse')
get_image_size (Fuse, Width, Height)
dev_open_window_fit_image (Fuse, 0, 0, Width, Height, WindowID)
dev_display (Fuse)
set_display_font (WindowID, 12, 'mono', 'true', 'false')
dev_set_line_width (3)
dev_set_draw ('margin')
* 在指定测量位置生成测量矩形。
Row := 297
Column := 545
Length1 := 80
Length2 := 10
Angle := rad(90)
gen_rectangle2 (ROI, Row, Column, Angle, Length1, Length2)
gen_measure_rectangle2 (Row, Column, Angle, Length1, Length2, Width, Height, 'bilinear', MeasureHandle)
measure_pairs (Fuse, MeasureHandle, 1, 1, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
*结果显示
for i := 0 to |RowEdgeFirst| - 1 by 1
gen_contour_polygon_xld (EdgeFirst, [-sin(Angle + rad(90)) * Length2 + RowEdgeFirst,-sin(Angle - rad(90)) * Length2 + RowEdgeFirst], [cos(Angle + rad(90)) * Length2 + ColumnEdgeFirst,cos(Angle - rad(90)) * Length2 + ColumnEdgeFirst])
gen_contour_polygon_xld (EdgeSecond, [-sin(Angle + rad(90)) * Length2 + RowEdgeSecond,-sin(Angle - rad(90)) * Length2 + RowEdgeSecond], [cos(Angle + rad(90)) * Length2 + ColumnEdgeSecond,cos(Angle - rad(90)) * Length2 + ColumnEdgeSecond])
dev_display (Fuse)
dev_set_color ('red')
dev_display (EdgeFirst)
dev_set_color ('green')
dev_display (EdgeSecond)
dev_set_color ('blue')
if (i == 0)
set_tposition (WindowID, RowEdgeFirst + 5, ColumnEdgeFirst + 20)
else
set_tposition (WindowID, RowEdgeFirst - 40, ColumnEdgeFirst + 20)
endif
write_string (WindowID, 'width: ' + IntraDistance + ' pix')
endfor
*保存程序后,会在程序的同级目录生成文件。
write_measure (MeasureHandle, '123.msr')
close_measure (MeasureHandle)
read_measure ('123.msr', MeasureHandle)
*串行化测量句柄
serialize_measure (MeasureHandle, SerializedItemHandle)
deserialize_measure (SerializedItemHandle, MeasureHandle1)
open_file ('filename', 'output_binary', FileHandle)
fwrite_serialized_item (FileHandle, SerializedItemHandle)
close_file (FileHandle)
clear_serialized_item (SerializedItemHandle)
close_measure (MeasureHandle)
*移动测量位置后,再次测量
translate_measure (MeasureHandle1, Row, Column+Length2*2)
measure_pairs (Fuse, MeasureHandle1, 1, 1, 'negative', 'all', RowEdgeFirst, ColumnEdgeFirst, AmplitudeFirst, RowEdgeSecond, ColumnEdgeSecond, AmplitudeSecond, IntraDistance, InterDistance)
gen_contour_polygon_xld (EdgeFirst, [-sin(Angle + rad(90)) * Length2 + RowEdgeFirst[0],-sin(Angle - rad(90)) * Length2 + RowEdgeFirst[0]], [cos(Angle + rad(90)) * Length2 + ColumnEdgeFirst[0],cos(Angle - rad(90)) * Length2 + ColumnEdgeFirst[0]])
gen_contour_polygon_xld (EdgeSecond, [-sin(Angle + rad(90)) * Length2 + RowEdgeSecond[1],-sin(Angle - rad(90)) * Length2 + RowEdgeSecond[1]], [cos(Angle + rad(90)) * Length2 + ColumnEdgeSecond[1],cos(Angle - rad(90)) * Length2 + ColumnEdgeSecond[1]])
dev_display (Fuse)
dev_display (ROI)
dev_display (EdgeFirst)
dev_display (EdgeSecond)
例程执行结果为:
工业视觉一维测量相关函数基本使用
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|