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

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

ただいまの
回答率

90.48%

  • C

    4641questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    4505questions

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

  • OpenCV

    1552questions

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

opencvのエラー解決

解決済

回答 1

投稿

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

yamata

score 28

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

コードは以下になります。

わからないので、解決できる方法をお願いします。

イメージ説明

コード
int main( int argc , char** argv)
{
    int counter = 0;
    char str[32];

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

    #define SCALE_X 0.2
    #define SCALE_Y 0.2

    IplImage * temp_up = NULL;
    IplImage * temp_side = NULL;
    IplImage * dst1 = NULL;
    IplImage * dst2 = NULL;
    IplImage * img = NULL;
    IplImage * scale_img = NULL;
    IplImage * copy_img1 = NULL;
    IplImage * copy_img2 = NULL;
    IplImage * grey_img1 = NULL;
    IplImage * grey_img2 = NULL;

    IplImage * grey_temp_up = NULL;
    IplImage * grey_temp_side = NULL;

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

    CvPoint max_point1;
    CvPoint min_point1;
    CvPoint max_point2;
    CvPoint min_point2;


    //---------テンプレート画像を読み込む-------
    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_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作成(元画像)

    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);

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

            //------------------------原画像読み込み-------------------------------
            std::stringstream filename;
            filename << "C:\\opencv_ICImage\\Image" << 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(78,35),cvPoint(120,135),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT);
            cvRectangle(scale_img,cvPoint(180,45),cvPoint(225,128),CV_RGB(255,0,0),LINE_THICKNESS,LINE_TYPE,SHIFT);//左上、右下

            //-----------------ROIの設定----------------------
            CvRect rect1;
            rect1.x = 78;
            rect1.y = 35;
            rect1.width = 42;
            rect1.height = 100;
            cvSetImageROI(copy_img1,rect1);

            CvRect rect2;
            rect2.x = 180;
            rect2.y = 45;
            rect2.width = 45;
            rect2.height =83;
            cvSetImageROI(copy_img2,rect2);//左上、幅、高さ
            //----------------------------------------------------

            //入力画像表示
            cvNamedWindow("img_window",CV_WINDOW_AUTOSIZE);
            cvShowImage("img_window",scale_img);

            //---------------------ROI表示-----------------------------
            cvNamedWindow("copy_img1_window",CV_WINDOW_AUTOSIZE);
            cvShowImage("copy_img1_window",copy_img1);
            cvNamedWindow("copy_img2_window",CV_WINDOW_AUTOSIZE);
            cvShowImage("copy_img2_window",copy_img2);
            //---------------------------------------------------


            //--------------------------グレースケールの場合----------------------------------------------------------------
            //テンプレート・マッチングに用いる相関値データを格納する画像の領域確保
            //グレー・スケール画像用に領域確保
            grey_img1=cvCreateImage(cvGetSize(copy_img1),IPL_DEPTH_8U,1);            //1チャンネル8ビットのIplImage作成(元画像)
            grey_img2=cvCreateImage(cvGetSize(copy_img2),IPL_DEPTH_8U,1);            //1チャンネル8ビットのIplImage作成(元画像)

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

            //グレー・スケールに変換して格納
            cvCvtColor(copy_img1,grey_img1,CV_BGR2GRAY);
            cvCvtColor(copy_img2,grey_img2,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_point1,&max_point1,NULL);
            cvMinMaxLoc(dst2,&min_inter2inkage,&max_inter2inkage,&min_point2,&max_point2,NULL);

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

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

                //画像を表示
                cvNamedWindow("result",CV_WINDOW_AUTOSIZE);
                cvShowImage("result",scale_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, scale_img );

            }

            else
            {
                printf("Lost_up %lf\n",max_inter1inkage);
                printf("Lost_side %lf\n",max_inter2inkage);

            }

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

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

            cvWaitKey(5000);

        //メモリ解放
            cvReleaseImage(&img);
            cvReleaseImage(&copy_img1);
            cvReleaseImage(&copy_img2);
            cvReleaseImage(&grey_img1);
            cvReleaseImage(&grey_img2);
            cvReleaseImage(&dst1);
            cvReleaseImage(&dst2);
    }


    //メモリ解放
    cvReleaseImage(&temp_up);
    cvReleaseImage(&temp_side);
    cvReleaseImage(&grey_temp_up);
    cvReleaseImage(&grey_temp_side);

    //メモリ開放
    cvDestroyWindow("img_window");
    cvDestroyWindow("copy_img1_window");
    cvDestroyWindow("copy_img2_window");
    cvDestroyWindow("temp_up_window");
    cvDestroyWindow("temp_side_window");
    cvDestroyWindow("grey_temp_up_window");
    cvDestroyWindow("grey_temp_side_window");
    cvDestroyWindow("grey_img1_window");
    cvDestroyWindow("grey_img2_window");
    cvDestroyWindow("result");

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

