OpenCv学习之一:模版匹配

来源:互联网 发布:网页性能的优化 编辑:程序博客网 时间:2024/06/06 02:57
#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>using namespace std;using namespace cv;/// 全局变量Mat img; Mat img2; Mat templ; Mat result;Mat img_display;///Mat imgscale; Mat imgrotate;////char* image_window = "Source Image";char* result_window = "Result window";int match_method;int max_Trackbar = 5;int scale =1;/// 函数声明void MatchingMethod(int, void*);int main(int argc, char** argv){//  读图片img = imread("C:/Users/Administrator/Desktop/phasecorr/phase_corr/Debug/44.jpg", 1);img2 = imread("C:/Users/Administrator/Desktop/phasecorr/phase_corr/Debug/figure.png", 1);templ = Mat(img2.size()*5, img2.type(), cv::Scalar::all(0));//放大缩小图像/*resize(img2, templ, templ.size(), 0, 0, CV_INTER_LINEAR);namedWindow("scalewindow", CV_WINDOW_AUTOSIZE);imshow("scalewindow", templ);*///旋转图像Mat imgrotate ;Point2f center = Point2f(img2.cols / 2, img2.rows / 2);//旋转中心double angle ;char image_name[20];char image_name1[20];for (angle = 0; angle < 360; angle++){sprintf(image_name, "%s%d%s", "input_angle", int(angle), ".jpg");//保存的图片名sprintf(image_name1, "%s%d%s", "result_angle", int(angle), ".jpg");//保存的图片名imgrotate = cv::getRotationMatrix2D(center, angle, 1);cv::warpAffine(img2, templ, imgrotate, img2.size());cout << image_name << endl;imwrite(image_name, templ);namedWindow("rotatewindow", CV_WINDOW_AUTOSIZE);imshow("rotatewindow", templ);//  创建图像显示窗口namedWindow(image_window, CV_WINDOW_AUTOSIZE);namedWindow(result_window, CV_WINDOW_AUTOSIZE);//  创建混动条char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";createTrackbar(trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod);MatchingMethod(0, 0);imwrite(image_name1, img_display);}waitKey(0);return 0;}// 模板匹配void MatchingMethod(int, void*){// 用于显示结果img.copyTo(img_display);// 用于存储匹配结果的矩阵int result_cols = img.cols - templ.cols + 1;int result_rows = img.rows - templ.rows + 1;result.create(result_cols, result_rows, CV_32FC1);// 进行模板匹配matchTemplate(img, templ, result, match_method);// 归一化结果(方便显示结果)normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());// 找到最佳匹配位置double minVal;double maxVal;Point minLoc;Point maxLoc;Point matchLoc;minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());   // 寻找result中的最大和最小值,以及它们所处的像素位置// 使用SQDIFF和SQDIFF_NORMED方法时:值越小代表越相似// 使用其他方法时:值越大代表越相似if (match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED){matchLoc = minLoc;}else{matchLoc = maxLoc;}// 显示匹配结果rectangle(img_display, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar::all(255), 2, 8, 0);rectangle(result, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar::all(255), 2, 8, 0);imshow(image_window, img_display);imshow(result_window, result);}

使用了opencv下的程序,对模版匹配(MatchTemplate)进行了鲁棒性测试,包括当待匹配模版进行缩放或者旋转的情况。

其中,当待匹配模版放大缩小时,感觉基本不影响匹配的结果。

当待测模版旋转时,小角度的旋转,也能够很好的进行匹配。本例中,当顺时针,逆时针旋转30度时,能够很好的匹配。当旋转180度时也能匹配好。

本例中,for循环遍历360度,将匹配的结果存储为jpg格式。

测试照片:



0 0
原创粉丝点击