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

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

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

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

C++

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

Q&A

解決済

1回答

3949閲覧

opencvを用いたテンプレートマッチング

yamata

総合スコア36

OpenCV

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

C++

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

0グッド

0クリップ

投稿2016/10/11 04:56

編集2016/10/11 05:00

opencvを使ってテンプレートマッチングを行っています。

1枚の画像に対して、2枚のテンプレートでマッチングを行いたいと考えています。
テンプレートの画像は、2枚とも別の写真で、1枚の画像から2つの物体を見つけたいということです。

現在は、
1枚の画像撮影→画像をコピー→元の画像にテンプレート1、コピーの画像にテンプレート2をマッチングさせる→類似度表示 という形で行っています。

最後の類似度を表示させる段階で、2枚それぞれの類似度を表示できなくて困っています。
解決方法を教えていただけたらと思います。

動作環境は、
opencv2.4.9、vc++2010Expressです。

また、コードを以下に書きます。
よろしくお願い致します。

また、別の方法があれば教えていただきたいです。(1枚の画像に対して2枚のテンプレートをマッチングさせる方法)

while ( 1 ) { //カメラからの入力画像1フレームをframeImageに格納する frameImage = cvQueryFrame( capture ); //画像を表示する //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); //--------原画像を読み込む--------- img1=cvLoadImage("sign.bmp",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); //カラー読み込み img2=cvCloneImage(img1); //---------テンプレート画像を読み込む------- 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_img1=cvCreateImage(cvGetSize(img1),IPL_DEPTH_8U,1); //1チャンネル8ビットのIplImage作成(元画像) grey_img2=cvCreateImage(cvGetSize(img2),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作成(元画像) gamma_img1=cvCreateImage(cvGetSize(img1), img1->depth, img1->nChannels); //ガンマ用領域確保 gamma_img2=cvCreateImage(cvGetSize(img2), img2->depth, img2->nChannels); //ガンマ用領域確保 dst1 =cvCreateImage(cvSize(img1->width-temp_up->width+1,img1->height-temp_up->height+1),IPL_DEPTH_32F,1); //領域確保 dst2 =cvCreateImage(cvSize(img2->width-temp_side->width+1,img2->height-temp_side->height+1),IPL_DEPTH_32F,1); //領域確保 dst1 =cvCreateImage(cvSize(gamma_img1->width-temp_up->width+1,gamma_img1->height-temp_up->height+1),IPL_DEPTH_32F,1); //ガンマ用領域確保 dst2 =cvCreateImage(cvSize(gamma_img2->width-temp_side->width+1,gamma_img2->height-temp_side->height+1),IPL_DEPTH_32F,1); //ガンマ用領域確保 //グレー・スケールに変換して格納 cvCvtColor(img1,grey_img1,CV_BGR2GRAY); cvCvtColor(img2,grey_img2,CV_BGR2GRAY); cvCvtColor(temp_up,grey_temp_up,CV_BGR2GRAY); cvCvtColor(temp_side,grey_temp_side,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_point,&max_point,NULL); cvMinMaxLoc(dst2,&min_inter1inkage,&max_inter1inkage,&min_point,&max_point,NULL); //------マッチングを表示する----- //相関値0.75以下ならばLostを表示して次に行く if(max_inter1inkage>0.75) { //マッチング箇所を四角で描画 cvRectangle(img1,max_point,cvPoint(max_point.x+temp_up->width,max_point.y+temp_up->height),CV_RGB(255,0,0),3); cvRectangle(img2,max_point,cvPoint(max_point.x+temp_side->width,max_point.y+temp_side->height),CV_RGB(255,0,0),3); //画像を表示 cvNamedWindow("result1",CV_WINDOW_AUTOSIZE); cvShowImage("result1",img1); cvNamedWindow("result2",CV_WINDOW_AUTOSIZE); cvShowImage("result2",img2); //類似度表示 printf("Detection %lf\n",max_inter1inkage); printf("Detection %lf\n",max_inter1inkage); sprintf_s(str, "C:\\opencv_re\\result_%04d.bmp", counter++); cvSaveImage(str, img1 ); } else { printf("Lost %lf\n",max_inter1inkage); } コード

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

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

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

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

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

yohhoy

2016/10/11 05:59 編集

「類似度を表示させる段階で、2枚それぞれの類似度を表示できなくて」とありますが、単純に2回のcvMinMaxLoc呼び出し結果をそれぞれ別の変数に格納するだけでは?具体的にどういう結果を望んでいるのでしょうか。
yamata

2016/10/11 06:18

それを行いたいと考えています。しかし、その方法が分からないため教えていただけたらと思います。
yohhoy

2016/10/11 06:39

文字通り、変数max_inter1inkageとは別の変数max_inter2inkageなどを用意し、2枚目の画像dst2へのcvMinMaxLoc呼び出しで使えばよいのではという指摘です。それも難しいというお話であれば、他の方のサポートにお任せします…
yamata

2016/10/12 03:08

ありがとうございます。解決できました。
guest

回答1

0

自己解決

解決できました。ありがとうございます。

投稿2016/10/12 03:09

yamata

総合スコア36

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問