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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

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

OpenCV

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

C++

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

Q&A

解決済

1回答

2921閲覧

opencvのエラー解決

yamata

総合スコア36

C

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

OpenCV

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

C++

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

0グッド

0クリップ

投稿2016/10/21 08:32

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

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

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

イメージ説明

コード 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; }

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

投稿2016/10/21 08:46

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamata

2016/10/21 08:53

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

2016/10/21 09:05

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

2016/10/21 09:10

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

2016/10/21 09:25

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

2016/10/21 09:29

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

2016/10/21 09:31

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

2016/10/21 09:34

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

2016/10/21 09:38

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

2016/10/21 09:49

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

2016/10/21 09:53

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

2016/10/21 10:09

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問