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

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

ただいまの
回答率

90.48%

  • C++

    4505questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    1552questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

opencvでの複数体のテンプレートマッチング

解決済

回答 2

投稿 編集

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

yamata

score 28

opencvでのテンプレートマッチングを進めています。

1枚の写真に対して、2枚のテンプレート画像をマッチングさせたいと思いプログラムを作成しています。

プログラムを作成したのですが、エラーが出て進みません。
エラー内容は、Array should be CvMat or IplImageです。
画像の受け渡しがうまくいっていないと考えたのですが、どこに問題があるのでしょうか?
それとも、プログラムの作り方自体に問題があるのでしょうか?
よろしくお願い致します。

使用環境は、VC++2010Express、opencv2.4.9です。

以下にコードをのせます。
具体的にエラーがでる箇所は、
---グレースケールの場合---
の以下5行くらいです。

よろしくお願いします。

int main( int argc , char** argv)
{
    int key;//キー入力用の変数
    CvCapture *capture = cvCaptureFromCAM(0);//カメラキャプチャ用の構造体、初期化
    IplImage *frameImage = NULL;//キャプチャ画像用IplImage
    char windowNameCapture[] = "Capture";//キャプチャした画像を表示するウィンドウの名前
    char windowNameTemplate[] = "result";//結果を表示するウィンドウの名前

    int counter = 0;
    char str[32];

    #define LINE_THICKNESS    1
    #define LINE_TYPE    8
    #define SHIFT    0

    #define SCALE_X 0.3
    #define SCALE_Y 0.3

    IplImage * temp_up = NULL;
    IplImage * temp_side = NULL;
    IplImage * dst1 = NULL;
    IplImage * dst2 = NULL;
    IplImage * img = NULL;
    IplImage *scale_frameImage = NULL;
    IplImage * grey_img = NULL;
    IplImage * grey_temp_up = NULL;
    IplImage * grey_temp_side = NULL;
    IplImage * output =NULL;
    IplImage * binary_img = NULL;
    IplImage * binary_temp = NULL;
    IplImage * scale_grey_img = NULL;
    IplImage *scale_img = NULL;
    IplImage * gamma_img = NULL;

    double max_inter1inkage=0;
    double min_inter1inkage=0;
    double max_inter2inkage=0;
    double min_inter2inkage=0;

    //取込サイズの設定
    cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH,  960);
    cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, 720);

    CvPoint max_point;
    CvPoint min_point;

    //カメラ有無
    if( capture == NULL )
    {
        printf( "カメラが見つかりません\n" );
        return -1;
    }

    //カメラ・デバイスから画像を取得
    frameImage=cvQueryFrame(capture);

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

        //変換画像用IplImage
        scale_frameImage=cvCreateImage(cvSize((int)(frameImage->width*SCALE_X), (int)(frameImage->height*SCALE_Y)), IPL_DEPTH_8U, 3);
        //変換
        cvResize(frameImage, scale_frameImage, CV_INTER_LINEAR);

        //キャプチャ表示
        cvNamedWindow("Capture",CV_WINDOW_AUTOSIZE);
        cvShowImage("Capture",scale_frameImage);

        //画像を表示する
        //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);

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

            //---------テンプレート画像を読み込む-------
            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_img=cvCreateImage(cvGetSize(img),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作成(元画像)

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

            //グレー・スケールに変換して格納
            cvCvtColor(img,grey_img,CV_BGR2GRAY);

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

            //グレースケール表示
            cvNamedWindow("grey_temp_up_window",CV_WINDOW_AUTOSIZE);
            cvShowImage("grey_temp_up_window",grey_temp_up);
            cvNamedWindow("grey_temp_side_window",CV_WINDOW_AUTOSIZE);
            cvShowImage("grey_temp_side_window",grey_temp_side);

            //変換画像用IplImage
            scale_grey_img=cvCreateImage(cvSize((int)(grey_img->width*SCALE_X), (int)(grey_img->height*SCALE_Y)), IPL_DEPTH_8U, 1);
            //変換
            cvResize(grey_img, scale_grey_img, CV_INTER_LINEAR);

            cvNamedWindow("grey_img_window",CV_WINDOW_AUTOSIZE);
            cvShowImage("grey_img_window",scale_grey_img);

            cvMatchTemplate(grey_img,grey_temp_up,dst1,CV_TM_CCOEFF_NORMED);    //テンプレートマッチング
            cvMatchTemplate(grey_img,grey_temp_side,dst2,CV_TM_CCOEFF_NORMED);    //テンプレートマッチング
            //-------------------------------------------------------------------------------------------------------------

            //-----------マッチング点を求める---------
            cvMinMaxLoc(dst1,&min_inter1inkage,&max_inter1inkage,&min_point,&max_point,NULL);
            cvMinMaxLoc(dst2,&min_inter2inkage,&max_inter2inkage,&min_point,&max_point,NULL);

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

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

                //変換画像用IplImage
                scale_img=cvCreateImage(cvSize((int)(img->width*SCALE_X), (int)(img->height*SCALE_Y)), IPL_DEPTH_8U, 3);
                //変換
                cvResize(img, scale_img, CV_INTER_LINEAR);

                //画像を表示
                cvNamedWindow("result",CV_WINDOW_AUTOSIZE);
                cvShowImage("result",img);

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

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

            }

            else
            {
                printf("Lost %lf\n",max_inter1inkage);
            }

            //タイマー終了
            int64 end = cv::getTickCount();
            double elapsedMsec = ( end - start )*1000/cv::getTickFrequency();

            //タイマー表示
            std::cout << elapsedMsec <<"ms" <<std::endl;
            printf("\n");
        }

        //メモリ解放
            cvReleaseImage(&output);
            cvReleaseImage(&img);
            cvReleaseImage(&temp_up);
            cvReleaseImage(&temp_side);
            cvReleaseImage(&grey_img);
            cvReleaseImage(&grey_temp_up);
            cvReleaseImage(&grey_temp_side);
            cvReleaseImage(&dst1);
            cvReleaseImage(&dst2);
            cvReleaseImage(&binary_img);
            cvReleaseImage(&binary_temp);
            cvReleaseImage(&scale_frameImage);
            cvReleaseImage(&scale_grey_img);
            cvReleaseImage(&scale_img);
            cvReleaseImage(&scale_frameImage);
    }    

    //メモリ開放
    cvReleaseCapture(&capture);
    cvDestroyWindow("Capture");
    cvDestroyWindow("temp_up_window");
    cvDestroyWindow("temp_side_window");
    cvDestroyWindow("grey_temp_up_window");
    cvDestroyWindow("grey_temp_side_window");
    cvDestroyWindow("grey_img_window");
    cvDestroyWindow("result");

    return 0;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

