我正在使用在特定区域保存标记的图像。我尝试使用模板匹配来做到这一点,这是在 opencv 中定义为 cvMatchTemplate 的方法。
我正在使用网络摄像头来检测它们,目前程序正在检测标记,因为我提供了与模板相同的标记。
但是我找不到一种方法来检查它是最佳匹配还是稍微匹配。因为在 cvMatchTemplate 中,它不仅检测最佳匹配,还不断检测稍微匹配的区域。
谁能告诉我一种方法来做到这一点。或者如果我的问题有其他方法,请告诉我!
这是我的图像卡的链接 http://imageshack.us/photo/my-images/266/piggycard.jpg/ (我想检测并检查它是否经过加工)
这是代码
// template_mching_test_2.cpp : 定义控制台应用程序的入口点。//
#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 是否给我们的坐标(位置)标记或匹配百分比。或者有没有其他方法。谢谢您的考虑。