二维计量功能简单的说就是找几种几何形状 ,包括:圆形,椭圆形,矩形和线条
例如,从图一中找到3个圆和一个矩形。

(图1)

(图2)
引用一下官方的一段说明:
二维计量的基本原理 通常,对于2D度量,必须提供要测量的对象的位置,方向和几何形状的近似值。 在显示对象的图像内,这些近似对象的边界用于定位对象的真实边缘以适应几何形状的参数, 使得它们最佳地适合图像数据。 测量结果是优化的参数。计量模型用于存储所有必要的信息, 例如计量对象的位置和几何形状的初始参数,控制测量的参数以及测量结果。 可以通过2D计量测量的几何形状包括圆形,椭圆形,矩形和线条。 图像中对象的边缘位于所谓的测量区域内。这些是矩形区域, 其垂直于近似物体的边界布置,使得它们的中心位于边界上。 调整测量区域的尺寸和分布的参数与每个测量对象的近似形状参数一起指定。 当应用测量时,使用RANSAC算法确定所有测量区域内的边缘位置并使其适合几何形状。 如图2所示,计量模型包含7个显示为蓝色轮廓的计量对象。 使用位于测量区域(灰色矩形)内的边缘(青色十字)用于每个计量对象, 拟合几何形状(绿色轮廓)并测量它们的参数。 如针对圆形的计量对象所示,可以找到一个以上的计量对象实例。
二维计量的使用流程
(1)创建计量模型
create_metrology_model
(2)指定将在其中执行测量的图像的图像大小
set_metrology_model_image_size
这个算子是出于效率原因,最好被调用。
(3)计量对象被添加到计量模型中
下面添加计量对象的算子分别为:圆,椭圆,矩形,线
最后一个算子add_metrology_object_generic可以由用户自己指定shape,取值 ('circle', 'ellipse', 'line', 'rectangle2')
add_metrology_object_circle_measure for circles
add_metrology_object_ellipse_measure for ellipses
add_metrology_object_rectangle2_measure for rectangles
add_metrology_object_line_measure for lines
add_metrology_object_generic
(4)修改模型参数
set_metrology_model_param
(5)修改对象参数
set_metrology_object_param
(6)对齐计量模型
align_metrology_model
(7)应用测量
apply_metrology_model
(8)访问结果
get_metrology_object_result 查询对象的适应几何形状的参数
get_metrology_object_measures 访问所有定位边的行和列坐标
get_metrology_object_result_contour 提供了作为XLD轮廓的适应几何形状的可视化
(9)清理记忆
clear_metrology_model
示例1:
dev_close_window()
read_image (Image, 'F:/长宽100像素的矩阵和圆副本.bmp')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display(Image)
*创建测量模型
create_metrology_model (MetrologyHandle)
*设置测量图像大小
set_metrology_model_image_size (MetrologyHandle, Width, Height)
*阈值图像处理
threshold (Image, Region, 200, 256)
*联通区域
connection (Region, ConnectedRegions)
*特征选择
select_shape (ConnectedRegions, SelectedRegions, ['area','roundness'], 'and', [4000,0.8], [1.85993e+006,1])
*获取圆的中心的面积
area_center (SelectedRegions, Area, Row, Column)
*显示图片
dev_set_color ('green')
dev_set_draw ('margin')
dev_display (Image)
r:=[80,80,80,80]
*生成圆
gen_circle (Circle, Row[0], Column[0],80)
*添加圆到测量模型中
add_metrology_object_circle_measure (MetrologyHandle, Row, Column, r, 100, 5, 1.5, 30, ['measure_transition','min_score'], ['all',0.4], Index)
*测量并拟合几何形状
apply_metrology_model (Image, MetrologyHandle)
*获取测量模型里的测量轮廓
get_metrology_object_result_contour (Contour, MetrologyHandle, 'all', 'all', 1.5)
*获取测量结果
get_metrology_object_result (MetrologyHandle, 'all', 'all', 'result_type', 'radius', Parameter)
dev_display (Contour)
set_tposition (WindowHandle,0, 0)
write_string (WindowHandle, Parameter)
clear_metrology_model(MetrologyHandle)
(图3)
由于只添加了圆的计量对象,所以矩形没有被正确找出。

(图4)
几点说明:
屏幕顶行输出的Parameter值有四个,由于没分隔符,它们内容为:

这个值是什么鬼?它是radius。
上面的圆,勇哥是用phoshop精准的绘制的直径为100个像素。上面的3个圆是同时被处理的,也就是说二维测量的算子参数可以接受数组。
示例 2
勇哥以图片1做例子,找3个圆和一个矩形。

