前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【测量篇】(4)2D测量(计量)

【测量篇】(4)2D测量(计量)

作者头像
threeQing
发布2019-07-28 15:09:54
2.2K0
发布2019-07-28 15:09:54
举报

“回归主线剧情”

2D测量,顾名思义,是在两个方向的测量即x、y(行、列)方向,最常见是直线、圆、椭圆的相关几何参数测量,其测量流程与1D测量类似的。


1

测量流程

2

2D测量算子

create_metrology_model( : : : MetrologyHandle)

描述:创建一个计量模型

参数:

MetrologyHandle:创建计量模型句柄

set_metrology_model_image_size( : : MetrologyHandle, Width, Height :)

描述:设置执行二维计量的待测图片的尺寸

参数:

MetrologyHandle:计量模型句柄

Width:图像宽

Height :图像高

add_metrology_object_line_measure( : : MetrologyHandle, RowBegin,ColumnBegin, RowEnd, ColumnEnd, MeasureLength1, MeasureLength2,MeasureSigma, MeasureThreshold, GenParamName, GenParamValue : Index)

描述:添加一个直线型测量对象到计量模型中。

参数:

MetrologyHandle计量模型句柄

RowBegin直线起始行坐标

ColumnBegin直线起始列坐标

RowEnd直线终止行坐标

ColumnEnd直线终止列坐标

MeasureLength1测量区域和直线边界垂直的边的一半

MeasureLength2测量区域另一边的一半

MeasureSigma高斯平滑算法的Sigma值

MeasureThreshold边缘阈值

GenParamName一般参数名称

GenParamValue 一般参数的值

Index创建的测量模型的索引值

set_metrology_model_param( : : MetrologyHandle, GenParamName,GenParamValue : )

描述:设置计量对象的参数。

参数:

MetrologyHandle:测量句柄

GenParamName:一般参数名字

GenParamValue :一般参数的值

align_metrology_model( : : MetrologyHandle, Row, Column, Angle : )

描述:对齐计量模型。此算子在原点位于左上角的图像坐标系下,旋转和移动计量模型,在调用apply_metrology_model之前,确保计量模型的位置和方向与当前图像中要测量的对象相适应。

参数:

MetrologyHandle:计量模型句柄

Row:需要对齐的行坐标

Column:需要对齐的列坐标

Angle 需要对齐的旋转角度

apply_metrology_model(Image : : MetrologyHandle : )

描述:定位计量对象的边缘。

参数:

Image :输入图像

MetrologyHandle :提供计量模型句柄

get_metrology_object_result( : : MetrologyHandle, Index, Instance,GenParamName, GenParamValue : Parameter)

描述:获取apply_metrology_model算子的测量结果。

参数:

MetrologyHandle:计量模型句柄

Index:计量对象索引

Instance:计量对象实例

GenParamName:参数名称

GenParamValue 参数值

Parameter:输出结果值

get_metrology_object_result_contour( : Contour : MetrologyHandle, Index,Instance, Resolution : )

描述:获取由apply_metrology_model在图像坐标中执行测量的结果轮廓。

参数:

Contour 测量对象的轮廓线

MetrologyHandle:计量对象句柄

Index:计量对象索引

Instance:计量对象实例

Resolution 相邻轮廓线点之间的距离

get_metrology_object_measures( : Contours : MetrologyHandle, Index,Transition : Row, Column)

描述:获取由add_metrology_object_circle/ellipse/line/rectange2_measure等算子创建计量对象的测量区域轮廓和边缘定位结果。

参数:

Contours 测量区域的矩形轮廓

MetrologyHandle:计量模型句柄

Index:计量对象索引

Transition 边缘过渡方式

Row:定位到边缘点的行坐标

Column:定位到边缘点的列坐标

clear_metrology_model( : : MetrologyHandle : )

描述:清除某一个计量模型,释放其占用的内存空间。

参数:

MetrologyHandle 计量模型句柄

