欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

opencv学习笔记二十:模板匹配

程序员文章站 2024-03-17 00:02:22
...

模板匹配就是拿模板去遍历图像,在遍历的每个位置计算结果,即匹配程度,opencv中 提供了 6 种计算方法:

  1. 差值平方和匹配 CV_TM_SQDIFF
  2. 标准化差值平方和匹配 CV_TM_SQDIFF_NORMED
  3. 相关匹配 CV_TM_CCORR
  4. 标准相关匹配 CV_TM_CCORR_NORMED
  5. 相关匹配 CV_TM_CCOEFF
  6. 标准相关匹配 CV_TM_CCOEFF_NORMED

平方和匹配是模板与模板覆盖下的原图像之间的像素差平方和,值越小代表匹匹配,所以前两种要找最小值的位置;

相关匹配是模板与模板覆盖下的原图像之间的像素乘积,标准相关匹配其实是先将两幅图像像素各转换成一列向量,通过计算两幅图像向量之间的夹角cos(opencv学习笔记二十:模板匹配) = A*B/|A||B|来确定匹配程度,夹角越小,说明越相似,cos(opencv学习笔记二十:模板匹配) 值就越大,所以后四种要找最大值的位置。

在 OpenCV 中,提供了相应的函数完成这个操作。

matchTemplate 函数:在模板和输入图像之间寻找匹配,获得匹配结果图像 
minMaxLoc 函数:在给定的矩阵中寻找最大和最小值,并给出它们的位置

#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;

int value = 2;
Mat src, dst, temp;
void callback(int, void*);
int main(int arc, char** argv){  	
	src = imread("1.png");
	temp = imread("2.png");
	namedWindow("src",CV_WINDOW_AUTOSIZE);
	imshow("src", src);
	imshow("temp", temp);

	namedWindow("output", CV_WINDOW_AUTOSIZE);
	createTrackbar("method", "output", &value, 5, callback);
	callback(0, 0);
	waitKey(0);
	return 0;
}
void callback(int, void*) {
	int width = src.cols - temp.cols + 1;
	int height = src.rows - temp.rows + 1;
	Mat result(width, height, CV_32FC1);
	matchTemplate(src, temp, result, value);
	normalize(result, result,0,1, NORM_MINMAX);

	Point minLoc, maxLoc,temLoc;
	double min, max;
	minMaxLoc(result, &min, &max, &minLoc, &maxLoc,Mat());
	if (value == CV_TM_SQDIFF || value == CV_TM_SQDIFF_NORMED) {
		temLoc = minLoc;
	}else {
		temLoc = maxLoc;
	    }
	src.copyTo(dst);
	rectangle(dst, Rect(temLoc.x, temLoc.y, temp.cols, temp.rows), Scalar(0, 0, 255), 2);
	imshow("match", dst);
	rectangle(result, Rect(temLoc.x, temLoc.y, temp.cols, temp.rows), Scalar(0, 0, 0), 2);
	imshow("output", result);
}

原图像如下:

opencv学习笔记二十:模板匹配

模板图像 如下:

opencv学习笔记二十:模板匹配

匹配结果如下:

opencv学习笔记二十:模板匹配 

opencv学习笔记二十:模板匹配 

相关标签: 模板匹配