• ベストアンサー

テンプレートマッチングでの複数検出について

テンプレートマッチングでの複数検出について 現在、自分はC++でテンプレートマッチングを使い、入力画像から検索・追跡するプログラムを作っています。 そして、自分の今の考えでは、とある閾値以上であったら何個でも検出する。そして、テンプレート画像と同じパターンだけでなく、異なる傾きや大きさにでも対応出来るようにもしたいと思ってます。 しかし、この二つが調べて分からなく、前に進めない状況です。よかったら、アドバイス等をいただけると幸いです。 お願いします

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

基本的には 「異なる傾き」……テンプレート(またはマッチング対象)を傾けてマッチングを行う 「異なる大きさ」……テンプレート(またはマッチング対象)を拡大縮小してマッチングを行う というところでしょう。 現実にはあらゆる無限のパターンをチェックするというわけにはいかないから、あらかじめ限られた傾きや大きさでマッチングを行うか、もうちょっと大雑把にパターンマッチングを行い、類似性が見られたものに対して(傾きや大きさを合わせて)テンプレートマッチングを行うというやり方が妥当でしょう。 (パターンマッチングは特異点抽出等を行って、例えば四角とか三角とか類似のパターンを検出します)

enchan01
質問者

補足

magicalpassさん、ありがとうございます。 magicalpassさんの仰られた、「あらかじめ限られた傾きや大きさでマッチングを行う。」そして「多数個抽出する」というのが自分の目指すところではあります。 しかし、自身が未熟であるために、どのようにプログラムをすればいいのか分からない状況です。 現在もあるHPのサンプルを少しいじって、マッチングしている中で1番値の高いもののみ検出しています。 もしよろしければ、「複数個検出するもの」・「あらかじめ限られた傾きや大きさでマッチングを行うもの」のサンプル等があるHPやソースがあったら教えていただけたら幸いです。宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • matlabでテンプレートマッチングをforを使わずに行うには?

    matlabでテンプレートマッチングをforを使わずに行うには? テンプレートマッチングを行うときに 対象画像を走査して探したいのですがが、その際にfor文を使わずにテンプレートの領域を少しずつずらす方法がよくわかりません。 たとえば100×100の入力画像から10×10のテンプレートの相関の値を全検索するにはどのようにすればよいでしょうか? よろしくお願いします。

  • OPENCVでの複数テンプレートマッチング

    OPENCVを使って複数の画像を検出したいです。 こちらのサイトのようなことをしたいです。こちらはMAT型です。 私の使っている型ではうまくいきません。 http://workpiles.com/2015/05/opencv-matchtemplate-java/ 私のソースコードは下記の型を使用しております。 この型で複数マッチングするにはどうしたらよいでしょうか。 どなたかご教授いただけないでしょうか。 http://opencv.jp/sample/matching.html 

  • opencvのテンプレートマッチングについて

    私は、webカメラを使用し、動画像中の手形をリアルタイムで検出して、その手形に近い指文字を判別して、「あ」の形なら『あ』といった様に順次表示していくといったプログラムを作成しています。 現在、手の部分だけを抽出し、それをhandImageという画像として生成する段階まで来ました。 この後、このhandImageと、あらかじめ用意しておいたテンプレート画像(手の指文字画像)を比較し、handImageに似ている画像を求めるために、テンプレートマッチングを使用したいのですが、うまくいきません。 色々試しましたが、 "Sizes of input arguments do not match (image and template should have the same type)" と出てきたりで動きません。 それぞれの画素を読み込み、輝度値を比較していって似てる画像を探す方法なども考えました。 ザックリとしたソースコードを載せておきます。 IplImage *handImage = cvCreateImage(cvSize(100,100),IPL_DEPTH_8U,1); //手形部分の切り取り画像 IplImage *templateImage; for(int i = 26; i < 26; i++){ //テンプレ画像26枚を読み込む templateImage = cvLoadImage("yubimoji1.bmp") for(int y=0;y<lpt.y-fpt.y;y++){ for(int x=0;x<lpt.x-fpt.x;x++){ if( pix=(uchar)(skinImage->imageData[skinImage->widthStep*(y+fpt.y)+x+fpt.x]); //画素読み込み                   value1 == value2; //それぞれ輝度値を照らし合わせていく                   value ++;                  }                 ・                 ・                 ・            if(value > 100 * 100 * 0.8)                printf("あ\n");             else                printf("い\n"):                 ・                 ・                 ・ とまぁ、全然意味不明状態ですね。。。 どなたか、カメラ上(リアルタイム映像)でのテンプレートマッチングの方法、あるいはザックリとソースコードを書いて頂けたら、とても助かります。。。 よろしくお願いします。 動作環境 Windows 7 OpenCV_1.1pre1a Visual C++ 2008 Express Edition

  • 画像処理 (3次元のモデルと画像のマッチングのアルゴリズムについて)

    画像処理を勉強しているものなのですが、 現在2次元画像同士のマッチング(テンプレートマッチング)などはプログラムが組めるのですが 計算機内に作った3次元のモデルと画像のマッチング、つまり3次元物体の姿勢推定のアルゴリズムがよくわかりません。簡単でいいので教えてください。 よろしくお願いします。

  • OpenCVでのテンプレートマッチングについて

    質問させてください。 現在画像処理ライブラリのOpenCVを使ってテンプレートマッチングを用いた物体追跡しようと考えています。 今回作ってみたのですがどうしても、 「Bad argument(Array should be CvMat or IplImage)in function cvGetSize」 というエラーが出てしまいます。 おそらく画像の読み込みの部分だとは思うのですが・・・・ よろしくお願いします。 ソースプログラムは次のようになってます。 int main( void ) { int device1 = 0; int key=0; double max_interlinkage=0; double min_interlinkage=0; CvPoint max_point; CvPoint min_point; CvPoint corner_point; char windowNameTemplate[] = "Template"; // テンプレート画像を表示するウィンドウの名前 char windowNameDestination[] = "Destination"; // マッチング結果を表示するウィンドウの名前 //videoInputオブジェクト videoInput VI; //利用可能なキャプチャデバイス数を取得 int numDevices = VI.listDevices(); //キャプチャデバイスが見つからなかったら終了 if(numDevices == 0) { cerr << "[Error] Capture device not found!!" << endl; exit(-1); } //デバイス初期化(今回はデバイスID = 0,CAPTURE_WIDTH x CAPTURE_HEIGHTでキャプチャ) VI.setupDevice(device1, CAPTURE_WIDTH, CAPTURE_HEIGHT); IplImage *templateImage = cvLoadImage( "C:/Documents and Settings/ito/My Document/My Pictures/temp.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR ); IplImage *tempGray = cvCreateImage( cvGetSize(templateImage), IPL_DEPTH_8U, 1 ); if ( templateImage == NULL ) { // 画像が見つからなかった場合 printf( "画像が見つかりません\n" ); return -1; } cvCvtColor(templateImage,tempGray,CV_BGR2GRAY); IplImage *frameImage = cvCreateImage( cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 3 ); // 画像用IplImage IplImage *grayImage = cvCreateImage( cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 1 ); // 元画像をグレースケール化した画像用IplImage IplImage *dstImage = cvCreateImage( cvSize( frameImage->width - templateImage->width + 1, frameImage->height - templateImage->height + 1 ), IPL_DEPTH_32F, 1 ); // 相違度マップ画像用IplImage memcpy(frameImage->imageData, VI.getPixels(device1, false , true), frameImage->imageSize); cvCvtColor(templateImage,tempGray,CV_BGR2GRAY); //ループ開始 while(1){ //カメラ・デバイスから画像取得 memcpy(frameImage->imageData, VI.getPixels(device1, false , true), frameImage->imageSize); cvCvtColor(frameImage,grayImage,CV_BGR2GRAY); // テンプレートマッチングを行う cvMatchTemplate( grayImage, tempGray, dstImage, CV_TM_CCOEFF_NORMED ); // テンプレートが元画像のどの部分にあるのかという情報を得る cvMinMaxLoc( dstImage, &min_interlinkage, &max_interlinkage, &min_point, &max_point, NULL ); if(max_interlinkage>0.75){ corner_point=cvPoint(max_point.x+templateImage->width , max_point.y+templateImage->height); printf("point x=%d ",max_point.x+templateImage->width); printf("point y=%d ",max_point.y+templateImage->height); cvRectangle(frameImage , max_point , corner_point , CV_RGB(255,0,0) , LINE_THICKNESS , LINE_TYPE , SHIFT); printf("\n"); }else{ printf("point Lost\n"); } // ウィンドウを生成する cvNamedWindow( windowNameTemplate, CV_WINDOW_AUTOSIZE ); cvNamedWindow( windowNameDestination, CV_WINDOW_AUTOSIZE ); // 画像を表示する cvShowImage( windowNameTemplate, templateImage ); cvShowImage( windowNameDestination , frameImage ); //キー入力 key = cvWaitKey(1); if(key=='q'){ break; }else if(key=='c'){ cvSaveImage("image/frame.bmp",frameImage); } }

  • 画像パターンマッチングの演算について

    画像認識のパターンマッチングの中で正規化相互相関法がありますが、 テンプレートとして使う画像と比較画像において、 例えば、「し」という画像のテンプレートに対し、比較画像が「じ」である場合は「゛」が余分にあり正規化相互相関法では相関1になりませんが(背景濃度値は同じとして)、 これを「し」の部分が合致しているため、相関1としたいのですが、何か良い演算方法はありますでしょうか。 つまり、テンプレートに対し全く同じ領域が合致してさえすれば、テンプレートの画素以外にノイズがあっても相関を1としたいのです。 相互相関の手法以外でももちろん結構です。詳しい方ご教授ください。

  • テンプレート画像について

    gooブログでテンプレートの上のタイトルの部分に自分で撮った画像を表示させたいのですが上手くいきません。 テンプレートは「シンプル」→「クリアホワイト左」を選択しています。 テンプレート編集画面の「ヘッダーの指定」というところで 「#header」の後ろに「background-image:url(画像のURL); という風に入力していますが、何故か画像が複数表示されてしまいます。画像を1枚、更に右側に寄せて表示させるのにはどのようにしたらいいのでしょうか? どなたかお分かりの方、ご指導くださいませ。

  • 画像の比較について

    書き込み失礼します。 プログラム初心者です。 現在、私はVC++とOpenCVをつかってテンプレートマッチングなるものを試しています。 その中でマッチング結果(0.0や0.5、1.0など)を見たいと思っているのですが、画像と画像を比較すると0.0から1.0に正規化しているにも関わらず現れる数値は15495939などの値になってしまったりします。 見ようとしている場所が悪いのかプログラムが悪いのか画像が悪いのか(画像はカメラで取得したものを使用)が全くわかりません。 大変申し訳ありませんがご助言に頂けたら幸いです。 いかに私が書いているテンプレートマッチングのプログラムの一部をしめします。 //テンプレートマッチングを行う cvMatchTemplate(sourceBinaryImage,templateBinaryImage,differenceMapImage,CV_TM_SQDIFF); //テンプレートが画像のどの部分にあるのかという情報を得る cvMinMaxLoc(differenceMapImage,&minValue,&maxValue,&minLocation,&maxLocation,NULL); //結果の表示方法の統一 cvNormalize(differenceMapImage,differenceMapImage,1,0,CV_MINMAX); printf("%d\n",&minValue);

  • 複数ポイントを検出できるタッチパネル

    「複数ポイントを検出できるタッチパネル」ってどんな物がありますか? Webで検索したところ、タッチパネルには抵抗膜、超音波、赤外線、静電容量、電磁誘導、画像認識、などの方式があるようです。普通に考えると画像認識以外の方法では複数の場所をタッチすると誤認識すると思いますが、複数の場所をタッチしても問題なく検出できる方式ってありますか? 具体的に言うと「iPod touch」のタッチパネルも二本指での操作がありますよね。 「iPod touch」のタッチパネルの方式は何か?あるいはその他の方式にどんな物があるか? が質問です。

  • カスペルスキーにてキーロガーを検出したようなのですが…

    完全スキャンを実行したところ、マルウェア類(トロイ等)ではなく「悪意が潜在するプログラム」として検出名「Keylogger」が検出されました。 バージョンは2009を使用しています。 しかしながら駆除方法は明らかにはならず、 検出名を右クリックして飛べるウィルス辞典にも何も情報は載っていませんでした。 カスペルスキーは誤検出があるとよくお伺いになるのですが…どうなのでしょうか? Spybotにてスキャンしても何も検出されず… 今自分が施すべき処置を教えて頂けると幸いです。 最近クレジットカードの入力をしたばかりなので非常に心配しています。