视觉进阶:2D Metrology(二维计量)

二维计量功能简单的说就是找几种几何形状 ,包括:圆形,椭圆形,矩形和线条 

例如,从图一中找到3个圆和一个矩形。

image.png

(图1)


image.png

(图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)


image.png

(图3)


由于只添加了圆的计量对象,所以矩形没有被正确找出。

image.png

(图4)


几点说明:


  1. 屏幕顶行输出的Parameter值有四个,由于没分隔符,它们内容为:

     image.png

    这个值是什么鬼?它是radius。
    上面的圆,勇哥是用phoshop精准的绘制的直径为100个像素。

  2. 上面的3个圆是同时被处理的,也就是说二维测量的算子参数可以接受数组。


示例 2


勇哥以图片1做例子,找3个圆和一个矩形。

image.png


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
版权声明:本文为博主原创文章,转载请附上博文链接!

本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
  • 评论列表:
  •  访客
     发布于 2020-05-25 11:17:36  回复该评论
  • 在示例2中,若
    *找矩形
    row1:=180
    col1:=160
    以上的参数值稍微变了一下,就不能够正确获得矩形框位置,这个该如何处理,请教一下勇哥,望指教。
  •  ZGL
     发布于 2021-12-03 15:58:44  回复该评论
  • 勇哥有measure_pos为什么还要出Metrology?我的理解是Metrology找线功能measure_pos可以替代,但是Metrology找圆,找矩形才是拿手好戏比用边缘算子找边拟合要稳定。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864