質問編集履歴

1 解決

ruiti

ruiti score 31

2016/01/13 11:48  投稿

急ぎで困っています…。opencv のテンプレートマッチングがうまく動作しません(objective-c、ビデオカメラ)
###前提・実現したいこと
objective-cでカメラから取得した画像に対してテンプレートマッチングしようとしています。 
テンプレートマッチングをした結果が正しくありません。
iphoneのカメラから取得したUIImage型の画像(uii_src_img)を受け取ってIPlimageに変換した後、
テンプレートマッチングを行い、再度UIImageに変換して返すコードを書きました。
途中で処理を早くするために入力画像のサイズを0.2倍にしています。
正しくテンプレートマッチングを行い、結果画像を戻したいです。
###発生している問題・エラーメッセージ
エラー無く動作しましたが、テンプレートマッチングの結果が常に0になってしまっています。
テンプレートマッチングの結果画像のdst_imgが全て0から変わりません。
opencvが動くかを試す為に、グレースケールをして戻すような処理はできていたので、テンプレートマッチングの部分がおかしいのかと思っています。
UIImageとIplimageの相互変換は表示して確かめたところ問題ないかと思います。
テンプレート画像のtmp.pngの読み込みも、表示して確認しました。
テンプレートマッチングに用いるipl_src_img, ipl_tmp_imgも表示して確かめてみました。
思い当たることは試したのですが、テンプレートマッチングが正しく動作しない理由がわかりませんでした。
###ソースコード
```
- (UIImage*)opencv:(UIImage*)uii_src_img
{
   
   double min_val, max_val;
   CvPoint min_loc, max_loc;
   CvSize dst_size;
   IplImage *ipl_src_img, *ipl_tmp_img, *dst_img, *resize_ipl_src_img;
   
   uii_tmp_img = [UIImage imageNamed:@"tmp.png"];
   
   
   ipl_src_img = [self createIplImageFromUIImage : uii_src_img];
   ipl_tmp_img = [self createIplImageFromUIImage : uii_tmp_img];
   
   resize_ipl_src_img = cvCreateImage(cvSize(ipl_src_img->width * 0.2, ipl_src_img->height * 0.2), IPL_DEPTH_8U, 3);
   cvResize(ipl_src_img, resize_ipl_src_img);
   
   dst_size = cvSize (resize_ipl_src_img->width - ipl_tmp_img->width + 1, resize_ipl_src_img->height - ipl_tmp_img->height + 1);
   dst_img = cvCreateImage (dst_size, IPL_DEPTH_32F, 1);
   
   // (1)探索画像全体に対して,テンプレートのマッチング値(指定した手法に依存)を計算
   cvMatchTemplate(resize_ipl_src_img, ipl_tmp_img, dst_img, CV_TM_CCOEFF_NORMED);
   cvMinMaxLoc (dst_img, &min_val, &max_val, &min_loc, &max_loc, NULL);
   
   max_loc.x /= 0.2;
   max_loc.y /= 0.2;
   
   // (2)テンプレートに対応する位置に矩形を描画
   cvRectangle (ipl_src_img, max_loc,
                cvPoint (max_loc.x + ipl_tmp_img->width, max_loc.y + ipl_tmp_img->height), CV_RGB (255, 0, 0), 3);
   
   uii_src_img = [self UIImageFromIplImage:ipl_src_img];
   
   cvReleaseImage (&ipl_src_img);
   cvReleaseImage (&resize_ipl_src_img);
   cvReleaseImage (&ipl_tmp_img);
   cvReleaseImage (&dst_img);
   
   return uii_src_img;
```
###補足情報
テンプレートマッチングはこちらを参考にしました。
[opencv.jp - OpenCV:マッチング](http://opencv.jp/sample/matching.html)
UIImageとiplimageの相互変換はこちらをそのまま使っています
[Qiita UIImageとIplImageの相互変換](http://qiita.com/moshisora/items/69835cbd8eeb4f79f132)
よろしくお願いします。
よろしくお願いします。
###解決
テンプレートに真っ黒、真っ白のものを利用していましたが、スクリーンショットを切り抜いたような画像を使うと正常にマッチングが行われました。
指摘にあった、縮小時の四角の位置が正しくないことについて。
テンプレートを縮小していない今回の場合は、表示される四角の大きさをサーチ画像を縮小した分だけ大きくしてあげる必要がりました。
```
cvRectangle (ipl_src_img, max_loc,cvPoint (max_loc.x + ipl_tmp_img->width / 0.2, max_loc.y + ipl_tmp_img->height / 0.2), CV_RGB (255, 0, 0), 3);
```
  • Objective-C

    1321 questions

    Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

  • Xcode

    6264 questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iPad

    192 questions

    iPadは、Appleがデザインしたタブレット型コンピュータです。iPadアプリケーションは通常Xcode IDEのObjective-Cで書かれますが、iPadアプリケーションを組むためのほかのツールを使うことも可能です。

  • OpenCV

    2153 questions

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

  • iPhone

    1349 questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る