wenluderen
论坛版主
论坛版主
  • 最后登录2017-01-13
  • 发帖数284
  • 金币4116枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
阅读:4631回复:27

图像处理番外篇:模板搜索。

楼主#
更多 发布于:2015-01-09 08:54
×××××
大版主的相关帖子:http://www.ihalcon.com/read-145.html
×××××啥叫模板搜索?
这么说吧,大家大都照过毕业照吧。。。。。。。好几十号人站在一起,乌泱泱的。。如果此时你想找到你们班花,然后怀念一下。需要把几十个头大致浏览一下。
但是如果此处你使用HALCON提供的模板匹配搜索功能就不需要一个个找了。
直接把你的班花的大头贴作为模板送给HALCOIN ,然后HALCON调用模板搜索功能即可。


×××××××××××××××××××××××××××××××××××××××××××××××××××××××××
下图是大恒公司总结的 模板搜索流程图

图片:2015-01-09_084702.jpg



用文字总结下就是:
第一步:使用函数
  gen_rectangle1() 找到要被创建为模板的区域
 reduce_domain() 将上面指令创建区域  裁剪生成一幅图像
 create_shape_model()  将这个图像生成模板(这里面的参数很多  我们后面讲)


第二步:使用函数  find_shape_model()  在目标图像里寻找 班花(也就是模板匹配了)


第三步: 有借有还 ,既然我创建模板了  使用完毕 最后也要销毁(这词太吓人了   专业转13术语叫:释放内存)


由于鄙人长的搓,我们班的历任班花质量也一般,所以就不用我的毕业照做范例。
想来想去,还是请出韩国棒子组合:少女时代。为大家制作模板搜索范例。


准备臭鸡蛋。。。。


棒子上场了。


(PS: 不喜欢棒子,抢了我们很多好东西,虽然很多时候 是因为我们自己不珍惜。但这不能成为棒子可以抢的理由。请少女时代的脑残粉 飘过)。

图片:111.jpg


wenluderen
论坛版主
论坛版主
  • 最后登录2017-01-13
  • 发帖数284
  • 金币4116枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
沙发#
发布于:2015-01-09 09:03
**第一步: 圈定自己要制作模板的区域
见下图

图片:2015-01-09_090353.jpg

wenluderen
论坛版主
论坛版主
  • 最后登录2017-01-13
  • 发帖数284
  • 金币4116枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
板凳#
发布于:2015-01-09 09:05
**第二步:将圈出的区域 生成一副图像
reduce_domain (Image, Circle, ImageReduced)


见下图:

图片:2015-01-09_090617.jpg







**第三步:生成模板
create_shape_model (ImageReduced, 'auto', 0, 0, 'auto', \
                    'auto', 'use_polarity', 'auto', 'auto', ModelID)
**参数说明
**参数一:Template  输入一个将要被生成模板的图像
**参数二:Numlevels  就是金字塔抽象的层数  默认自动选择。(啥叫金字塔 ? 后面再说)
      **金字塔的级数由Numlevels指定,值越大则找到物体的时间越少,但也意味越可能找错了





**参数三: AngleStart 模板角度开始位置   (设为45)
**参数四:AngleExtent 模板角度范围 (设为10)==》那么角度范围就是(35至55)
**参数五:AngleStep    模板角度步距
     **AngleStart和AngleExtent决定可能的旋转范围,AngleStep指定角度范围搜索的步长;
        





**参数六:  Optimization    优化算法  。对特别大的模板,用Optimization来减少模板点的数量是很有用的.。
                     优化算法参数的目的就一个减少模板像素进而减少执行时间。
                      该参数的取值范围是:
                                                       none:不减少像素点
                                                       point_reduction_low  大致保留模板中一半的像素点
                                                       point_reduction_medium 大致保留模板中三分之一的像素点
                                                      point_reduction_low  大致保留模板中四分之一的像素点
                            有人问了:减少像素点可以加快运算速度,应该也会有副作用的吧?
                            A: 的确是的,主要就准确度降低了。一般模板如果过多的边缘就要考虑降低模板中的像素点。
                                  如果是刚入门的哥们 或是项目比较简单的话 直接赋值'auto',让HALOCN自己算就好了。
                                                        


**参数七:   极性   。   Metric参数决定模板识别的条件,如果设为’use_polarity’,则目标图像里亮暗和模板的亮暗要对应。
例:模板定义为下图:

图片:2015-01-10_095920.jpg


目标图像是:

图片:2015-01-10_095907.jpg




