天天看点

定位图像中的指定目标实现源码

本文主要用opencv的 

cvMatchTemplate函数实现的模板匹配,此函数也可自己实现,楼主自己做了一种匹配方法准确度还有待提升,所以在此还是用的opencv的函数,下面先对这个函数做个说明:

比较模板和重叠的图像区域

void cvMatchTemplate( const CvArr* image, const CvArr* templ,
                      CvArr* result, int method );
      
image
欲搜索的图像。它应该是单通道、8-比特或32-比特 浮点数图像
templ
搜索模板,不能大于输入图像,且与输入图像具有一样的数据类型
result
比较结果的映射图像。单通道、32-比特浮点数. 如果图像是 W×H 而 templ 是 w×h ,则 result 一定是 (W-w+1)×(H-h+1).
method
指定匹配方法:
定位图像中的指定目标实现源码
定位图像中的指定目标实现源码

实现代码如下:

int picProcessBasics::IMGGetTargetRect(IplImage* srcImage, IplImage* dest,CvRect *targetRect)

{

 if(NULL == srcImage || NULL == dest)

  return -1;

 int srcW, srcH, templatW, templatH, resultH, resultW;

 double minValue, maxValue; 

 CvPoint minLoc, maxLoc;

 IplImage *result = NULL;

 srcW = srcImage->width; 

 srcH = srcImage->height; 

 templatW = dest->width; 

 templatH = dest->height; 

 resultW = srcW - templatW + 1; 

 resultH = srcH - templatH + 1; 

 result = cvCreateImage(cvSize(resultW, resultH), 32, 1); 

 cvMatchTemplate(srcImage,dest,result,CV_TM_CCORR_NORMED);

 cvMinMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc,0);

 targetRect->x = maxLoc.x;

 targetRect->y = maxLoc.y;

 targetRect->height = dest->height;

 targetRect->width = dest->width;

 cvReleaseImage(&result);

 return 0;

}

static void testIMGGetTargetRect()

{

 IplImage *pSrcImage =NULL;

 IplImage *pDstImage =NULL;

 char pic_path[MAX_PATH]={0};

 char tempS[MAX_PATH]={0};

 picProcessBasics mytest;

 CvRect targetRect;

 GetCurrentDirectory(MAX_PATH,pic_path);

 sprintf(tempS, "%s%s", pic_path,"\\pic\\stuff.jpg");

 pSrcImage = cvLoadImage(tempS, CV_LOAD_IMAGE_UNCHANGED);

 sprintf(tempS, "%s%s", pic_path,"\\pic\\myTestTarget.png");

 pDstImage = cvLoadImage(tempS, CV_LOAD_IMAGE_UNCHANGED);

 mytest.IMGGetTargetRect(pSrcImage,pDstImage,&targetRect);

 CvPoint pt1;

 pt1.x=targetRect.x;

 pt1.y=targetRect.y;

 CvPoint pt2;

 pt2.x=targetRect.x+targetRect.width;

 pt2.y=targetRect.y+targetRect.height;

 cvRectangle(pSrcImage,pt1,pt2,Scalar(0,255,0));

 sprintf(tempS, "%s%s", pic_path,"\\picResult\\testIMGGetTargetRect.jpg");

 cvSaveImage( tempS, pSrcImage,0);

 cvReleaseImage(&pSrcImage);

 cvReleaseImage(&pDstImage);

}

原图像:

定位图像中的指定目标实现源码

目标图像:

定位图像中的指定目标实现源码

检测到目标的结果:

定位图像中的指定目标实现源码