关闭

模板匹配——在一幅图像中匹配与模板相似的单个或者多个目标

364人阅读 评论(0) 收藏 举报
分类:

(1)目标匹配函数:

cvMatchTemplate( const CvArr* image, constCvArr* templ,

                              CvArr* result,int method );

Image  待搜索图像

Templ  模板图像

Result  匹配结果  用来存放通过以下方法计算出滑动窗口与模板的相似值

Method  计算匹配程度的方法

  关于匹配方法,使用不同的方法产生的结果的意义可能不太一样,有些返回的值越大表示匹配程度越好,而有些方法返回的值越小表示匹配程度越好

关于参数 method
CV_TM_SQDIFF平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。
CV_TM_CCORR相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
CV_TM_CCOEFF相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。
CV_TM_SQDIFF_NORMED归一化平方差匹配法
CV_TM_CCORR_NORMED归一化相关匹配法
CV_TM_CCOEFF_NORMED归一化相关系数匹配法

 

(2):接着就是要找最值以及最值对应的坐标

cvMinMaxLoc()寻找一个矩阵中最大最小值以及相应的坐标

cvMinMaxLoc( constCvArr* arr, double* min_val, double* max_val,

                          CvPoint* min_locCV_DEFAULT(NULL),

                          CvPoint* max_locCV_DEFAULT(NULL),

                          const CvArr* mask CV_DEFAULT(NULL) );

单目标匹配结果:

代码:

  1. #include <iostream>  
  2. #include "cv.h"  
  3. #include "cxcore.h"  
  4. #include "highgui.h"  
  5. using namespace std;  
  6. int main()  
  7. {  
  8.     IplImage *src = cvLoadImage("E:\\study_opencv_video\\lesson16_1\\images\\src.jpg", 0);  
  9.     IplImage *srcResult = cvLoadImage("E:\\study_opencv_video\\lesson16_1\\images\\src.jpg", 3);  //用来显示  
  10.     IplImage *templat = cvLoadImage("E:\\study_opencv_video\\lesson16_1\\images\\template.png", 0);  
  11.     IplImage *result;  
  12.     if(!src || !templat)  
  13.     {  
  14.         cout << "打开图像失败"<< endl;  
  15.         return 0;  
  16.     }  
  17.     int srcW, srcH, templatW, templatH, resultH, resultW;  
  18.     srcW = src->width;  
  19.     srcH = src->height;  
  20.     templatW = templat->width;  
  21.     templatH = templat->height;  
  22.     if(srcW < templatW || srcH < templatH)  
  23.     {  
  24.         cout <<"模板不能比原图像小" << endl;  
  25.         return 0;  
  26.     }  
  27.     resultW = srcW - templatW + 1;  
  28.     resultH = srcH - templatH + 1;  
  29.     result = cvCreateImage(cvSize(resultW, resultH), 32, 1);      
  30.     cvMatchTemplate(src, templat, result, CV_TM_SQDIFF);     
  31.     double minValue, maxValue;  
  32.     CvPoint minLoc, maxLoc;  
  33.     cvMinMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc);    
  34.     cvRectangle(srcResult, minLoc, cvPoint(minLoc.x + templatW, minLoc.y+ templatH), cvScalar(0,0,255));  
  35.     cvNamedWindow("srcResult", 0);  
  36.     cvNamedWindow("templat", 0);  
  37.     cvShowImage("srcResult", srcResult);  
  38.     cvShowImage("templat", templat);  
  39.     cvWaitKey(0);  
  40.     cvReleaseImage(&result);  
  41.     cvReleaseImage(&templat);  
  42.     cvReleaseImage(&srcResult);  
  43.     cvReleaseImage(&src);  
  44.     return 0;  
  45. }  

(3)多目标匹配:

结果:

代码:

  1. #include <iostream>  
  2. #include "cv.h"  
  3. #include "cxcore.h"  
  4. #include "highgui.h"  
  5. using namespace std;  
  6.   
  7. CvPoint getNextMinLoc(IplImage *result, CvPoint minLoc, int maxVaule, int templatW, int templatH)  
  8. {  
  9.   
  10.     // 先将第一个最小值点附近两倍模板宽度和高度的都设置为最大值防止产生干扰  
  11.     int startX = minLoc.x - templatW;  
  12.     int startY = minLoc.y - templatH;  
  13.     int endX = minLoc.x + templatW;  
  14.     int endY = minLoc.y + templatH;  
  15.     if(startX < 0 || startY < 0)  
  16.     {  
  17.         startX = 0;  
  18.         startY = 0;  
  19.     }  
  20.     if(endX > result->width - 1 || endY > result->height - 1)  
  21.     {  
  22.         endX = result->width - 1;  
  23.         endY = result->height - 1;  
  24.     }  
  25.     int y, x;  
  26.     for(y = startY; y < endY; y++)  
  27.     {  
  28.         for(x = startX; x < endX; x++)  
  29.         {  
  30.             cvSetReal2D(result, y, x, maxVaule);  
  31.         }  
  32.     }  
  33.     // 然后得到下一个最小值并且返回  
  34.     double new_minVaule, new_maxValue;  
  35.     CvPoint new_minLoc, new_maxLoc;  
  36.     cvMinMaxLoc(result, &new_minVaule, &new_maxValue, &new_minLoc, &new_maxLoc);  
  37.     return new_minLoc;  
  38.   
  39. }  
  40. int main()  
  41. {  
  42.     IplImage *src = cvLoadImage("E:\\study_opencv_video\\lesson16_1\\images\\src.jpg", 0);  
  43.     IplImage *srcResult = cvLoadImage("E:\\study_opencv_video\\lesson16_1\\images\\src.jpg", 3);  //用来显示  
  44.     IplImage *templat = cvLoadImage("E:\\study_opencv_video\\lesson16_1\\images\\template.png", 0);  
  45.     IplImage *result;  // 用来存放结果  
  46.     if(!src || !templat)  
  47.     {  
  48.         cout << "打开图片失败" << endl;  
  49.         return 0;  
  50.     }  
  51.     int srcW, srcH, templatW, templatH, resultH, resultW;  
  52.     srcW = src->width;  
  53.     srcH = src->height;  
  54.     templatW = templat->width;  
  55.     templatH = templat->height;  
  56.     if(srcW < templatW || srcH < templatH)  
  57.     {  
  58.         cout << "模板不能比原图小" << endl;  
  59.         return 0;  
  60.     }  
  61.     resultW = srcW - templatW + 1;  
  62.     resultH = srcH - templatH + 1;  
  63.     result = cvCreateImage(cvSize(resultW, resultH), 32, 1);    //  匹配方法计算的结果最小值为float  
  64.     cvMatchTemplate(src, templat, result, CV_TM_SQDIFF);     
  65.     double minValue, maxValue;  
  66.     CvPoint minLoc, maxLoc;  
  67.     cvMinMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc);    
  68.     cvRectangle(srcResult, minLoc, cvPoint(minLoc.x + templatW, minLoc.y+ templatH), cvScalar(0,0,255));  
  69.     CvPoint new_minLoc;  
  70.   
  71.     // 计算下一个最小值  
  72.     new_minLoc = getNextMinLoc(result, minLoc, maxValue, templatW, templatH);  
  73.     cvRectangle(srcResult, new_minLoc, cvPoint(new_minLoc.x + templatW, new_minLoc.y+ templatH), cvScalar(0,0,255));  
  74.     // 再下一个  
  75.     new_minLoc = getNextMinLoc(result, new_minLoc, maxValue, templatW, templatH);  
  76.     cvRectangle(srcResult, new_minLoc, cvPoint(new_minLoc.x + templatW, new_minLoc.y+ templatH), cvScalar(0,0,255));  
  77.     cvNamedWindow("srcResult", 0);  
  78.     cvNamedWindow("templat", 0);  
  79.     cvShowImage("srcResult", srcResult);  
  80.     cvShowImage("templat", templat);  
  81.     cvWaitKey(0);  
  82.     cvReleaseImage(&result);  
  83.     cvReleaseImage(&templat);  
  84.     cvReleaseImage(&srcResult);  
  85.     cvReleaseImage(&src);  
  86.     return 0;  
  87. }  