如果参数定义为:use_polarity  就这能找到右面的那头猪了。
如果参数定义为:ignore_global_polarity  忽略全局极性  就可以找到两头猪了
由于在现实中,图像往往不是这样黑白分明的,由于打光的问题 图像的亮度不均匀。
这个时候使用参数:ignore_local_polarity。作用相当于使用动态阈值抓取边缘。这要边缘的是对 就抓取出。
                                  





 **参数八:设置对比度  ,这个对比度呢。。设为了提取模板边缘轮廓使用的。
                  如果设置的过高找到的边缘就很少,设置的过低找到的边缘的就太多了。                  这个参数其实有加强版是哟娜方式:
                   例如如果输入:[a,b]意思是说大于b的对比度那铁定归为边缘,小于a对不度铁定认为不是边缘。                                             那a和b之间的呢。。如果这些点靠近真正的边缘点(就是大于b的)就认为是边缘。
                                               如果这些点远离真正的边缘点(就是大于b的)就认为是边缘。                                                  至于这个多少算远离  多少算接近 估计只有HALCON的设计师知道了。
               如果输入的 是:[a,b,c]。那么HALCON认为 前两个个参数意思和 上面的[a,b]一模一样。                                         最后这个C代表边缘的最小长度。小于这个长度的通通抛弃。

 **参数九: (该参数 没有完全了解  此处照抄CSDN资料的。兄弟们如果没有特殊要求的话 直接使用auto 赋值吧)                    解释一:最小对比度  MinConstrast将模板从图像的噪声中分离出来,如果灰度值的波动范围是10,则                         MinConstrast应当设为10。
                   解释二:查找模板的时候,由于各种各样的噪声,或是目标物本身自带的纹理(类似墙纸上的花纹)这些玩意会产生一些 我们不要的边缘。如果这些边缘的对比度很低的话。我们可以设置最小对比度,这样系统在模板搜索的时候 就会自动忽略这些边缘。



 **参数十: 输出模板句柄。



×××××××××××××××××××××××××××××××××××××
PS :制作模板时候的 参数 三 四 最好和  找模板时候的参数三 和参数四一样。
wenluderen
论坛版主
论坛版主
  • 最后登录2017-01-13
  • 发帖数284
  • 金币4116枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
地板#
发布于:2015-01-09 09:28
**第四步: 使用find_shape_model 在目标图像里 找模板
find_shape_model (Image, ModelID, 0, 0, 0.5, 1, 0.5,\
                  'least_squares', 0, 0.9, Row1, Column1,\
                  Angle, Score)
**将模板匹配的位置画出来
gen_circle (Circle1Gsz, Row1, Column1, 30)


图片:2015-01-09_103935.jpg




源代码和素材。
测试模板搜索.zip







**第五步: 释放 或者叫销毁模板
clear_shape_model (ModelID)
PS:特别注意不要忘记 释放模板,不然内存被占满了 就死机了。
专业术语叫内存泄漏,这是计算机编程通用词汇。。
wenluderen
论坛版主
论坛版主
  • 最后登录2017-01-13
  • 发帖数284
  • 金币4116枚
  • 贡献勋章0枚
  • 社区居民
  • 社区明星
  • 忠实会员
  • 喜欢达人
  • 原创写手
4楼#
发布于:2015-01-09 10:10
模板搜索函数说明:find_shape_model
参数一:输入要被搜索的图像
参数二:输入搜索模板
参数三:基准角度
参数四:角度范围
参数五:MinContrast 最小匹配程度 范围是 0-1.默认是0.5



参数六: 定义要输出的匹配的最大个数
×××××
参数七:MaxOverLap  最大重叠比
 目标图像内  和模板类似的图形的最大重合度。就比如上面有个图片 里面有两头猪。
               如果两头猪有部分重合在一起了。重叠部分的处理猪的整体=重叠比   取值范围是0-1.
             特别要说明是 真是运算中 是先计算猪的外界矩形,然后计算两个矩形的重叠部分处理一个矩形的面积
得到重叠比。
 ××××××

参数八:亚像素精度   五种模式,多选2,3
取值范围和意义:
none:不使用亚像素精度   那么最大的误差就可能是半个像素
interpolation:差值的亚像素精度
least_squares &least_squares_high   &least_squares_very_high. 这三个都是最小二乘 计算亚像素精度
不用说你也知道 运算越是复杂 时间越长。
亚像素精度的坏处是  图像的坐标会有轻微的变化。
×××××

















参数九:搜索时金字塔的层数



参数十:贪婪度,搜索启发式,一般都设为07-0.9,越高速度快容易出现找不到的情况。









参数十一: 输出匹配位置的行中心坐标
参数十二: 输出匹配位置的列中心坐标
参数十三: 输出匹配角度。
参数十四: Score: 输出匹配质量       大白话 就是找的准不准啊   范围是0-1。1就是百分之百确定了。


