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

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

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

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

C++

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

Q&A

1回答

6122閲覧

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

yamata

総合スコア36

OpenCV

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

C++

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

0グッド

0クリップ

投稿2017/01/24 11:25

編集2022/01/12 10:55

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->widthSCALE_X), (int)(img->heightSCALE_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);

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

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

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

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

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

guest

回答1

0

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

投稿2017/01/24 11:57

MasashiKimura

総合スコア1150

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

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

yamata

2017/01/24 12:10

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

2017/01/24 12:43

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

2017/01/24 12:49 編集

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

2017/01/25 02:05

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

2017/01/25 02:14

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

2017/01/25 02:49

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

2017/01/25 02:51

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

2017/01/25 03: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 となりました。違う物を表示していたらすいません。
MasashiKimura

2017/01/25 03:12 編集

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

2017/01/25 03: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) の数値がおかしいことにも問題はあるのでしょうか?
MasashiKimura

2017/01/25 03: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 – テンプレートと画像領域とを比較する方法(以下を参照してください). ここをみてチャレンジシてみてください。(少し手が離せなくなりました)
yamata

2017/01/25 03:30

ありがとうございます。よく確認してみると、temp_upは、cvSetImageROI(temp_up,rect1); の部分でROIで囲って30*50になっていると私は考えていました。違うのでしょうか? また、背景差分を行っているので、結果の画像(temp_upやcopy_img1)はグレースケールになっていると考えてるのですが、あっているのでしょうか?再度、グレースケールへの変換も行ったほうがいいのでしょうか?
yamata

2017/01/25 03: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); //領域確保 と変更したら動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問