“回归主线剧情”
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)