一, 测量模型查找直线 、圆、矩形等
1,导入检测相关数据和代码
read_image(Image, 'printer_chip/printer_chip_01')
dev_set_draw('margin')
dev_set_line_width(3)
dev_get_window(WindowHandle) //获取窗口句柄
get_image_size(Image, Width, Height) //获取图片尺寸大小
//
//根据ROI绘制感兴趣区域
gen_region_line(RegionLines, 20.4301, 1355.51, 274.731, 1355.51)
2, 创建测量对象
create_metrology_model (MetrologyHandle) //创建测量对象句柄
3,设置测量对象的宽度和高度
set_metrology_model_image_size(MetrologyHandle, Width, Height)
4, 添加测量形状
参数2 测量形状
*Line后跟: 起点和终点坐标
*Circle后跟: 圆心坐标和半径
*参数3 需要根据测量形状设置参数
*参数4 测量长度 卡尺长度
*参数5 测量宽度 卡尺的宽度
*参数6, 平滑程度
*参数7, 测量阈值
*参数8,9 预留参数
*参数10 测量对象的索引值 Index会自动增加
add_metrology_object_param(MetrologyHandle,line,[20.4301, 1355.51, 274.731, 1355.51], 20, 20,1,30,[ ] ,[ ], Index)
5, 设置卡尺的采样数量 num_measures
参数2 , Index 写成all代表所有测量对象
参数3: 测量时,使用多少个采样点
参数4: 采样点
set_metrology_object_param(MetrologyHandle, 'all', 'num_measures', 6)
6, 设置极性
参数3: 边缘过渡类型
参数4: 所有边缘类型(positive,negative)
set_metrology_object_param(MetrologyHandle, 'all', 'measure_transition', 'all')
7,设置最大的实例个数 最大数量 num_instances 设置线的最大个数
参数4: 最多查找 候选边缘个数
set_metrology_object_param (MetrologyHandle, 'all', 'num_instances', 30)
8,使用测量模型
apply_metrology_model(Image, MetrologyHandle)
9,获取测量结果
【1】,获取找到的点
gen_cross_contour_xld(Cross, Row, Column, 6, 0.7853)
【2】,把测量模型里所有测量对象(直线 / 圆 / 矩形)的轮廓 提取出来,存到 Contour 里
参数4:图像光滑程度
数字越小,轮廓越光滑、点越密
数字越大,轮廓越稀疏
常用:1.0 ~ 2.0
你写 1.5 = 标准光滑轮廓
get_metrology_object_model_contour( Contour, MetrologyHandle, 'all', 1.5 )
【3】,把测量完成后、拟合出来的【最终精准几何轮廓】提取出来! 也就是 实际检测到的直线 / 圆 / 矩形
get_metrology_object_result_contour (Contour1, MetrologyHandle, 'all', 'all', 1.5)
二,模板匹配+模板定位 +测量
1,前期准备
read_image (Image, 'C:/Users/20710/Desktop/Image/dip_switch/dip_switch_01.png')
get_image_size (Image, Width, Height)
dev_get_window (WindowHandle)
dev_set_draw ('margin')
dev_set_color ('green')
dev_display (Image)
stop ()
2,模板匹配
【1】,绘制ROI区域 左边画一条线 并显示
draw_line (WindowHandle, Row1, Column1, Row2, Column2) //左边画一条线
gen_region_line (RegionLines, Row1, Column1, Row2, Column2) //显示画出的左边线
dev_display (RegionLines)

【2】,右边画一条线 并显示
draw_line (WindowHandle, Row11, Column11, Row21, Column21) //右边画一条线
gen_region_line (RegionLines1, Row11, Column11, Row21, Column21)
dev_display (RegionLines1)

【3】,绘制模板匹配区域
draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
reduce_domain (Image, Rectangle, ImageReduced)

