31.6、几何定位---实例一(匹配助手)
例子一:定位助手(Matching)应用
1、打开
菜单------助手-----打开新的Matching
2、模板准备
(1)、可以加载以前保存过模板,直接使用之前保存过的边缘轮廓特征。如上图①。
注:通过这种方法来加载的轮廓只会在图像窗口中看到它的边缘轮廓,看不到创建创建边缘轮廓的图像。
(2)、创建模板。可以从指定的路径传入图像文件来创建模板,也可以从图像采集助手后去图像来创建模板。如
上图②。读入图像后,图形窗口会显示这张图像,这是助手中的黄色区域的参数是不可设置的。
注:下面所有过程的创建模板是使用从电脑中读入图像创建,而不是直接从电脑中加载模板
3、绘制模板ROI。
当用鼠标绘制完ROI后,助手会自动调整黄色区域的参数,并创建出相应的边缘轮廓信息,显示到图像窗口上。
3、通过减少ROI区域来屏蔽一些轮廓特征。
先选择"差集"模式,在绘制第二个ROI,右键单击确定后如下图。
4、查看金字塔级别效果.
设置这一栏参数只是起到一个观察的作用,方便下面调创建模板时的金字塔级别(一般用默认就可以了)和查找
模板时的级别。
5、根据前面的理论知识和实际需求来设置模板参数。
一般常用设置红色框中参数,其他使用默认即可。
6、模板使用:
可以用电脑指定路径中加载图像,也可以从图像采集助手中加载图像。
7、查找模板
勾选上"总是找到"选项,则会鼠标点击下图鼠标所在位置的图像时会马上自动查找模板,若找到模板,会在助
手最下面显示找到模板的一些信息如它的分数以及耗时、缩放大小等并显示轮廓到图形窗口中;若找不到,助手最下面也会显示找不到模板。
注:应该手动点击每一种图像,看是否能全部找到模板,假如有一些找不到,可以相应设置一下上图黄色区域的
参数,常用的有最小分数,匹配个数,贪心算法,重叠度。假设对自己设置的上图黄色区域的参数不是很满意,可以选址执行优化,让助手自动帮你调整相应参数。
①在执行优化前设置的参数如下图(下图参数设置能全部找到模板)
②执行优化后它自动调整了最小分数(变大)和贪心算法(变大)。即在指定的识别率和匹配个数情况下(黄色区
域),自动它最小分数和贪心算法调大,因为它们变大可以节省时间。
8、检测
用来检测识别率以及统计一些匹配参数的。
9、插入代码:
10、代码分析:
* 设置出边界模式为FALSE
set_system ('border_shape_models', 'false')
* 读入图像
read_image (Image, 'C:/ww/Capture2013-9-22 11-19-17-546.jpg')
*创建模板ROI,为了节省篇幅,删除了gen_region_runs中的一些坐标值
gen_region_runs (ModelRegion, [1060,1059,1054,1052,1042])
gen_region_runs (_TmpRegion, [1070,1068,1067,1065,1064,1062])
difference (ModelRegion, _TmpRegion, ModelRegion)
* 从原图像中剪裁模板ROI指定区域
reduce_domain (Image, ModelRegion, TemplateImage)
* 创建模板
create_scaled_shape_model (TemplateImage, 6, rad(-180), rad(360), rad(0.3511), 0.6, 1.4, 0.0061, ['point_reduction_high','no_pregeneration'], 'use_polarity', [41,49,4], 4, ModelId)
* 获取模板轮廓
get_shape_model_contours (ModelContours, ModelId, 1)
* 查找模板
find_scaled_shape_model (Image, ModelId, rad(-180), rad(360), 0.6, 1.4, 0.3, 1, 0.5, 'least_squares', [6,1], 1, ModelRow, ModelColumn, ModelAngle, ModelScale, ModelScore)
* 遍历找到的个数
for MatchingObjIdx := 0 to |ModelScore| - 1 by 1
hom_mat2d_identity (HomMat)
hom_mat2d_scale (HomMat, ModelScale[MatchingObjIdx], ModelScale[MatchingObjIdx], 0, 0, HomMat)
hom_mat2d_rotate (HomMat, ModelAngle[MatchingObjIdx], 0, 0, HomMat)
hom_mat2d_translate (HomMat, ModelRow[MatchingObjIdx], ModelColumn[MatchingObjIdx], HomMat)
affine_trans_contour_xld (ModelContours, TransContours, HomMat)
dev_display (TransContours)
endfor
* 销毁句柄内存
clear_shape_model (ModelId)
11、改进
上面代码中只会加载一幅图像,为了加载一个文件夹中的所有图像并检测,可以做一下修改
* 设置出边界模式为FALSE
set_system ('border_shape_models', 'false')
* 读入图像
read_image (Image, 'C:/ww/Capture2013-9-22 11-19-17-546.jpg')
*创建模板ROI,为了节省篇幅,删除了gen_region_runs中的一些坐标值
gen_region_runs (ModelRegion, [1060,1059,1054,1052,1042])
gen_region_runs (_TmpRegion, [1070,1068,1067,1065,1064,1062])
difference (ModelRegion, _TmpRegion, ModelRegion)
* 从原图像中剪裁模板ROI指定区域
reduce_domain (Image, ModelRegion, TemplateImage)
* 创建模板
create_scaled_shape_model (TemplateImage, 6, rad(-180), rad(360), rad(0.3511), 0.6, 1.4, 0.0061, ['point_reduction_high','no_pregeneration'], 'use_polarity', [41,49,4], 4, ModelId)
* 获取模板轮廓
get_shape_model_contours (ModelContours, ModelId, 1)
* 查找模板
find_scaled_shape_model (Image, ModelId, rad(-180), rad(360), 0.6, 1.4, 0.3, 1, 0.5, 'least_squares', [6,1], 1, ModelRow, ModelColumn, ModelAngle, ModelScale, ModelScore)
* 遍历找到的个数
for MatchingObjIdx := 0 to |ModelScore| - 1 by 1
hom_mat2d_identity (HomMat)
hom_mat2d_scale (HomMat, ModelScale[MatchingObjIdx], ModelScale[MatchingObjIdx], 0, 0, HomMat)
hom_mat2d_rotate (HomMat, ModelAngle[MatchingObjIdx], 0, 0, HomMat)
hom_mat2d_translate (HomMat, ModelRow[MatchingObjIdx], ModelColumn[MatchingObjIdx], HomMat)
affine_trans_contour_xld (ModelContours, TransContours, HomMat)
dev_display (TransContours)
endfor
***************************************************************************
list_files ('C:/ww', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
read_image (Image, ImageFiles[Index])
* Do something
find_scaled_shape_model (Image, ModelId, rad(-180), rad(360), 0.6, 1.4, 0.3, 1, 0.5, 'least_squares', [6,1], 1, ModelRow, ModelColumn, ModelAngle, ModelScale, ModelScore)
* 遍历找到的个数
for MatchingObjIdx := 0 to |ModelScore| - 1 by 1
hom_mat2d_identity (HomMat)
hom_mat2d_scale (HomMat, ModelScale[MatchingObjIdx], ModelScale[MatchingObjIdx], 0, 0, HomMat)
hom_mat2d_rotate (HomMat, ModelAngle[MatchingObjIdx], 0, 0, HomMat)
hom_mat2d_translate (HomMat, ModelRow[MatchingObjIdx], ModelColumn[MatchingObjIdx], HomMat)
affine_trans_contour_xld (ModelContours, TransContours, HomMat)
dev_display (TransContours)
endfor
endfor
*******************************************************************************
* 销毁句柄内存
clear_shape_model (ModelId)
注:************************之间的为新增代码
12、总结
由插入的代码中可以看出,在创建模板后使用了算子get_shape_model_contours (ModelContours, ModelId, 1)获取创建模板的轮廓,然后在找到模板后根据find_scaled_shape_model返回的角度以及中心坐标和缩放,把获取的的模板轮廓仿射变换到找到的模板上。所以找到的所有模板的轮廓都是一样的,都与创建模板的轮廓一样。