こんにちは。

Array should be CvMat or IplImageで検索したところ、ほぼ同じQAがありました。
この内容と同じく、img=cvLoadImage(...);temp_up=cvLoadImage(...);temp_side=cvLoadImage(...);のどれかに失敗しているのではないでしょうか?
各img, temp_up, temp_sideがNULLでないか確認してみて下さい。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/19 13:08

    実行してみると、キャプチャ映像、temp_up、temp_sideが表示されてからエラーがでます。
    この場合でも、ロードで失敗しているのでしょうか?
    あっていると思うのですが、、、

    キャンセル

  • 2016/10/19 13:22

    キーを押して保存の読み込む画像が間違っていました。
    解決できました。ありがとうございます!

    キャンセル

0

以前に同様のエラーを経験して意外な原因で解決。画像の読み込みの失敗からその後の処理でエラー。まずは対象となるデータがちゃんと読み込まれているか確認されてみてください。
Chironianさんのコメントも解釈が同じとも思えます。
つまり
//---------テンプレート画像を読み込む-------
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);    //カラー読み込み
この部分だと予測します。ファイル名のパスを絶対パスで指定する事もお試しください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/19 13:08

    実行してみると、キャプチャ映像、temp_up、temp_sideが表示されてからエラーがでます。
    この場合でも、ロードで失敗しているのでしょうか?

    キャンセル

  • 2016/10/19 13:22

    キーを押して保存の読み込む画像が間違っていました。
    解決できました。ありがとうございます!

    キャンセル

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

  • C++

    4505questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • OpenCV

    1552questions

    OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。