模板匹配
背景
模板匹配其实就是在一张大图片里找到指定的目标的方法。这里对单匹配、多匹配做一个学习记录。主要依赖的是openCV提供的算法库。
模板匹配
模板匹配是用来在一幅大图里搜寻模板图像位置的方法。
模板匹配也是应用卷积来实现的:假设原图大小为W x H,模板图大小为w x h,那么生成图大小是(W - w + 1) x (H - h + 1),生成图中的每个像素值表示原图与模板的匹配程度。
opencv提供的函数
模板匹配函数原型
1 | void cv::matchTemplate(cv::InputArray image, cv::InputArray templ, cv::OutputArray result, int method) |
注意:
(1)如果模板图templ大小比image大,那么可能会导致crash
(2)method有6种方法,
寻找位置函数原型
1 | void cv::minMaxLoc(cv::InputArray src, double *minVal, double *maxVal = (double *)0, cv::Point *minLoc = (cv::Point *)0, cv::Point *maxLoc = (cv::Point *)0, cv::InputArray mask = noArray()) |
功能:从一个矩阵中找出全局的最大值和最小值。找出最大和最小元素的值和他们的位置。极值是遍历整个矩阵找到,或者当掩码不是一个空矩阵时,是通过遍历指定矩阵区域找到。
注意:
(1)函数不适用于多通道矩阵,如果需要遍历所有的通道来找到最大和最小值,首先使用函数Mat::reshape转换为单通道矩阵。或者你可以使用函数extractImageCOI,mixChannels, or split 来提取特定通道。
(2)具体的参数解释:
一个简单的模板匹配的demo如下:
单对象模板匹配(单模板)
单对象模板匹配的原理也很简单,就是不断的在原图中移动模板图像去比较。
多对象模板匹配(单模板)
思路
单个匹配是找最大匹配的点,所以只能匹配一次。
对于多对象匹配,我们需要设定一个匹配阈值来匹配多次。
假设正在搜索一个多次出现的对象,cv.minMaxLoc()不会给出所有的位置。在这种情况下,我们将使用阈值化。
源代码
1 | #include "opencv2/core.hpp" |
模板图templ.png如下所示:
源图像(待匹配图)src_cir6.png如下图所示:
匹配结果图image_matched如下图所示:
可以看到,源图像中6个圆模板都被识别了出来。而且模板图中空白的地方可以重叠。
模板匹配的method六种方法详情(了解一下)
主要是了解一下就好
模板匹配的局限性
在应用模板匹配法进行图像匹配时,应注意以下几点:
(1)归一化互相关注进行匹配,模板应在(M-P+1)×(N-Q+1)个参考位置上进行相关计算,计算量非常大,必要时可以采用序贯相似检验算法、幅度排序相关算法、FFT相关算法、分层搜索序贯判决等方法对其进行改进,以提高运算速度。
(2)模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。
(3)若原图像中要匹配的目标只有部分可见,该算法也无法完成匹配。
参考链接
https://www.cnblogs.com/ybqjymy/p/15338560.html
https://blog.csdn.net/Zero___Chen/article/details/125119050