图像处理之 模型匹配有关知识
1.相关API:
2.模板匹配的几种算法:
1.平方差匹配method=CV_TM_SQDIFF,
2.标准平方差匹配method=CV_TM_SQDIFF_NORMED
(这类方法利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大.)
3.相关匹配method=CV_TM_CCORR,
4.标准相关匹配method=CV_TM_CCORR_NORMED
(这类方法采用模板和图像间的乘法操作,所以较大的数表示匹配程度较高,0标识最坏的匹配效果.)
5.相关系数匹配method=CV_TM_CCOEFF。这类方法将模版对其均值的相对值与图像对其均值的相关值进行匹配,1表示完美匹配,-1表示糟糕的匹配,0表示没有任何相关性(随机序列).
6.标准相关系数匹配method=CV_TM_CCOEFF_NORMED
备注:除了1,2两种平方差匹配值越低匹配度越好,其余几种值越高越好
程序
#include "stdafx.h"
//本节讲述 图像处理之 模型匹配;
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
void hist_And_Backprojection(int, void*);
Mat src, test1, test2, dst, gray_src,temp;
char input_title[] = "原图";
int match_method = CV_TM_SQDIFF;
int max_track = 5;
void Match_Demo(int,void*);
int main(int argc, char**argv)
{
src = imread("C:/Users/Rubison.DELL/Desktop\\杂物/壁纸/女团.jpg"); //待检测图
temp = imread("C:/Users/Rubison.DELL/Desktop\\杂物/壁纸/女团2.png"); //特征
if (src.empty()||temp.empty())
{
printf("could not load image...\r\n");
return -1;
}
namedWindow(input_title, CV_WINDOW_AUTOSIZE);
imshow(input_title, src);
imshow("目标", temp);
// const 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";
const char*trackbar_title = "Match Alog Type ";
createTrackbar(trackbar_title, input_title, &match_method, max_track, Match_Demo);
Match_Demo(0, 0);
waitKey(0);
destroyAllWindows();
return 0;
}
void Match_Demo(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, match_method);
normalize(result,result,0,1,NORM_MINMAX);
//找出匹配位置
Point minLoc;
Point maxLoc;
Point temLoc;
double max, min;
src.copyTo(dst);
minMaxLoc(result,&min,&max,&minLoc,&maxLoc); //在矩阵中需找全局的最大最小数。
if (match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED)
{
temLoc = minLoc;
}
//几种不同的匹配方法,结果不同,利用平方差来进行匹配,最好匹配为0.匹配越差,匹配值越大.
else
{
temLoc = maxLoc;
}
rectangle(dst, Rect(temLoc.x, temLoc.y,temp.cols,temp.rows),Scalar(0,2555,0),2,8);
rectangle(result, Rect(temLoc.x, temLoc.y, temp.cols, temp.rows), Scalar(0, 2555, 0), 2, 8);
imshow("结果",result);
imshow("匹配", dst);
}
程序运行结果
疑问:temp是姚明,为什么却变成了老黑?换张图试试
问题还是存在,然后扩大选择的区域,即temp尺寸变大
完成:原因;可能是目标特征不够明显,尽量选择较大尺寸或区域。
备注:
1.理论参考文章:参考1
2.minMaxLoc()函数知识补充minMaxLoc 和 minMaxIdx的比较
3.补充:,当前的模板匹配算法都是使用固定大小的模板图,将模板图覆盖在待匹配图.上不断移动,再使用相似度度量方法来确定模板图移动到待匹配图的哪个位置时与重叠的区域最为相似,最相似的
重叠区域即是提取到的ROI,这样只匹配一次的方法提取到的ROI大小和模板图的大小完全相等。在实际拍摄时,当相机距离目标较远,
该匹配算法在进行匹配时,模板图与待匹配图中的目标由于尺寸大小不同,就会导致匹配失败,从而造成上述匹配失败的结果。(2022.1.12)