您的位置:首页 > 运维架构

openCV实现模板匹配

2016-03-03 16:09 603 查看
在图像目标识别技术的研究应用中,模板匹配技术是其中一个重要的研究方向,它具有算法简单、计算量小以及识别率高的特点。模板匹配的基本原理是通过相关函数的计算来找到它和被搜索图的坐标位置。比如可以设模板 T ( n×m像素点)叠放在搜索图S上平移,模板覆盖下的那块搜索图叫做子图, i , j 为这块子图的左上角像点在S图中的坐标 , 叫参考点 , 1≤ i , j ≤n -m+ 1。比较T和Si , j的内容,若两者一致 , 则 T 和 Si , j之差为零。



针对图像特征不同 , 有多种匹配算法 。例如 : 绝对差算法,是一种简化了的 求解相 似度的 方法 , 计算量 小 , 当目标图像变化不是很快的情况下 , 具有一 定的实用性 ; 不变矩策略主要应用于一些简单图形的识别 , 具有大小旋转不变性 ,但对于有形状变化的图 像识别 不太适 合 ; 傅 立叶变 换或小波变换 , 将图像变换到变换域 , 与目标图像变换域特征进行比较得到相似程度 , 其匹配 准确度 高 、 抗干扰能力强 , 但计算量大。基于各种匹配算法的优点 , 它们已被应用于从简单图形 ( 背 景 、汽车、飞机等) 到复杂图像 (字符、指纹、人脸等)的识别、目标跟踪等众多领域 。

openCV的C++版提供了模板匹配的函数:

void matchTemplate(InputArray image, InputArray temp, OutputArray result, int method)


image –需要进行模板匹配的原图像(搜索图)。

templ –模板图像,不能够比原图像小并且需要和原图有相同的格式。

result – 匹配窗口,如果原图(image)尺寸是W×H,模板(templ)是w×h,则匹配窗口(result)的尺寸是(W-w+1)×(H-h+1)

method – 指定使用何种匹配方法的参数

method对应的匹配方法:



当函数完成匹配后,使用
minMaxLoc()
函数就可以找到做为全局最大(
CV_TM_SQDIFF
)或最小(
CV_TM_CCORR
)值的最佳匹配结果。

下面通过一个例子来实现模板匹配:

#define WN  "模板匹配"
Mat srcImg, tempImg, resultImg;
int MatchMetod;
int MaxTrackbarNum = 5;
void Matching(int, void*);

void matchTemplateFunction(){
srcImg = imread("Tekkaman.jpg");
tempImg = imread("headTan.png");
createTrackbar("方法", WN, &MatchMetod, MaxTrackbarNum, Matching);
Matching(0, 0);
waitKey(0);
}
void Matching(int, void*){
//给局部变量初始化
Mat copyImg;
srcImg.copyTo(copyImg);
//初始化用于结果输出的矩阵
int resultImgCols = srcImg.cols - tempImg.cols + 1;
int resultImgRows = srcImg.rows - tempImg.rows + 1;
resultImg.create(resultImgCols, resultImgRows, CV_32FC1);
//进行匹配和标准化
matchTemplate(copyImg, tempImg, resultImg, MatchMetod);
normalize(resultImg, resultImg, 0, 1, NORM_MINMAX, -1, Mat());
//通过函数minMaxLoc定位最匹配位置
double minValue, maxValue;
Point minLocation, maxLocation,matchLocation;
minMaxLoc(resultImg, &minValue, &maxValue, &minLocation, &maxLocation, Mat());
//对于方法SQDIFF和SQDIFF_NORMED,越小的数值有着更高的匹配结果,而其余方法,数组越大匹配效果越好
if (MatchMetod == CV_TM_SQDIFF || MatchMetod == CV_TM_SQDIFF_NORMED){
matchLocation = minLocation;
}
else{ matchLocation = maxLocation; }
//绘制出矩形,并显示最终结果
rectangle(srcImg, matchLocation, Point(matchLocation.x + tempImg.cols, matchLocation.y + tempImg.rows)
,Scalar(0,0,255),2,8,0);
rectangle(resultImg, matchLocation, Point(matchLocation.x + tempImg.cols, matchLocation.y + tempImg.rows), Scalar(0, 0, 255), 2, 8, 0);

imshow(WN,srcImg);
//imshow("效果图", resultImg);

}

int main(){
matchTemplateFunction();
return 0;
}


原图:



模板图:



匹配结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: