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返回的角度以及中心坐标和缩放,把获取的的模板轮廓仿射变换到找到的模板上。所以找到的所有模板的轮廓都是一样的,都与创建模板的轮廓一样。

 

 

 

 

 

 

 

 

posted @ 2022-05-31 23:33  ihh2021  阅读(180)  评论(0编辑  收藏  举报