以及一些二维距离计算算子如下表所示:

3

实例分析--钻石角度测量

读图原图,测量钻石顶部夹角

初始化操作

设置钻石顶部大概的感兴趣区域ROI

创建两条线模型

设置计量模型的参考坐标系,后续需要将此坐标系与测量图像进行对齐操作

代码语言:javascript
复制
*---------------创建测量线模型------------* 创建计量模型数据结构create_metrology_model (MetrologyHandle)*图像大小是预先设置的,以加快第一次调用apply_metrology_modelset_metrology_model_image_size (MetrologyHandle, Width, Height)* 确定计量线对象的参数LineRow1 := [155,155]LineColumn1 := [400,400]LineRow2 := [290,290]LineColumn2 := [230,570]Tolerance := 20* * 增加两个线模型,并设置参数add_metrology_object_line_measure (MetrologyHandle, LineRow1, LineColumn1, LineRow2, LineColumn2, Tolerance, 10, 1, 20, [], [], Index1)
*---------------设置测量ROI,设置计量模型参考坐标系------------* 创建匹配感兴趣区域gen_rectangle1 (Rectangle, LineRow1[0] - 40, LineColumn1[0] - 50, LineRow1[0] + 20, LineColumn1[0] + 50)*更改计量模型的参考坐标系reduce_domain (Image, Rectangle, ImageReduced)threshold (ImageReduced, Region, 128, 255)get_region_points (Region, Rows, Columns)set_metrology_model_param (MetrologyHandle, 'reference_system', [Rows[0],Columns[0],0])

由于计量模型参考坐标系重新设置,此时需要在应用计量模型测量前,将被测对象与计量模型对齐,使用算子align_metrology_model

然后再调用apply_metrology_model算子应用测量,通过get_metrology_object_result获取测量结果

代码语言:javascript
复制
*将当前测量对象对齐计量模型    *在应用apply_metrology_model之前需要调用此算子    align_metrology_model (MetrologyHandle, Rows[0], Columns[0], 0)        *应用计量对象模型    * 定位计量对象的边缘    apply_metrology_model (Image, MetrologyHandle)        *得到计量结果    *获取两条线的始终坐标    get_metrology_object_result (MetrologyHandle, 'all', 'all', 'result_type', 'all_param', LineParameter)       *计算夹角    *计算两条线之间的夹角    angle_ll (LineParameter[0], LineParameter[1], LineParameter[2], LineParameter[3], LineParameter[4], LineParameter[5], LineParameter[6], LineParameter[7], Angle)    Angle := deg(Angle)

可视化测量结果

显示轮廓线、线夹角圆弧、测量区域、测量夹角

完整注释代

