我正在使用一个带有标记的图像。我尝试使用opencv中定义的cvMatchTemplate方法进行模板匹配来实现它。
我正在使用网络摄像头来检测它们,目前程序可以检测到标记,因为我提供了相同的标记作为模板。
但我无法找到一种方法来检查它是否是最佳匹配或仅是略微匹配。因为在cvMatchTemplate中,它不仅会检测到最佳匹配,还会继续检测略微匹配的区域。
请问有没有人能告诉我如何解决这个问题?如果有其他解决办法,请告诉我!
这是我的图像卡链接:http://imageshack.us/photo/my-images/266/piggycard.jpg/(我想检测并确认是否匹配)
这是代码:
我正在使用网络摄像头来检测它们,目前程序可以检测到标记,因为我提供了相同的标记作为模板。
但我无法找到一种方法来检查它是否是最佳匹配或仅是略微匹配。因为在cvMatchTemplate中,它不仅会检测到最佳匹配,还会继续检测略微匹配的区域。
请问有没有人能告诉我如何解决这个问题?如果有其他解决办法,请告诉我!
这是我的图像卡链接:http://imageshack.us/photo/my-images/266/piggycard.jpg/(我想检测并确认是否匹配)
这是代码:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
int main()
{
IplImage* imgOriginal = cvLoadImage("D:\\4Yr\\Research\\SRS\\Animations\\Piggycard.jpg", 0);
IplImage* imgTemplate = cvLoadImage("D:\\4Yr\\Research\\MakingOf\\Sample Imageas\\PiggyMarkerStart.jpg", 0);
CvCapture *cap = cvCaptureFromCAM(0);
if(!cap)
return -1;
cvNamedWindow("result");
IplImage* imgOriginal;
IplImage* imgOriginal2;
IplImage* imgResult;
while(true)
{
imgOriginal = cvQueryFrame(cap);//cvCreateImage(cvSize(imgOriginal->width-imgTemplate->width+1, imgOriginal->height-imgTemplate->height+1), IPL_DEPTH_32F, 1);
imgOriginal2 = cvCreateImage(cvSize(imgOriginal->width,imgOriginal->height),imgOriginal->depth,1);
imgResult = cvCreateImage(cvSize(imgOriginal->width-imgTemplate->width + 1,imgOriginal->height-imgTemplate->height+1),IPL_DEPTH_32F,1);
cvZero(imgResult);
cvZero(imgOriginal2);
cvCvtColor(imgOriginal,imgOriginal2,CV_BGR2GRAY);
cvMatchTemplate(imgOriginal2, imgTemplate, imgResult,CV_TM_CCORR_NORMED);
double min_val=0, max_val=0;
CvPoint min_loc, max_loc;
cvMinMaxLoc(imgResult, &min_val, &max_val, &min_loc, &max_loc);
cvRectangle(imgOriginal, max_loc, cvPoint(max_loc.x+imgTemplate->width, max_loc.y+imgTemplate->height), cvScalar(0), 1);
printf("%f \n", max_val);
cvShowImage("result", imgOriginal);
cvWaitKey(10);
cvReleaseImage(&imgOriginal2);
cvReleaseImage(&imgResult);
}
cvDestroyAllWindows();
cvReleaseCapture(&cap);
return 0;
}
我提供的模板与原始图像裁剪出的标记相同。从minMaxLoc中,我取得了最大值来检查最佳匹配。但当图像标记在一个位置时,它仍然给我相同的值。当图像标记不在框架内并且在先前与标记匹配的地方略微匹配时。minMaxloc是否给出标记的坐标(位置)或匹配百分比?还是有其他方法可以解决这个问题。 感谢您的考虑。