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

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

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

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

iPad

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

OpenCV

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

Xcode

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

iPhone

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

Q&A

解決済

3回答

4457閲覧

急ぎで困っています…。opencv のテンプレートマッチングがうまく動作しません(objective-c、ビデオカメラ)

ruiti

総合スコア39

Objective-C

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

iPad

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

OpenCV

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

Xcode

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

iPhone

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

1グッド

1クリップ

投稿2016/01/11 20:49

編集2016/01/13 02:48

###前提・実現したいこと
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:マッチング
UIImageとiplimageの相互変換はこちらをそのまま使っています
Qiita UIImageとIplImageの相互変換

よろしくお願いします。

###解決
テンプレートに真っ黒、真っ白のものを利用していましたが、スクリーンショットを切り抜いたような画像を使うと正常にマッチングが行われました。

指摘にあった、縮小時の四角の位置が正しくないことについて。
テンプレートを縮小していない今回の場合は、表示される四角の大きさをサーチ画像を縮小した分だけ大きくしてあげる必要がりました。

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);
tochibow👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

0.2倍にすると赤枠の位置がおかしくなったので等倍で試しましたが、コードそのままで正常に認識しました。(0.2倍でも赤枠の位置がおかしいだけで認識はしているようです)
marimo

対象画像を1/5にすることで、テンプレート画像の方が大きくなったりしてないでしょうか?

■追記
dst_img=0とのことですが、検出前の生成の時点で失敗しているのではないでしょうか?

cpp

1dst_img = cvCreateImage (dst_size, IPL_DEPTH_32F, 1);

dst_sizeの値はどうなってますか?

投稿2016/01/12 01:35

編集2016/01/12 02:10
fuzzball

総合スコア16731

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

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

fuzzball

2016/01/12 01:36

あ、Chironianさんの回答と被ってしまった‥。
ruiti

2016/01/12 01:53

回答ありがとうございます。 動作を確認して貰えたのは嬉しいです! 縮小した際の赤枠位置を間違えていましたか…。iPhone上では縮小しないと重くてまともに動作せず、マッチングも正しくなかった為に確認できていませんでした… 私が縮小した場合ですが、dst.imgの中身が正しくないので、認識にも失敗しているかと思います。 iPhoneでキャプチャしたuiimageに問題があるのでしょうか… fuzzballさんはiPhoneやiPadなど実機での実装ですか?
fuzzball

2016/01/12 02:08

動作確認はiPhone5(実機)で行いました。対象画像はプロフィールのスクリーンショットで、テンプレートはそこから切り出したものです。(確実にマッチングさせるため) 単純に「マッチングしていない」という話では無いのでしょうかね。 と、ここまで書いて思い付いたことがあるので回答に追記します。
ruiti

2016/01/13 02:37

上のコードで動くということが分かったので、テンプレート画像を変えてみたら正常にマッチングが行われました! 試しに使っていたテンプレートに使っていた画像が真っ白や真っ黒だったのがいけなかったのですね…。 fuzzballさんに聞きたいことがひとつありまして。 現在、1秒間に15枚のペースでカメラ画像を取得して、テンプレートマッチングをした結果を画面に表示しようとしています。 その場合、マッチングに使う画像を0.2倍ほどにしないと処理が追いつかない状態です。 なるべく縮小しないで使いたいのですが、どのようにしているのでしょうか? 必要があれば新しく質問ページを作りソース等を載せたいと思っています。
fuzzball

2016/01/13 03:53 編集

残念ながらテンプレートマッチングはやったことないです。 画像を8bitにしたら速くなったりしませんかね?(これ以上はご勘弁を)
ruiti

2016/01/13 03:51

コメントありがとうございます。 厚かましくてすみませんでした…。 いろいろ試してみたいと思います!
guest

0

こんにちは。

Swiftを知らないので外しているかも知れませんが、サーチ対象画像のresize_ipl_src_imgが、テンプレート画像のipl_tmp_imgより小さいということはないでしょうか?

投稿2016/01/12 01:19

Chironian

総合スコア23272

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

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

ruiti

2016/01/12 01:34

回答頂きありがとうございます! エラーで止まらないのでサイズの問題ではないと思ったのですが、その可能性もあると思い調べていました。 縮小後のresize_ipl_src_imgが300×400程度で、ipl_tmp_imgが50x50のサイズになっていたと思うのでサイズは大丈夫のような気がします…
Chironian

2016/01/12 02:06

pi-chanさんへのコメントに > ただ、違うこととしてcv::matで記述した場合、dst.imgが黒ではなく全て青色になっていました…。 と書かれてますが、dst_imgはグレイスケール画像ですよね? 青になるってことは表示過程での変換にミスがあると思います。そのミスがまだ残っていて、dst_imgの内容を適切に見れていないということはないでしょうか? また、min_val, max_val, min_loc, max_locの各値も常に0なのでしょうか?
ruiti

2016/01/13 02:38

テンプレートを変えたら正常にマッチングができ、valやlocの値もちゃんと入りました。 ありがとうございました!
guest

0

全くの門外漢なので、的外れならごめんなさい。

下記の点はきちんと考慮されていますか?

iOS で opencv を使う。

iOS では一般的に UIImage 型を利用します。

一方 opencv では cv::Mat 型を利用します。

そのため、iOS 上での一般的な処理の流れは以下のようになります。

  1. UIImage を cv::Mat に変換する。
  2. opencv API を利用します。
  3. cv::Mat を UIImage に変換して、表示などに利用。

それで、Objective-Cでパターンマッチングする場合のコードは下記のサンプルのようになるのかと思います。

iOSからOpenCVを使った話

ruitiさんが参照されている下記ページの最後の部分にも言及されている点です。

Qiita UIImageとIplImageの相互変換

比較的新しいバージョンのOpenCVだとIplImageではなくcv::Matが使われるようになっていたりするので

以上、幾らかでもご参考になれば幸いです。

投稿2016/01/11 21:22

pi-chan

総合スコア5936

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

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

ruiti

2016/01/12 01:23

回答頂きありがとうございます! ご指摘して頂いたように、初めはcv::matで記述しており、それでもテンプレートマッチングが正しく動作しなかった為、iplimagの記述を試みたのが上のコードでした。 cv::matについて書き忘れすみませんでした。 ただ、違うこととしてcv::matで記述した場合、dst.imgが黒ではなく全て青色になっていました…。 教えて頂いたWebページを参考にもう一度cv::matでの実装を見直して見たいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問