功能解释
在opencv中,模板匹配进行物体识别有专门的函数matchTemplate()来执行这一动作。这个函数用来在给定图像或区域中进行模板图像的匹配,其做法是按照一定的计算方法将模板图像在给定图样中进行顺次滑移,最终将每一个位置的计算结果汇合成一个点阵。在这个点阵中,其最大值或者最小值就是我们需要的结果,对于需要的极值的提取,需要配合minMaxLoc函数来进行提取。上述方法首先需将模板和图样转化为灰度图,对于彩色图像其实可以同样进行,只是将每一个颜色通道都分别进行计算,其最终结果也是一个单维的点阵。
在python语言中用法如下:
result=cv2.matchTemplate(image,template,method[,result[,mask]])
各参数含义如下:
method的用法如下:
cv::TemplateMatchModes {
cv::TM_SQDIFF = 0,
cv::TM_SQDIFF_NORMED = 1,
cv::TM_CCORR = 2,(这个算法似乎有些问题)
cv::TM_CCORR_NORMED = 3,
cv::TM_CCOEFF = 4,
cv::TM_CCOEFF_NORMED = 5
}
验证
从原理上来讲,对直接从图片中剪切下来的局部进行模板匹配的效果是最佳的,对微信跳一跳游戏而言,跳跳小人是一个轴对称的形状,无论其处于何处,其基本形状都不会有太大变化,同时,需要对其进行识别的时刻小人都是静止的,这些都使得采用模板匹配成为可能。
验证代码我放在csdn上,下面是验证结果。
静态图片验证
抓取一副静态图片,将其中的小人尽可能贴身地截取下来作为模板文件,然后在游戏中进行识别,识别效果非常的好,甚至不需要对模板进行抠图将小人从背景中提取出来。
我将6种匹配算法的识别效果都放在这里,大家可以感受一下。
左边中间就是截取出来的模板小图,中间就是识别效果图,右边是算法的实际效果图。小人头上的数字就是匹配度。
算法名称:0: SQDIFF:
cv::TM_SQDIFF_NORMED = 1
cv::TM_CCORR = 2,(这个算法似乎有些问题)
cv::TM_CCORR_NORMED = 3
cv::TM_CCOEFF = 4
cv::TM_CCOEFF_NORMED = 5
我个人感觉用算法TM COEFF(编号4)是比较适合的,在动态的验证中,我就采用这个算法进行验证。
缺点
模板识别的算法固然很好,但也存在一个明显的缺点,对于不同分辨率的手机而言,都需要人工进行模板小人的采集和处理,难以做到通用。当然,我也可以给出一个基准小人和基准底图的尺寸,然后按照比例进行自动缩放,但那样的识别效果如何,有兴趣的同学可以进行一下验证。
动态验证
我用摄像头拍下手机的实时画面,在电脑上运行实时动态的模板匹配,可以看到效果还是非常不错的。
实时动态的视频在各大自媒体同步发行,需要的可以移步观看。
静态验证和动态验证的代码都是非常简单的,我都放在csdn上,直搜“艾克思”即可,需要的同学可以去参考。
预告
在一篇博客中,我会完成基于HSV颜色的小人识别,敬请期待。。。
领取专属 10元无门槛券
私享最新 技术干货