read_image(Image, 'C:/Users/Administrator/Desktop/二维测量例子1.png')
get_image_size(Image, Width, Height)
dev_set_draw ('margin')
row:=[59,178,296]
col:=[334,334,334]
r1:=[50,50,50]
dev_set_color ('green')
*取外圆
create_metrology_model(MetrologyHandle)
set_metrology_model_image_size(MetrologyHandle, Width, Height)
*gen_circle(Circle1, row[0], col[0], r1[0])
*gen_circle(Circle2, row[1], col[1], r1[1])
*gen_circle(Circle3, row[2], col[2], r1[2])
add_metrology_object_circle_measure(MetrologyHandle, row, col, r1, 15, 5, 1, 4, ['measure_transition','min_score'], ['all',0.2], Index)
apply_metrology_model(Image, MetrologyHandle)
get_metrology_object_result(MetrologyHandle, 0, 'all', 'result_type', 'radius', Parameter1)
get_metrology_object_result(MetrologyHandle, 1, 'all', 'result_type', 'radius', Parameter2)
get_metrology_object_result(MetrologyHandle, 2, 'all', 'result_type', 'radius', Parameter3)
get_metrology_object_result_contour(Contour1, MetrologyHandle, 0, 'all', 1.5)
get_metrology_object_result_contour(Contour2, MetrologyHandle, 1, 'all', 1.5)
get_metrology_object_result_contour(Contour3, MetrologyHandle, 2, 'all', 1.5)
dev_set_color ('gray')
*get_metrology_object_measures(ContoursD, MetrologyHandle, 'all', 'all', Row, Column)
dev_set_color ('green')
dev_display(Contour1)
dev_display(Contour2)
dev_display(Contour3)
clear_metrology_model(MetrologyHandle)
*取内圆
create_metrology_model(MetrologyHandle)
set_metrology_model_image_size(MetrologyHandle, Width, Height)
r2:=[29,29,29]
* gen_circle(Circle4, row[0], col[0], r2[0])
* gen_circle(Circle5, row[1], col[1], r2[1])
* gen_circle(Circle6, row[2], col[2], r2[2])
add_metrology_object_circle_measure(MetrologyHandle, row, col, r2, 15, 5, 1, 4, ['measure_transition','min_score'], ['all',0.2], Index)
apply_metrology_model(Image, MetrologyHandle)
get_metrology_object_result(MetrologyHandle, 0, 'all', 'result_type', 'radius', Parameter4)
get_metrology_object_result(MetrologyHandle, 1, 'all', 'result_type', 'radius', Parameter5)
get_metrology_object_result(MetrologyHandle, 2, 'all', 'result_type', 'radius', Parameter6)
get_metrology_object_result_contour(Contour4, MetrologyHandle, 0, 'all', 1.5)
get_metrology_object_result_contour(Contour5, MetrologyHandle, 1, 'all', 1.5)
get_metrology_object_result_contour(Contour6, MetrologyHandle, 2, 'all', 1.5)
dev_set_color ('gray')
get_metrology_object_measures(ContoursD2, MetrologyHandle, 'all', 'all', Row, Column)
dev_set_color ('green')
dev_display(Contour4)
dev_display(Contour5)
dev_display(Contour6)
clear_metrology_model(MetrologyHandle)
*找矩形
row1:=180
col1:=160
phi:=0
len1:=110
len2:=110
create_metrology_model(MetrologyHandle)
set_metrology_model_image_size(MetrologyHandle, Width, Height)
add_metrology_object_rectangle2_measure(MetrologyHandle, row1, col1, phi, len1, len2, 15, 5, 1, 3, ['min_score'], [0.2], Index3)
apply_metrology_model(Image, MetrologyHandle)
get_metrology_object_result(MetrologyHandle, 0, 'all', 'result_type', 'all_param', Parameter4)
get_metrology_object_result_contour(Contour6, MetrologyHandle, 0, 'all', 1.5)
dev_set_color ('gray')
get_metrology_object_measures(ContoursD3, MetrologyHandle, 'all', 'all', Row, Column)
dev_set_color ('green')
dev_display(Contour6)
clear_metrology_model(MetrologyHandle)勇哥总结几点:
(1)二维测量的这些算子,halcon10是不存在的,貌似是halcon17里才有的(说错了各位请指点一下)
2020/5/25勇哥注: 注意,halcon12就已经有了二维测量
那么问题来了,如果低版本的halcon又是如何找线的呢? 答案是使用算子measure_pos。
请参考勇哥之前写的一个贴子《Halcon学习(27-2)halcon测量技术:找线 》
(2)有关二维测量找线的例子,请参考勇哥之前的贴子《halcon17的找线功能》
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!


少有人走的路


















