相信每一个做计算机视觉算法的同学都不陌生这个名词,专业的定义:模板匹配是一种在图像处理中常用的技术,用于在一幅较大的图像中寻找与另一幅较小图像(称为模板)最匹配的部分。模板匹配的基本原理是将模板图像在目标图像上滑动,通过比较模板与目标图像的重叠区域,计算它们的相似度,从而确定模板在目标图像中的位置。–引用百度AI智能回答
通俗点的解释就是,预先建立需要检测目标的模板图像(仅包含目标的图像),然后,在待进行目标检测的图像上使用滑动窗口的方式,逐个位置计算对应区域与目标图像的相似度,选择相似度大于一定阈值的位置,即可认为该位置存在目标。
在上述的定义中有个关键的操作,计算图像相似度,一些常用的相似度计算方法如下。
平方差匹配(SSD, Sum of Squared Differences):
原理:计算模板图像与待匹配图像各个位置像素值的平方差之和,平方差之和越小,表示匹配程度越高
归一化平方差匹配:
原理:对平方差匹配进行归一化处理,以消除图像亮度和对比度的影响。
相关匹配(CC, Cross-Correlation)
原理:计算模板图像与待匹配图像各个位置的像素值的乘积之和,乘积之和越大,表示匹配程度越高。
归一化相关匹配:
原理:对相关匹配进行归一化处理,以消除图像亮度和对比度的影响。
相关系数匹配:
原理:计算模板图像与待匹配图像各个位置的相对像素值(即像素值减去均值)的乘积之和,并进行归一化处理。这种方法能够更准确地反映图像之间的相似程度。
matchTemplate
函数是OpenCV中用于模板匹配的重要函数。其函数原型如下:
void cv::matchTemplate(
cv::InputArray image, // 用于搜索的输入图像
cv::InputArray templ, // 用于匹配的模板,和image类型相同
cv::OutputArray result, // 匹配结果图像,类型32F
int method // 用于比较的方法,OpenCV提供6种
);
matchTemplate
函数原型的详细解释:
参数解释:
image
:输入图像,即待搜索的源图像。它必须是8位整数或32位浮点类型。
templ
:模板图像,即要在源图像中搜索的小图像。它必须与源图像具有相同的数据类型,并且大小不能超过源图像。
result
:输出图像,用于存储匹配结果。它是一个单通道的32位浮点类型图像,其大小取决于源图像和模板图像的大小。具体来说,如果源图像的宽度和高度分别为W和H,模板图像的宽度和高度分别为w和h,则结果图像的宽度和高度将分别为W-w+1和H-h+1。
method
:指定匹配方法,OpenCV提供了6种不同的匹配方法,包括平方差匹配、相关匹配和相关系数匹配等。
匹配方法:
cv::TM_SQDIFF
:计算模板图像与源图像每个位置之间的平方差。最佳匹配位置的值最小(接近0表示完美匹配)。
cv::TM_SQDIFF_NORMED
:归一化的平方差匹配。它将结果归一化到0和1之间,完美匹配时返回0。
cv::TM_CCORR
:计算模板图像与源图像每个位置之间的相关匹配。最佳匹配位置的值最大。
cv::TM_CCORR_NORMED
:归一化的相关匹配。它将结果归一化到0和1之间。
cv::TM_CCOEFF
:计算模板图像与源图像每个位置之间的相关系数匹配。最佳匹配位置的值最大。
cv::TM_CCOEFF_NORMED
:归一化的相关系数匹配。它将结果归一化到-1和1之间。
下面就C++版的opencv演示如何进行目标检测:
#include <iostream>
#include "opencv2/opencv.hpp"
int main()
{
//读取待匹配图像
cv::Mat image = cv::imread("./data/lena.jpg", cv::IMREAD_COLOR);
cv::imshow("待匹配图像", image);
//读取模板图像
cv::Mat template_image = cv::imread("./data/eye.jpg", cv::IMREAD_COLOR);
cv::imshow("模板图像", template_image);
//定义模板匹配相似度计算结果矩阵
cv::Mat ncc;
//模板匹配操作:使用归一化相关系数的相似度计算方法
cv::matchTemplate(image, template_image, ncc, cv::TM_CCOEFF_NORMED);
//获取最佳匹配位置
double max_ncc = 0.0, min_ncc = 0.0;
cv::Point max_positon, min_position;
cv::minMaxLoc(ncc, &min_ncc, &max_ncc, &min_position, &max_positon);
//在匹配图像上显示最佳匹配位置
cv::rectangle(image, cv::Rect(max_positon.x, max_positon.y, template_image.cols, template_image.rows),
cv::Scalar(0, 0, 255), 2);
cv::imshow("匹配结果", image);
//相似度矩阵
cv::imshow("相似度矩阵", ncc);
cv::waitKey();
}
运行结果如下:
从结果可以看到,matchTemplate函数输出的相似度矩阵后,从相似度矩阵中寻找最大相似度对应的位置,可以得到预期的结果。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务