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

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

ただいまの
回答率

90.33%

  • C++

    3787questions

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

  • OpenCV

    1240questions

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

テンプレートマッチングを行う際のエラー

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,218

yamata

score 28

opencvでテンプレートマッチングを行っていると、画像のエラーが出ます。

イメージ説明

以下のプログラムになるのですが、エラーの箇所を調べていると、
プログラム内の

cvMatchTemplate(copy_img1,temp_up,dst1,CV_TM_CCOEFF_NORMED);    //テンプレートマッチング
            cvMatchTemplate(copy_img2,temp_side,dst2,CV_TM_CCOEFF_NORMED);    //テンプレートマッチング

の部分でエラーが出ることが分かりました。

この部分では、テンプレートマッチングを行っているだけなので、
その上の部分の

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


の定義が正しくないのかなと考えます。

しかし、解決方法がわからないのでよろしくお願い致します。


変更しました。
先ほどのプログラムが正常に動作したため、以下のプログラムに変更しました。すると、
img.depth()==CV_8U||img.depth()==CV_32F) && img.type()==templ.type())
というエラーが出ます。

順番に確かめていったところ
scale_img=cvCreateImage(cvSize((int)(img->width*SCALE_X), (int)(img->height*SCALE_Y)), IPL_DEPTH_8U, 3);
以上の部分がおかしいと考えています。
1チャンネルで定義すると、scale_imgを表示しようとするとエラーが出ます。しかし、3チャンネルに変更すると、画像を表示できても、最終的にエラーが出ます。
どのような変更が必要なのでしょうか?

