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

模板匹配就是拿模板去遍历图像,在遍历的每个位置计算结果,即匹配程度,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(\theta) = A*B/|A||B|来确定匹配程度,夹角越小,说明越相似,cos(\theta) 值就越大,所以后四种要找最大值的位置。

在 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);
}

原图像如下:

模板图像 如下:

匹配结果如下:

 

扫描二维码关注公众号,回复: 3096691 查看本文章

 

猜你喜欢

转载自blog.csdn.net/qq_24946843/article/details/82502217