专栏首页机器视觉那些事儿【测量篇】(4)2D测量(计量)

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

“回归主线剧情”

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

创建两条线模型

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

*---------------创建测量线模型------------* 创建计量模型数据结构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获取测量结果

*将当前测量对象对齐计量模型    *在应用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)

可视化测量结果

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

完整注释代

*公众号:机器视觉那些事儿*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)

本文分享自微信公众号 - 机器视觉那些事儿(jiqishijue),作者:threeQing

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【测量篇】(3)标定+定位+1D测量综合实例

    在后台收到信息,莫名其妙被人投诉了,不知触犯了哪些人的利益,本人依然会本着分享交流的精神,共促行业的繁荣。如果您能一路跟过来,halcon视觉入门到提高,完全没...

    threeQing
  • 凹坑缺陷检测

    threeQing
  • 【相机标定篇】Halcon标定助手逐步使用(2)

    最近一直在现场做一个比较重要的项目,也近两个月了,深入自动化行业愈久,愈发觉得此行业的艰辛,也更加希望国家在资源上能更倾向此行业。可能西方国家早已在二战...

    threeQing
  • 上周六,我们和1000多名开发者聊了聊营销风控

    上周六,首届“腾讯云+社区开发者大会”在北京举行。从全国各地赶来的40多位技术专家、1000多名开发者畅聊云端新趋势、新技术、新应用。 在主论坛上,腾讯云业务...

    腾讯云安全
  • 【Dart 专题】Factory 工厂构造函数

    和尚学习 Flutter 有一段时间,虽可以应用基本的 Dart 语法,但对于一些特殊的语法还是很陌生,和尚准备开一个小的【Dart 专题】记录一些...

    阿策小和尚
  • Nginx技术(附软件分享)

    2、修改每个文件夹内的里面的index.html,使其具有辨识度 3、修改Nginx的配置文件nginx.conf , 根据情况修改server_name...

    时间静止不是简史
  • Linux的VI编辑器

    :q     退出    :q!    强行退出(不存盘)    :wq   强制性写入文件并退出。即使文件没有被修改也强制写入,并更新文件的修改时间。  :x...

    阳光岛主
  • MySQL与PostgreSQL对比

    网上已经有很多拿PostgreSQL与MySQL比较的文章了,这篇文章只是对一些重要的信息进行下梳理。在开始分析前,先来看下这两张图:

    MickyInvQ
  • C++编程思想重点笔记

    引申:如何在const成员函数里修改成员 —— 按位和与按成员const 如果我们想要建立一个const成员函数,但仍然想在对象里改变某些数据,这时该怎...

    bear_fish
  • 2011黑客事件更新(2)

    首先感谢邵老师今天中午12:11到12:22的电话,让我终于能和母校得以联系并说出自己的感想。

    崔文远TroyCui

扫码关注云+社区

领取腾讯云代金券