如何使用OpenCV(模板匹配)检测和匹配标记

4
我正在使用一个带有标记的图像。我尝试使用opencv中定义的cvMatchTemplate方法进行模板匹配来实现它。
我正在使用网络摄像头来检测它们,目前程序可以检测到标记,因为我提供了相同的标记作为模板。
但我无法找到一种方法来检查它是否是最佳匹配或仅是略微匹配。因为在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是否给出标记的坐标(位置)或匹配百分比?还是有其他方法可以解决这个问题。 感谢您的考虑。


1
你能发布一些代码吗?还有你使用的图片可以分享吗? - dom
1
什么是标记?它是任何特定颜色的对象吗?或者你可以这样做吗?那么你就不需要模板匹配了,只需要颜色提取就足够了。如果你有屏幕截图,请在imageshack.us上上传,并在此处提供链接。 - Abid Rahman K
这是图片的链接http://imageshack.us/photo/my-images/266/piggycard.jpg/,实际上这是一张图像卡片。我正在为儿童制作教育工具。还有更多的图像卡片,它们拥有独特的标记。因此,从标记中,我将识别图像卡片(我认为检测标记比检测整个图像卡片更容易,或者哪种方法更好?我对此很新)。谢谢您的考虑。 - MUSTY
1个回答

2
这里有一个关于模板匹配的OpenCV教程
使用matchTemplate是一个很好的开始,它会提供一个包含与匹配度相关数字的图像(有多种选择的度量标准,有些提供更高的数字表示更好的匹配,有些则相反)。
为了随后挑选出最佳匹配,您还需要使用minMaxLoc函数,该函数可以从此矩阵中定位最小值和最大值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接