質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.99%

opencvを用いたテンプレートマッチング

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,061

yamata

score 34

opencvを使ってテンプレートマッチングを行っています。

1枚の画像に対して、2枚のテンプレートでマッチングを行いたいと考えています。
テンプレートの画像は、2枚とも別の写真で、1枚の画像から2つの物体を見つけたいということです。

現在は、
1枚の画像撮影→画像をコピー→元の画像にテンプレート1、コピーの画像にテンプレート2をマッチングさせる→類似度表示 という形で行っています。

最後の類似度を表示させる段階で、2枚それぞれの類似度を表示できなくて困っています。
解決方法を教えていただけたらと思います。

動作環境は、   
opencv2.4.9、vc++2010Expressです。

また、コードを以下に書きます。
よろしくお願い致します。

また、別の方法があれば教えていただきたいです。(1枚の画像に対して2枚のテンプレートをマッチングさせる方法)

while ( 1 )
    {
        //カメラからの入力画像1フレームをframeImageに格納する
        frameImage = cvQueryFrame( capture );

        //画像を表示する
        //cvShowImage( windowNameCapture, frameImage );

        //'q'キーが入力されたらループを抜ける
        key = cvWaitKey( 1 );

        if ( key == 'q' )
        {
            break;
        }
        else if( key == 'c')
        {
            int64 start = cv::getTickCount();//所要時間計測

            cvSaveImage("sign.bmp", output); //キーを押して保存
            //cvNamedWindow("window picture",CV_WINDOW_AUTOSIZE);
            //cvShowImage("window picture",frameImage);

            //--------原画像を読み込む---------
            img1=cvLoadImage("sign.bmp",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);    //カラー読み込み
            img2=cvCloneImage(img1);

            //---------テンプレート画像を読み込む-------
            temp_up=cvLoadImage("temp_up.png",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);    //カラー読み込み
            temp_side=cvLoadImage("temp_side.png",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);    //カラー読み込み

            //テンプレート画像表示
            cvNamedWindow("temp_up_window",CV_WINDOW_AUTOSIZE);
            cvShowImage("temp_up_window",temp_up);
            cvNamedWindow("temp_side_window",CV_WINDOW_AUTOSIZE);
            cvShowImage("temp_side_window",temp_side);
      grey_img1=cvCreateImage(cvGetSize(img1),IPL_DEPTH_8U,1);            //1チャンネル8ビットのIplImage作成(元画像)
            grey_img2=cvCreateImage(cvGetSize(img2),IPL_DEPTH_8U,1);            //1チャンネル8ビットのIplImage作成(元画像)

            grey_temp_up=cvCreateImage(cvGetSize(temp_up),IPL_DEPTH_8U,1);        //1チャンネル8ビットのIplImage作成(元画像)
            grey_temp_side=cvCreateImage(cvGetSize(temp_side),IPL_DEPTH_8U,1);        //1チャンネル8ビットのIplImage作成(元画像)

            gamma_img1=cvCreateImage(cvGetSize(img1), img1->depth, img1->nChannels);    //ガンマ用領域確保
            gamma_img2=cvCreateImage(cvGetSize(img2), img2->depth, img2->nChannels);    //ガンマ用領域確保

            dst1 =cvCreateImage(cvSize(img1->width-temp_up->width+1,img1->height-temp_up->height+1),IPL_DEPTH_32F,1);    //領域確保
            dst2 =cvCreateImage(cvSize(img2->width-temp_side->width+1,img2->height-temp_side->height+1),IPL_DEPTH_32F,1);    //領域確保

            dst1 =cvCreateImage(cvSize(gamma_img1->width-temp_up->width+1,gamma_img1->height-temp_up->height+1),IPL_DEPTH_32F,1);    //ガンマ用領域確保
            dst2 =cvCreateImage(cvSize(gamma_img2->width-temp_side->width+1,gamma_img2->height-temp_side->height+1),IPL_DEPTH_32F,1);    //ガンマ用領域確保

            //グレー・スケールに変換して格納
            cvCvtColor(img1,grey_img1,CV_BGR2GRAY);
            cvCvtColor(img2,grey_img2,CV_BGR2GRAY);

            cvCvtColor(temp_up,grey_temp_up,CV_BGR2GRAY);
            cvCvtColor(temp_side,grey_temp_side,CV_BGR2GRAY);

            //グレースケール表示
            cvNamedWindow("grey_img1_window",CV_WINDOW_AUTOSIZE);
            cvShowImage("grey_img1_window",grey_img1);
            cvNamedWindow("grey_img2_window",CV_WINDOW_AUTOSIZE);
            cvShowImage("grey_img2_window",grey_img2);

            cvMatchTemplate(grey_img1,grey_temp_up,dst1,CV_TM_CCOEFF_NORMED);    //テンプレートマッチング
            cvMatchTemplate(grey_img2,grey_temp_side,dst2,CV_TM_CCOEFF_NORMED);    //テンプレートマッチング
    //-----------マッチング点を求める---------
            cvMinMaxLoc(dst1,&min_inter1inkage,&max_inter1inkage,&min_point,&max_point,NULL);
            cvMinMaxLoc(dst2,&min_inter1inkage,&max_inter1inkage,&min_point,&max_point,NULL);


            //------マッチングを表示する-----
            //相関値0.75以下ならばLostを表示して次に行く

            if(max_inter1inkage>0.75)
            {
                //マッチング箇所を四角で描画
                cvRectangle(img1,max_point,cvPoint(max_point.x+temp_up->width,max_point.y+temp_up->height),CV_RGB(255,0,0),3);
                cvRectangle(img2,max_point,cvPoint(max_point.x+temp_side->width,max_point.y+temp_side->height),CV_RGB(255,0,0),3);

                //画像を表示
                cvNamedWindow("result1",CV_WINDOW_AUTOSIZE);
                cvShowImage("result1",img1);
                cvNamedWindow("result2",CV_WINDOW_AUTOSIZE);
                cvShowImage("result2",img2);


                //類似度表示
                printf("Detection %lf\n",max_inter1inkage);
                printf("Detection %lf\n",max_inter1inkage);


                sprintf_s(str, "C:\\opencv_re\\result_%04d.bmp", counter++);
                cvSaveImage(str, img1 );

            }

            else
            {
                printf("Lost %lf\n",max_inter1inkage);
            }
コード
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • yohhoy

    2016/10/11 14:58 編集

    「類似度を表示させる段階で、2枚それぞれの類似度を表示できなくて」とありますが、単純に2回のcvMinMaxLoc呼び出し結果をそれぞれ別の変数に格納するだけでは?具体的にどういう結果を望んでいるのでしょうか。

    キャンセル

  • yamata

    2016/10/11 15:18

    それを行いたいと考えています。しかし、その方法が分からないため教えていただけたらと思います。

    キャンセル

  • yohhoy

    2016/10/11 15:39

    文字通り、変数max_inter1inkageとは別の変数max_inter2inkageなどを用意し、2枚目の画像dst2へのcvMinMaxLoc呼び出しで使えばよいのではという指摘です。それも難しいというお話であれば、他の方のサポートにお任せします…

    キャンセル

  • yamata

    2016/10/12 12:08

    ありがとうございます。解決できました。

    キャンセル

回答 1

check解決した方法

0

解決できました。ありがとうございます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る