视觉目标跟踪系列第一篇,
详细代码如下:
#include<iostream>
#include<string>
#include<vector>
#include<opencv2\opencv.hpp>
using namespace cv;
using namespace std;
//******下面用于模板匹配*********/
Mat img; Mat temp1; Mat result;
const char* image_window = "Source Image";
const char* result_window = "Result window";
int match_method;
int max_Trackbar = 5;
vector<string> methodNames = {
"0: SQDIFF","1: SQDIFF NORMED","2: TM CCORR",
"3: TM COORR NORMED","4: TM COEFF","5: TM COEFF NORMED"
};
void MatchingMethod(int,void*); //定义回调函数
//*******************************/
int main(int argc, char*argv[])
{
//*****下面程序用于演示模板匹配*******//
const string img_file = "cat.jpg";
img = imread(img_file, IMREAD_GRAYSCALE);
Rect roi_rect(330, 64, 110, 70);
temp1 = img(roi_rect).clone();
namedWindow(image_window, WINDOW_AUTOSIZE);
namedWindow(result_window, WINDOW_AUTOSIZE);
const char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM COORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED \n";
createTrackbar(trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod);
MatchingMethod(0, 0);
waitKey(0);
return 0;
//****以上是用于演示模板匹配的代码****//
}
//以下用于模板匹配用的程序//
void MatchingMethod(int, void*)
{
cout << "Matching Method: " << methodNames[match_method] << endl;
Mat img_display;
img.copyTo(img_display);
int result_colos = img.cols - temp1.cols + 1;
int result_rows = img.rows - temp1.rows + 1;
result.create(result_rows, result_colos, CV_32FC1); //计算出来的匹配度图像是浮点数,因此用32F
double t = (double)getTickCount();
matchTemplate(img, temp1, result, match_method);
t = 1000 * ((double)getTickCount() - t) / getTickFrequency();
cout << "花费时间: " << t << "毫秒" << endl;
normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat()); //把匹配度归一化到0,1
double minVal; double maxVal; Point minLoc; Point maxLoc;
Point matchLoc;
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED)
matchLoc = minLoc;
else
matchLoc = maxLoc;
rectangle(img_display, matchLoc,Point(matchLoc.x+temp1.cols,matchLoc.y+temp1.rows),Scalar::all(0),2,8,0);
rectangle(result, matchLoc, Point(matchLoc.x + temp1.cols, matchLoc.y + temp1.rows), Scalar::all(0), 2, 8, 0);
imshow(image_window, img_display);
imshow(result_window, result);
return;
}
代码结果如下:
选择SQDIFF方法做模板匹配的结果图像:
选择TM_CCORR方法做模板匹配的结果图像
各个匹配方法所用时间如下:
如果需要准确的时间信息,建议对测试间的代码做个100或是多次的循环求均值测量结果。
代码主要对比模板匹配中各个匹配方法间的差异性以及各个匹配方法处理时间上的对比。(我所测试的模板图像是右上角猫脸)
转载请注明出处,谢谢!