作者:小村长  出处:http://blog.csdn.net/lu597203933 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:小村长zack, 欢迎交流!)
0
0
查看评论

模板匹配——在一幅图像中匹配与模板相似的单个或者多个目标

(1)目标匹配函数: cvMatchTemplate( const CvArr* image, constCvArr* templ,              ...
  • qq_30050303
  • qq_30050303
  • 2016-06-01 09:51
  • 1608

第七章 - 直方图与匹配 - 模板匹配(cvMatchTemplate)

模板匹配是通过在输入图像上滑动模板图像块对实际的图像块和输入图像进行匹配,应用场景:比如要在一堆图像中寻找指定人脸,就可以利用此算法在图像中找到此人脸的最佳匹配,确定相似度。并且可以利用函数cvMinMaxLoc()找到最佳匹配的位置。对于特定的应用来说,如视频中应用自动部分检测或跟踪(视频中的车牌...
  • hitwengqi
  • hitwengqi
  • 2011-10-28 16:18
  • 20149

OpenCV中文网站例程——多目标模板匹配

多目标模板匹配结果如图——
  • c20081052
  • c20081052
  • 2014-05-17 19:45
  • 2076

opencv学习笔记(三十三)多匹配——查找多个对象

参考这个: http://www.lxway.com/4464155816.htm程序实例:#include <opencv2/opencv.hpp> CvPoint getNextMinLoc(IplImage* result , int templatWidth,int templ...
  • u014751607
  • u014751607
  • 2017-03-09 09:09
  • 996

模版匹配(单目标或多目标)

模版匹配
  • mutieying
  • mutieying
  • 2015-10-31 20:56
  • 189

使用OpenCV&&C++进行模板匹配

一:课程介绍 1.1:学习目标   学会用imread载入图像,和imshow输出图像。  用nameWindow创建窗口,用createTrackbar加入滚动条和其回调函数的写法。  熟悉OpenCV函数matchTemplate并学会通过该函数实现模板匹配。  &#...
  • VGWCIrO8NU
  • VGWCIrO8NU
  • 2017-03-03 15:32
  • 1346

基于Halcon的多目标模板匹配算法

模板匹配,顾名思义,需要一个模板。然后在图像中寻找与模板能匹配得上的区域。Halcon中,基于灰度值的模板匹配的算法中,算法的基本原理比较简单,就是简单的灰度比对。
  • x454045816
  • x454045816
  • 2016-10-17 22:19
  • 1146

图像比较之模板匹配

图像比较之模板匹配 1.模板匹配基本原理概述       当我们比较两幅图像的时候,首先面对的基本问题是:什么时候两幅图像才是一样或比较相似的,这两幅图像的相似程度如何衡量?当然,比较一般的方法是,当两幅图像的所有像素灰度值一样的时候,我们认为这...
  • lz0499
  • lz0499
  • 2017-04-05 22:24
  • 2202

opencv学习_11 (模板匹配(包括单模板和多模板))

模板匹配——在一幅图像中匹配与模板相似的单个或者多个目标 (1)目标匹配函数: cvMatchTemplate( const CvArr* image, constCvArr* templ,          ...
  • Lu597203933
  • Lu597203933
  • 2013-11-08 21:16
  • 37590

[转]opencv如何用模板匹配寻找目标

OpenCV
  • tony2278
  • tony2278
  • 2017-09-08 08:30
  • 102
    个人资料
    • 访问:12909次
    • 积分:160
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:9篇
    • 译文:0篇
    • 评论:1条
    文章分类