【问题标题】:How to detect and match a marker using OpenCV (Template Matching)如何使用 OpenCV(模板匹配)检测和匹配标记
【发布时间】:2012-06-19 05:51:00
【问题描述】:

我正在使用在特定区域放置标记的图像。我尝试使用模板匹配来做到这一点,这是在 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 是否给我们的坐标(位置)标记或匹配百分比。或者有没有其他方法。 感谢您的考虑。

【问题讨论】:

  • 你能发布一些代码吗?也许你正在使用一些图片?
  • 标记是什么意思?是不是有什么特殊颜色的物体?或者你能做到吗?那么你就不需要模板匹配了。只需颜色提取就足够了。如果您有屏幕截图,请将其上传到 imageshack.us,并在此处提供其链接。
  • 这里是图片的链接imageshack.us/photo/my-images/266/piggycard.jpg实际上这是一张图片卡。我正在为儿童制作教育工具。有更多带有独特标记的图像卡。所以从标记我要识别图像卡(我认为检测标记比检测整个图像卡更容易,或者哪种方式更好?我是新的)。感谢您的考虑。

标签: image-processing opencv object-detection


【解决方案1】:

有一个OpenCV tutorial on the subject of Template Matching

使用matchTemplate 是一个好的开始,它将为您提供包含与您的匹配指标相关的数字的图像(该指标有多种选择,其中一些提供较高的数字以获得更好的匹配,一些提供较低的数字) .

为了随后挑选出最佳匹配,您还需要使用函数minMaxLoc,它可以从该矩阵中找到最小值和最大值。

【讨论】:

    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多