【4】,制作模板
create_shape_model (ImageReduced, 'auto', rad(0),rad(360), 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
【5】,找模板
ImageReduced, // 在哪张图找
ModelID, // 找哪个模板
rad(0), rad(360), // 旋转范围:
0~360度 0.5, // 最小缩放
1, // 最大缩放
0.5, // 最小分数(相似度)
'least_squares',// 亚像素精度模式
0, // 金字塔层数
0.9, // 贪婪度(速度/精度)
Row3, Column3, // 输出:找到的中心坐标
Angle, // 输出:角度
Score // 输出:匹配分数
find_shape_model (ImageReduced, ModelID, rad(0),rad(360), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row3, Column3, Angle, Score)
stop()
3,创建左右找线工具
1,创建测量句柄
create_metrology_model (MetrologyHandle) //测量句柄
2,设置测量图像大小
set_metrology_model_image_size (MetrologyHandle, Width, Height) //设置测量图像大小
3,添加测量形状
add_metrology_object_generic (MetrologyHandle, 'line', [[ Row1, Column1, Row2, Column2],[ Row11, Column11, Row21, Column21]], 20, 5, 1, 5, [], [], Index) //添加测量形状
4,使用测量模型
apply_metrology_model (Image, MetrologyHandle) //使用测量模型
5,获取卡尺轮廓
get_metrology_object_measures (Contours, MetrologyHandle, 'all', 'all', Row4, Column4)
6,获取一个实际测量的边
get_metrology_object_result_contour (Contour, MetrologyHandle, 'all', 'all', 1.5)
7,绑定坐标系
**reference_system 绑定坐标系
Row3,Column3,0\] 第一张模板匹配的坐标和角度** > **set_metrology_model_param (MetrologyHandle, 'reference_system', \[Row3,Column3,0\])** *** ** * ** *** ### **4,显示** > **dev_display (Image)** > > **\*展示匹配图 最后一个参数,表示只显示轮廓 > dev_display_shape_matching_results (ModelID, 'pink', Row3, Column3, Angle, 1, 1, 0)** > > **\*卡尺轮廓 > dev_display (Contours)** > > **\*实际找到的边 > dev_display (Contour)** *** ** * ** *** ### 5,添加测试图 #### 1,传入文件夹导入图片 并显示 > **for Index1 := 0 to \|Files\|-1 by 1 > read_image (Image1, Files\[Index1\]) > dev_display (Image1)** #### 2,找模板 > **find_scaled_shape_model (Image1, ModelID, rad(0),rad(360), 0.5, 1.1, 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row5, Column5, Angle1, Scale, Score1)** > #### 3,对齐模板 相当与 VP的定位功能 > **align_metrology_model(MetrologyHandle, Row5 ,Column5, Angle1)** #### 4, 使用测量模型 > **apply_metrology_model (Image1, MetrologyHandle)** #### 5,测量距离 **【1】,Parameter 第一条线的起始坐标和结束坐标** > **get_metrology_object_result (MetrologyHandle, 0, 'all', 'result_type', 'all_param', Parameter) > gen_region_line (RegionLines1, Parameter\[0\],Parameter\[1\],Parameter\[2\], Parameter\[3\])** 【2】,**Parameter1 第一条线的起始坐标和结束坐标** > **get_metrology_object_result (MetrologyHandle, 0, 'all', 'result_type', 'all_param', Parameter) > gen_region_line (RegionLines1, Parameter\[0\],Parameter\[1\],Parameter\[2\], Parameter\[3\])** #### 6,测量两区域之间最小距离 > **distance_rr_min (RegionLines1, RegionLines2, MinDistance, Row12, Column12, Row22, Column22)** > #### 7,画一个水平线 > **gen_region_line (RegionLines3, Parameter\[0\]+20, Parameter\[1\], Parameter1\[0\]+20, Parameter1\[1\])** #### 8,获取循环里面的卡尺轮廓图 实际测量轮廓 > **get_metrology_object_measures (Contours1, MetrologyHandle, 'all', 'all', Row6, Column6)** > > **get_metrology_object_result_contour (Contours1, MetrologyHandle, 'all', 'all', Row6, Column6)** > #### 9, 显示,和这段代码的结尾 > **dev_display (Image1) > dev_display (Contours1) > dev_display (Contour1) > dev_display (RegionLines3) > dev_disp_text ('物体宽度:'+MinDistance, 'image', 100, 100, 'black', \[\], \[\]) > stop () > endfor** ### 结果1: 结果2:  