4

特定の領域にマーカーを保持している画像を使用しています。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は私たちに座標(位置)を与えますかマーカーまたは一致するパーセンテージ。または、これを行う他の方法はありますか。ご検討をお願いいたします。

4

1 に答える 1

2

テンプレートマッチングをテーマにしたOpenCVチュートリアルがあります。

matchTemplateを使用することは良いスタートであり、一致するメトリックに関連する数値を含む画像を提供します(メトリックにはさまざまな選択肢があり、より良い一致のために高い数値を提供するものもあれば、低いものもあります)。

その後、最適な一致を選択するには、この行列から最小値と最大値を見つけることができる関数minMaxLocも使用する必要があります。

于 2012-06-19T14:08:23.623 に答える