2014年5月30日 星期五

使用OpenCV做模板匹配 ( Template Matching using OpneCV )

介紹:
  • 如何使用模板匹配
Introduction:
  • How to do template matching in OpenCV library. 

開發環境:
  • Visual Studio 2010
  • Windows 7
  • OpenCV 2.4.5


#include "stdafx.h"
#include <highgui.h>
#include <cvaux.h>

void main()
{
 IplImage *pSrcImg = NULL;
 IplImage *pDstImg = NULL; 
 IplImage* pTempImg = cvLoadImage("template.jpg");
 CvCapture *capture = cvCaptureFromCAM(0);
 while(true)
 {
  pSrcImg = cvQueryFrame(capture);
  CvRect rectROI = cvRect( 0, 0, pSrcImg->width, pSrcImg->height);  
       
  CvSize size;
  size.width = rectROI.width - pTempImg->width+1;      
  size.height = rectROI.height - pTempImg->height+1;

  pDstImg = cvCreateImage(size, IPL_DEPTH_32F, 1);     
  cvSetImageROI(pSrcImg, rectROI);
  cvMatchTemplate(pSrcImg, pTempImg, pDstImg, CV_TM_SQDIFF_NORMED);

  cvResetImageROI(pSrcImg);
  double min, max;
  CvPoint minLoc;
  cvMinMaxLoc(pDstImg, &min, &max, &minLoc, NULL);
        
  minLoc.x = minLoc.x+rectROI.x;
  minLoc.y = minLoc.y+rectROI.y;
  CvPoint point2 = cvPoint(minLoc.x+pTempImg->width, 
   minLoc.y+pTempImg->height);
  cvRectangle(pSrcImg, minLoc, point2, cvScalar(255,255,255));

  cvShowImage("pSrcImg", pSrcImg);

  rectROI.x = minLoc.x-pTempImg->width/2>0 ? 
   minLoc.x-pTempImg->width/2 : 0;
  rectROI.y = minLoc.y-pTempImg->height/2>0 ? 
   minLoc.y-pTempImg->height/2 : 0;
  rectROI.width = 2*pTempImg->width;
  rectROI.height = 2*pTempImg->height;

  cvReleaseImage(&pDstImg);
  cvWaitKey(30);
 }
 cvReleaseImage(&pSrcImg);
 cvReleaseImage(&pTempImg);
}

void cvSetImageROI(IplImage* image,CvRect rect)
  • image : ROI影像來源
  • rect : ROI矩形

void cvMatchTemplate( const CvArr* image, const CvArr* templ, CvArr* result, int method )
  • image : 來源影像
  • templ : 模板影像
  • result : 匹配值影像
  • method : 匹配方法
CV_TM_SQDIFF 平方差匹配法:值越小匹配程度越高
CV_TM_CCORR 相關匹配法:值越高匹配程度越高
CV_TM_CCOEFF 相關係數匹配法:1表示匹配高,-1表示匹配低
CV_TM_SQDIFF_NORMED 
CV_TM_CCORR_NORMED 
CV_TM_CCOEFF_NORMED 

void cvMinMaxLoc( const CvArr* arr, double* min_val, double* max_val,
             CvPoint* min_loc=NULL, CvPoint* max_loc=NULL, const CvArr* mask=NULL )
  • arr : 欲處理影像來源
  • min_val : 數據中最小值
  • max_val : 數據中最大值
  • min_loc : 最小值的座標
  • max_loc : 最大值的座標
  • mask : 指定處理ROI區塊

相關文章:OpenCV學習日記

2 則留言:

  1. 你好,我想請問關於AForge.NET的模板比對使用方法...

    ExhaustiveTemplateMatching templateMatching = new ExhaustiveTemplateMatching(0.8f);
    Suit suit = Suit.NOT_RECOGNIZED;

    if (color == 'R') // 如果是紅色
    {
    if (templateMatching.ProcessImage(bmp, hearts).Length > 0)
    suit = Suit.Hearts; //匹配紅桃
    if (templateMatching.ProcessImage(bmp, diamonds).Length > 0)
    suit = Suit.Diamonds; // 匹配方塊
    }
    正常情況下,有比對成功的話,應該是會顯是我要的文字,但是都沒有看到...

    回覆刪除
  2. if (color == 'R') // 如果是紅色
    {
    }

    這一個判斷會過嗎?

    因為看不到前後關係,sorry沒幫上忙!!

    回覆刪除