代码语言:javascript
复制
*公众号:机器视觉那些事儿*1. 算法功能:测量钻石边缘的夹角*2. 算法思路:*      (1)初始化*             *读图,提取ROI区域图像*             *创建测量线模型*             *设置测量ROI,设置计量模型参考坐标系*      (2)应用计量对象,得到测量结果*             *显示初始化*             *将当前测量对象与计量模型对齐*             *应用计量对象模型*             *得到计量结果*             *计算夹角*      (3)结果显示*             *可视化轮廓线*             *可视化线夹角圆弧*             *可视化测量区域
* --------------- (1)初始化-----------------------
*---------------显示初始化------------* 初始化显示参数dev_update_off ()dev_close_window ()read_image (Image, 'diamond/diamond_01')dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)set_display_font (WindowHandle, 16, 'mono', 'true', 'false')get_image_size (Image, Width, Height)
*---------------创建测量线模型------------* 创建计量模型数据结构create_metrology_model (MetrologyHandle)*图像大小是预先设置的,以加快第一次调用apply_metrology_modelset_metrology_model_image_size (MetrologyHandle, Width, Height)* 确定计量线对象的参数LineRow1 := [155,155]LineColumn1 := [400,400]LineRow2 := [290,290]LineColumn2 := [230,570]Tolerance := 20* * 增加两个线模型,并设置参数add_metrology_object_line_measure (MetrologyHandle, LineRow1, LineColumn1, LineRow2, LineColumn2, Tolerance, 10, 1, 20, [], [], Index1)
*---------------设置测量ROI,设置计量模型参考坐标系------------* 创建匹配感兴趣区域gen_rectangle1 (Rectangle, LineRow1[0] - 40, LineColumn1[0] - 50, LineRow1[0] + 20, LineColumn1[0] + 50)*更改计量模型的参考坐标系reduce_domain (Image, Rectangle, ImageReduced)threshold (ImageReduced, Region, 128, 255)get_region_points (Region, Rows, Columns)set_metrology_model_param (MetrologyHandle, 'reference_system', [Rows[0],Columns[0],0])* * 主循环* for I := 1 to 5 by 1    *---------------(2)应用计量对象,得到测量结果------------        *读图,提取ROI区域图像    read_image (Image, 'diamond/diamond_' + I$'02')    * 粗略地分割钻石顶部位置    reduce_domain (Image, Rectangle, ImageReduced)    threshold (ImageReduced, Region, 128, 255)        *将当前测量对象与计量模型对齐    *提取钻石顶部区域点坐标    get_region_points (Region, Rows, Columns)    *将当前测量对象对齐计量模型    *在应用apply_metrology_model之前需要调用此算子    align_metrology_model (MetrologyHandle, Rows[0], Columns[0], 0)        *应用计量对象模型    * 定位计量对象的边缘    apply_metrology_model (Image, MetrologyHandle)        *得到计量结果    *获取两条线的始终坐标    get_metrology_object_result (MetrologyHandle, 'all', 'all', 'result_type', 'all_param', LineParameter)       *计算夹角    *计算两条线之间的夹角    angle_ll (LineParameter[0], LineParameter[1], LineParameter[2], LineParameter[3], LineParameter[4], LineParameter[5], LineParameter[6], LineParameter[7], Angle)    Angle := deg(Angle)
    *  --------------- (3)结果显示-----------------------        *可视化轮廓线    * 得到结果线轮廓    get_metrology_object_result_contour (ResultContour, MetrologyHandle, 'all', 'all', 1.5)    *计算线交点    intersection_lines (LineParameter[0], LineParameter[1], LineParameter[2], LineParameter[3], LineParameter[4], LineParameter[5], LineParameter[6], LineParameter[7], Row, Column, IsOverlapping1)    * 计算两条线的方向    line_orientation (LineParameter[0], LineParameter[1], LineParameter[2], LineParameter[3], Orientation1)    if (Orientation1 > 0)        Orientation1 := Orientation1 - rad(180)    endif    line_orientation (LineParameter[4], LineParameter[5], LineParameter[6], LineParameter[7], Orientation2)    *     *可视化线夹角    * 可视化两条线之间的角度    *生成线之间的夹角圆弧    gen_circle_contour_xld (ContCircle, Row, Column, 100, Orientation1, Orientation2, 'positive', 1)        *可视化测量区域    *获取到测量区域和测量点    get_metrology_object_measures (Contour, MetrologyHandle, 'all', 'all', MRow, MColumn)    gen_cross_contour_xld (Cross, MRow, MColumn, 6, rad(45))        * 显示所有内容    dev_display (Image)    dev_set_line_width (1)    dev_set_color ('yellow')    dev_display (Contour)    dev_display (Cross)    dev_set_line_width (2)    dev_set_color ('green')    dev_display (ResultContour)    dev_set_color ('blue')    dev_display (ContCircle)    disp_message (WindowHandle, 'Angle = ' + Angle$'.5' + '°', 'window', 12, 12, 'black', 'true')    if (I < 5)        disp_continue_message (WindowHandle, 'black', 'true')    endif    stop ()endfor* 释放内存clear_metrology_model (MetrologyHandle)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器视觉那些事儿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档