//---------テンプレート画像を読み込む-------
    temp_up=cvLoadImage("C:\\opencv_ICImage\\2017-1-12\\銀小ネジ\\ver2\\背景差分\\temp_up.bmp",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);    //カラー読み込み
    temp_side=cvLoadImage("C:\\opencv_ICImage\\2017-1-12\\銀小ネジ\\ver2\\背景差分\\temp_side.bmp",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);    //カラー読み込み

    for ( int number =1; number<717;++number)
    {
        int64 start = cv::getTickCount();//所要時間計測    

        //------------------------原画像読み込み-------------------------------
        std::stringstream filename;
        filename << "C:\\opencv_ICImage\\2017-1-12\\銀小ネジ\\ver2\\背景差分\\静止画\\sabun" << std::setfill('0') << std::setw(4)  << number << ".bmp";
        std::cout << "filename=" << filename.str() << std::endl;
        IplImage* img=cvLoadImage(filename.str().c_str());
        //--------------------------------------------------------------------------

        //変換画像用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);

        //原画像コピー
        copy_img1=cvCloneImage(scale_img);
        copy_img2=cvCloneImage(scale_img);

        //赤枠で囲む
        cvRectangle(scale_img,cvPoint(112,68),cvPoint(151,128),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT);
        cvRectangle(scale_img,cvPoint(218,70),cvPoint(258,125),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT);//左上、右下

        //-----------------ROIの設定----------------------
        CvRect rect1;
        rect1.x = 112;
        rect1.y = 68;
        rect1.width = 39;
        rect1.height = 60;
        cvSetImageROI(copy_img1,rect1);

        CvRect rect2;
        rect2.x = 218;
        rect2.y = 70;
        rect2.width = 40;
        rect2.height = 55;
        cvSetImageROI(copy_img2,rect2);//左上、幅、高さ
        //----------------------------------------------------

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

        cvMatchTemplate(copy_img1,temp_up,dst1,CV_TM_CCOEFF_NORMED);    //テンプレートマッチング
        cvMatchTemplate(copy_img2,temp_side,dst2,CV_TM_CCOEFF_NORMED);    //テンプレートマッチング

        cvNamedWindow("result",CV_WINDOW_AUTOSIZE);
        cvShowImage("result",dst2);

        printf("%d,%d\n",abs(rect2.width-temp_side->width)+1,abs(rect2.height-temp_side->height)+1);
        //printf("%d,%d\n",img->width,img->height);



            cvWaitKey(0);
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

0

エラーの内容を読むと、画像のサイズが合っていないという内容におもえますが。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/01/24 21:10

    ありがとうございます。私もそのようにも考えたのですが、
    どの画像サイズが合っていないのかわかりません。

    キャンセル

  • 2017/01/24 21:43

    一応、temp,haikei,imgともに720*480となっています

    キャンセル

  • 2017/01/24 21:49 編集

    scale_img や tmp_upが IPL_DEPTH_8Uであるのに dst1 などが IPL_DEPTH_32F になっていますね。これは、同じでなければなりません。

    キャンセル

  • 2017/01/25 11:05

    私もそれを試したことはあるのですが、同じにしてもエラーが変わりませんでした。

    キャンセル

  • 2017/01/25 11:14

    では、dstのサイズ、(abs(rect3.width-temp_up->width)+1, abs(rect3.height-temp_up->height)+1) が、copy_img1 と合わないのではないかと。

    キャンセル

  • 2017/01/25 11:49

    そこになるのでしょうか。あまり詳しくないため、
    (abs(rect3.width-temp_up->width)+1, abs(rect3.height-temp_up->height)+1)
    この部分は使いまわしています。copy_img1に変更してみてもエラーが出ました。
    dstは、テンプレートマッチング用の領域確保として定義しているのですが、どのような変更が必要なのでしょうか?copy_img1と合わせるとは、どのような意味になるのでしょうか

    キャンセル

  • 2017/01/25 11:51

    このサイズがいくつなのかわからないため、出力してみていただけますか?

    キャンセル

  • 2017/01/25 12:04

    printf("%d,%d",dst1->width,dst1->height);
    を表示してみると、255,133
    printf("%d , %d",(abs(rect3.width-temp_up->width)+1,abs(rect3.height-temp_up->height)+1))
    を表示してみると、133、-662728056
    となりました。違う物を表示していたらすいません。

    キャンセル

  • 2017/01/25 12:12 編集

    abs(rect3.height-temp_up->height)+1がおかしいのはきになりますが、おいておくとして。
    同じ感じで、 temp_up と copy_img1のサイズはどうでしょう?

    キャンセル

  • 2017/01/25 12:15

    printf("%d,%d",temp_up->width,temp_up->height);
    を表示してみると、288,192
    printf("%d,%d",copy_img1->width,copy_img1->height);
    を表示してみると、288,192
    でした。これらのサイズと。dst1のサイズが同一でないといけないのでしょうか?
    また、abs(rect3.height-temp_up->height)+1)
    の数値がおかしいことにも問題はあるのでしょうか?

    キャンセル

  • 2017/01/25 12:17

    http://opencv.jp/opencv-2svn/c/imgproc_object_detection.html
    void cvMatchTemplate(const CvArr* image, const CvArr* templ, CvArr* result, int method)
    テンプレートと,それと重なる領域の画像とを比較します.
    パラメタ:

    image – テンプレートとの比較を行う対象画像.8ビットあるいは32ビット,浮動小数点型.
    templ – テンプレート.比較対象となる画像以下のサイズで,同じデータ型でなければいけません.
    result – 比較結果のマップ.シングルチャンネル,32ビット,浮動小数点型. image が W \times H で, templ が w \times h の場合, result は必ず (W-w+1) \times (H-h+1) となります.
    method – テンプレートと画像領域とを比較する方法(以下を参照してください).

    ここをみてチャレンジシてみてください。(少し手が離せなくなりました)

    キャンセル

  • 2017/01/25 12:30

    ありがとうございます。よく確認してみると、temp_upは、cvSetImageROI(temp_up,rect1);
    の部分でROIで囲って30*50になっていると私は考えていました。違うのでしょうか?

    また、背景差分を行っているので、結果の画像(temp_upやcopy_img1)はグレースケールになっていると考えてるのですが、あっているのでしょうか?再度、グレースケールへの変換も行ったほうがいいのでしょうか?

    キャンセル

  • 2017/01/25 12:51

    原因は、dst1=cvCreateImage(cvSize(abs(rect3.width-temp_up->width)+1,abs(rect3.height-temp_up->height)+1),IPL_DEPTH_32F,1); //領域確保
    部分で、temp_upがROIの設定によって、30*50になっていると思ったのですが、288*192のためおかしな値が出るということでした。
    そこで、dst1=cvCreateImage(cvSize(abs(rect3.width-rect1.width)+1,abs(rect3.height-rect1.height)+1),IPL_DEPTH_32F,1); //領域確保
    と変更したら動きました。

    キャンセル

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

  • C++

    3787questions

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

  • OpenCV

    1240questions

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