图像模板匹配

来源:互联网 发布:离散最优化问题 编辑:程序博客网 时间:2024/05/18 00:37

        模板匹配是在一幅图像中寻找到与给定目标模板图像的技术。在匹配过程中有两个主要因素:原图像I,模板图像T。为了在I上检测到与T最匹配的区域,需要在I上滑动模板窗口,每次需要将T在I上滑动一个像素大小(从左至右,从上至下),每次移动后,计算出其相似度来表征匹配结果的好与坏。依次将每个位置的匹配结果存储在R矩阵中,该矩阵的每一个点的亮度表示与模板T的匹配程度(越亮,匹配程度越高)。通过 minMaxLoc 函数可以找到R矩阵中的最大(小)值。

   匹配方法:

   a)method=CV_TM_SQDIFF  

   b)method=CV_TM_SQDIFF_NORMED 

   c)method=CV_TM_CCORR 

   d)method=CV_TM_CCORR_NORMED 

   e)method=CV_TM_CCOEFF  

   f)method=CV_TM_CCOEFF_NOR


以下是实现图像匹配的例程,其中定义了一个函数match实现匹配的具体过程:

// Templatematch.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "opencv2/opencv.hpp" using namespace std;using namespace cv;void match(Mat img,Mat tem);int main( int argc, char** argv ){   Mat img;   Mat tem;    img = imread("xiaobei.jpg" );                    //读取原图像"xiaobei.jpg"if( img.empty() ) {                                     //判断是否读取成功    cerr <<  "Cannot load file " << "xiaobei.jpg" << endl;   return -1;    }     tem = imread("mask.jpg");                       //读取模板图像"mask.jpg" if( tem.empty()) {   cerr <<  "Cannot load file " <<"mask.jpg" << endl;   return -1;   }   match( img, tem);                          imshow( "result", img );   imshow( "template", tem );                      //显示结果/* wait until user press a key to exit */   cvWaitKey( 0 );    return 0;   }void match(Mat img,Mat tem){Mat res;   Mat mask;  Point        minloc, maxloc;   double        minval, maxval;      int res_cols  = img.cols - tem.cols + 1;   int res_rows = img.rows - tem.rows + 1;           res = cvCreateImage( cvSize(res_cols,res_rows), IPL_DEPTH_32F, 1 );        matchTemplate( img, tem, res,CV_TM_SQDIFF_NORMED ); //归一化平方差匹配法        minMaxLoc( res, &minval, &maxval, &minloc, &maxloc,mask);        rectangle( img, cvPoint( minloc.x, minloc.y ), cvPoint( minloc.x + tem.cols, minloc.y + tem.rows ),                    cvScalar( 255, 255, 255, 0 ), 1, 0, 0 );  }






演示效果:

模板:

       

结果:   



这里主要对以下两点进行分析:

1)

        int res_cols  = img.cols - tem.cols + 1;          int res_rows = img.rows - tem.rows + 1; 
结果矩阵R的计算,我是这样理解的:文章开篇提到模板图像每次在原图像上移动一个像素,并将计算出来的相似度存储在R中,那么在整个图像上每行横向移动只需移动img.rows-tem.rows个长度,因此每行共计算出img.rows-tem.rows+1个结果。同理,每列共计算出img.cols-tem.cols+1个结果。

 2)两个函数:




未完待续~~~~~~~~~



















0 0