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++版提供了模板匹配的函数:
image –需要进行模板匹配的原图像(搜索图)。
templ –模板图像,不能够比原图像小并且需要和原图有相同的格式。
result – 匹配窗口,如果原图(image)尺寸是W×H,模板(templ)是w×h,则匹配窗口(result)的尺寸是(W-w+1)×(H-h+1)
method – 指定使用何种匹配方法的参数
method对应的匹配方法:
当函数完成匹配后,使用
下面通过一个例子来实现模板匹配:
原图:
模板图:
匹配结果:
针对图像特征不同 , 有多种匹配算法 。例如 : 绝对差算法,是一种简化了的 求解相 似度的 方法 , 计算量 小 , 当目标图像变化不是很快的情况下 , 具有一 定的实用性 ; 不变矩策略主要应用于一些简单图形的识别 , 具有大小旋转不变性 ,但对于有形状变化的图 像识别 不太适 合 ; 傅 立叶变 换或小波变换 , 将图像变换到变换域 , 与目标图像变换域特征进行比较得到相似程度 , 其匹配 准确度 高 、 抗干扰能力强 , 但计算量大。基于各种匹配算法的优点 , 它们已被应用于从简单图形 ( 背 景 、汽车、飞机等) 到复杂图像 (字符、指纹、人脸等)的识别、目标跟踪等众多领域 。
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; }
原图:
模板图:
匹配结果:
相关文章推荐
- makefile 《Linux程序设计笔记》
- myeclipse tomcat 远程调试
- Hibernate--使用setProperties()方法动态生成
- (转)每个架构师都应该研究下康威定律
- IT系统架构设计
- linux平台使用multipath配置asm磁盘(multipath path)
- tomcat 中部署的应用响应json数据乱码解决办法
- dlopen, dlsym今天才刚知道干什么用的,羞死人了
- SetConsoleCtrlHandler
- Linux线程-互斥锁pthread_mutex_t
- 一个可以下载linux 内核升级包的网站
- Hadoop 2.0命令手册
- aop
- linux 学习决心书
- 学习Linux决心书
- 64位下对Mod/RM 的解析
- Linux中整理代码工具indent的使用
- OpenLayers 3自定义地图工具条(一)
- 学习Linux决心计划书
- opencv学习-模板匹配算法(单图像模板匹配和基于模板匹配的目标跟踪)