在实验毛星云《opencv3入门编程》第九章最后一节模板匹配时发现matchTemplate函数提供的6种匹配方法中平方差匹配、归一化平方差匹配、归一化相关系数匹配这三种方法相对而言匹配结果比较稳定。代码如下(毛星云书上提供的代码):
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
Mat g_srcImage, g_templateImage, g_resultImage;
int g_nMatchMethod, g_nMaxTrackbarNum = 5;
void on_Matching(int, void*);
int main()
{
g_srcImage = imread("8.jpg", 1);
g_templateImage = imread("6.jpg", 1);
namedWindow("srcImage", CV_WINDOW_AUTOSIZE);
namedWindow("resultImage", CV_WINDOW_AUTOSIZE);
createTrackbar("method", "srcImage", &g_nMatchMethod, g_nMaxTrackbarNum, on_Matching);
on_Matching(0, 0);
waitKey(0);
return 0;
}
void on_Matching(int, void*)
{
Mat srcImage;
g_srcImage.copyTo(srcImage);
int resultImage_cols = g_srcImage.cols - g_templateImage.cols + 1;
int resultImage_rows = g_srcImage.rows - g_templateImage.rows + 1;
g_resultImage.create(resultImage_cols, resultImage_rows, CV_32FC1);
matchTemplate(g_srcImage,g_templateImage,g_resultImage,g_nMatchMethod);
normalize(g_resultImage, g_resultImage, 0, 1, NORM_MINMAX, -1, Mat());
double minValue, maxValue;
Point minLocation, maxLocation, matchLocation;
minMaxLoc(g_resultImage, &minValue, &maxValue, &minLocation, &maxLocation, Mat());
if (g_nMatchMethod == CV_TM_SQDIFF || g_nMatchMethod == CV_TM_SQDIFF_NORMED)
matchLocation = minLocation;
else
matchLocation = maxLocation;
rectangle(srcImage, matchLocation, Point(matchLocation.x + g_templateImage.cols, matchLocation.y + g_templateImage.rows), Scalar(0, 0, 255), 2, 8, 0);
rectangle(g_resultImage, matchLocation, Point(matchLocation.x + g_templateImage.cols, matchLocation.y + g_templateImage.rows), Scalar(0, 0, 255), 2, 8, 0);
imshow("srcImage", srcImage);
imshow("resultImage", g_resultImage);
}
源图片
匹配模板
平方差匹配结果
归一化平方差匹配结果
相关匹配结果
归一化相关匹配结果
系数匹配结果
归一化系数匹配结果
改变源图像后的结果
源图像
模板图像同上。
平方差匹配结果
归一化平方差匹配结果
相关匹配结果
归一化相关匹配结果
系数匹配结果
归一化系数匹配结果