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

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

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

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

C++

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

Q&A

解決済

2回答

5047閲覧

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

yamata

総合スコア36

OpenCV

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

C++

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

0グッド

0クリップ

投稿2016/10/18 07:43

編集2016/10/18 08:35

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

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

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

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

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

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

guest

回答2

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/18 15:19

MasahikoHirata

総合スコア3747

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

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

yamata

2016/10/19 04:08

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

2016/10/19 04:22

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

0

ベストアンサー

こんにちは。

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

投稿2016/10/18 10:09

Chironian

総合スコア23272

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

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

yamata

2016/10/19 04:08

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

2016/10/19 04:22

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問