エラーになっている部分のソースが無いように見えますが。
templmatch.cppのソースの386行目付近のソースが必要だと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/10/21 17:53

    このプログラムは、250行で終わっています。

    キャンセル

  • 2016/10/21 18:05

    エラーの内容としては
    cvMatchTemplate()のパラメーターが誤っている(条件を満たしていない)とのCV_Assertマクロでの表示です。
    パラメーターを確認されてください。

    キャンセル

  • 2016/10/21 18:10

    申し訳ございません。
    どういう意味でしょうか?

    キャンセル

  • 2016/10/21 18:25

    エラー画面にもありますが、resize()の値とabs()+1が二つある値もしくはresult.type()がCV_32Fでないとのエラーです。
    当方、opencvは3.xを使用しているので構造体についてはMatで統一していますが、IplImageとCvMatが混在しているのが難解な部分で、おそらくその辺でうまくパラメーターがわたっていないのでは?

    キャンセル

  • 2016/10/21 18:29

    プログラム中のROIの設定付近を追加する前までは、エラーがでなかったので
    その付近かなと考えているのですが、、、

    キャンセル

  • 2016/10/21 18:31

    ROIのSizeがMatchingのパターン以上になっていますか?

    キャンセル

  • 2016/10/21 18:34

    エラー内容のabs()の内部では、img.cols-templ.cols(まあ負になってもABSですが)とrowsの計算で仮に"0"なんてなってるとエラーでしょう。

    キャンセル

  • 2016/10/21 18:38

    パターンというのはサイズのことでしょうか?
    ROI>templeateになっています。

    キャンセル

  • 2016/10/21 18:49

    実際にソフトを使用する際の事も考慮して、閾値(threshold)をちゃんと確定。偶然動くソフトは突然牙をむきます。この事を含めてテンプレートサイズなどの設定範囲とか視覚的に分かるデバッグしないと。この場合ですと、分かる変数の内容をDebug Flagを作っておいてそれをセットすると内容出力させるとか。ROIの値、colやrawの値、ファイルを読んだときのステータスなどを分かるようにされてください。本題のエラーの場合、"cvMatchTemplate()の内容ですから、これのエラーにそった出力(表示)をすれば大抵は判明(なぜその値になったかがロジックの誤り)。まずはそれから。この件では入力の画像の内容やテンプレートなど推測の域をでない状況での判断しか出来ません。

    キャンセル

  • 2016/10/21 18:53

    ありがとうございます。
    ROIの値の表示は、わかるのですが、その他の表示の仕方がわかりません。
    どのようにしたらよいのでしょうか?

    キャンセル

  • 2016/10/21 19:09

    colsやrawsの指定の仕方はメンバなので".cols"とか構造体の名前につけて。
    と言うか、まずopencvで使用するデータの構造を理解されてください。
    参考になるURLは
    http://opencv.jp/cookbook/opencv_mat.html
    それと書籍で、
    オライリーのopencvなど。
    opencvでのデータの取り扱いが詳しく(?)書かれています。
    貴殿のソースを読むと、この辺りがあやふやになってる気が。
    絶対に理解を勧めます。
    opencvは機械学習まで含めてパワフルな機能があります。
    またIntelのバックアップもあり、将来的にも理解されたら力になると思います。

    キャンセル

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

  • C

    4641questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    4505questions

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

  • OpenCV

    1552questions

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