××××××××××××××××××××××××××××××××××××××
必要的说明:
一:关于搜索角度: 如果妹子的头像左歪一点 右歪一点话 我们也要可以搜索到。根据现实中图像可能旋转的角度,大家自己选择所有开始的角度 和结束的角度。以及每间隔多少角度(AngleStep)搜索一次。
二:所谓金子台 就是对图像进行 抽取, 比如没间隔一个像素提取一次像素的。 这样生成的图像比较小,
搜索起来也会快。
例: 1 3 5   7  9 11  13  15  17 19  是最简单的金字塔提取
1 4 7  10 13 16 19 22 25  是更加抽象的
1 5 9 13 17 21 25  也可以


这样一层层,就像一个金字塔似的。


好处就是搜索快,坏处就是可能误判。 像韩国棒子这种整容整到她妈都认不出来的情况,最后不要用金字塔抽象。


三:HALCON 还提供了很多辅助函数 。
比如用于确定合适金字塔层数的inspect_shape_model
用函数inspect_shape_model函数查看设置的结果。
get_shape_model_params函数查看金字塔的层数
dev_display_shape_matching_results 显示基于基本形状匹配的结果
等等。

这些函数当中部分参数的意思
ScaleMin  ScaleMAx  缩放系数的范围。通常来说要相对于1对称设置。比如(0.9-1.1)(0.8-1.2)(0.7-1.3)


其他系统环境设置 。这些设置很少用到,但你可以了解下
一个是模板匹配搜索的时候 边缘怎么处理
set_system('border_shape'.'false或true')
false代表模板必须在ROI内部,出边缘的地方一刀切 不要了
true代表  模板可以有部分在ROI的外面。但是否搜索的时候降低加权值。
×××××××××××××××××××××××××××××××××
其实模板匹配还有很多要说的。
时间不是很充裕,以后再说吧。




模板匹配这个操作 在整个图像处理四部曲中位置有两个。
一个是:最前面 用于为仿射变换提供参考点


另一个:第三部曲之后  或是说在在第四部曲里面 。 不如确定棒子的数目。。。加工件的数目,
混料的数目 等等。。大家可以展开想象的翅膀 纵情的翱翔。
(不好意思 忽然小学老师附体。)
szzxyg
技术员
技术员
  • 最后登录2017-01-14
  • 发帖数37
  • 金币168枚
  • 贡献勋章0枚
5楼#
发布于:2015-01-13 12:59
很有风格 从头到尾看完了
a49883099
助理工程师
助理工程师
  • 最后登录2016-10-18
  • 发帖数103
  • 金币411枚
  • 贡献勋章0枚
  • 社区居民
6楼#
发布于:2015-01-16 16:38
有没有源码可以分享一下,谢谢
yangyang
助理工程师
助理工程师
  • 最后登录2016-10-11
  • 发帖数71
  • 金币307枚
  • 贡献勋章0枚
  • 社区居民
7楼#
发布于:2015-04-28 16:18
好贴啊,正是我需要的
bol061
初学者
初学者
  • 最后登录2016-09-07
  • 发帖数13
  • 金币65枚
  • 贡献勋章0枚
  • 社区居民
8楼#
发布于:2015-06-08 13:34
先收藏了,模板匹配是肯定会用到的。
qingzhuye
工程师
工程师
  • 最后登录2017-01-13
  • 发帖数116
  • 金币690枚
  • 贡献勋章0枚
  • 社区居民
9楼#
发布于:2015-06-15 19:15
一直很喜欢楼主的帖子,形象易于理解
感谢楼主
sylarwcy
技术员
技术员
  • 最后登录2016-07-17
  • 发帖数46
  • 金币179枚
  • 贡献勋章0枚
  • 社区居民
10楼#
发布于:2015-07-10 13:44
好!爽歪歪!!!!!!!!!!!
hephi
初学者
初学者
  • 最后登录2015-10-05
  • 发帖数2
  • 金币14枚
  • 贡献勋章0枚
11楼#
发布于:2015-10-05 14:18
教程很风趣,哈哈!!!!!!
lab01
初学者
初学者
  • 最后登录2015-11-22
  • 发帖数24
  • 金币95枚
  • 贡献勋章0枚
  • 社区居民
12楼#
发布于:2015-10-29 19:52
真是好贴!收益匪浅!十分感激!
水中石00
助理工程师
助理工程师
  • 最后登录2016-12-31
  • 发帖数52
  • 金币352枚
  • 贡献勋章0枚
  • 社区居民
  • 忠实会员
13楼#
发布于:2015-11-12 22:40
我想请教一下,例程中建立模板时,有时候直接设置anglestep为0,但是后面有旋转的图像时照样能匹配正确,怎么理解啊,感谢
HZB择良
初学者
初学者
  • 最后登录2016-09-30
  • 发帖数12
  • 金币71枚
  • 贡献勋章0枚
  • 社区居民
14楼#
发布于:2016-04-05 02:32
我想问一下,模板匹配输出的行列值不是模板在搜索图像里的绝对坐标值,要如何才能获得该绝对坐标值?
上一页
游客

返回顶部