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

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

ただいまの
回答率

90.51%

  • Xcode

    4905questions

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

  • OpenCV

    1506questions

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

  • Objective-C

    1262questions

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

  • iPhone

    1108questions

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

  • iPad

    162questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,560

ruiti

score 25

前提・実現したいこと

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);
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

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

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

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

dst_img = cvCreateImage (dst_size, IPL_DEPTH_32F, 1);


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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/12 10:36

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

    キャンセル

  • 2016/01/12 10:53

    回答ありがとうございます。
    動作を確認して貰えたのは嬉しいです!

    縮小した際の赤枠位置を間違えていましたか…。iPhone上では縮小しないと重くてまともに動作せず、マッチングも正しくなかった為に確認できていませんでした…

    私が縮小した場合ですが、dst.imgの中身が正しくないので、認識にも失敗しているかと思います。

    iPhoneでキャプチャしたuiimageに問題があるのでしょうか…
    fuzzballさんはiPhoneやiPadなど実機での実装ですか?

    キャンセル

  • 2016/01/12 11:08

    動作確認はiPhone5(実機)で行いました。対象画像はプロフィールのスクリーンショットで、テンプレートはそこから切り出したものです。(確実にマッチングさせるため)

    単純に「マッチングしていない」という話では無いのでしょうかね。

    と、ここまで書いて思い付いたことがあるので回答に追記します。

    キャンセル

  • 2016/01/13 11:37

    上のコードで動くということが分かったので、テンプレート画像を変えてみたら正常にマッチングが行われました!
    試しに使っていたテンプレートに使っていた画像が真っ白や真っ黒だったのがいけなかったのですね…。

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

    キャンセル

  • 2016/01/13 12:02 編集

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

    キャンセル

  • 2016/01/13 12:51

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

    キャンセル

+1

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

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

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/12 10:23

    回答頂きありがとうございます!
    ご指摘して頂いたように、初めはcv::matで記述しており、それでもテンプレートマッチングが正しく動作しなかった為、iplimagの記述を試みたのが上のコードでした。
    cv::matについて書き忘れすみませんでした。

    ただ、違うこととしてcv::matで記述した場合、dst.imgが黒ではなく全て青色になっていました…。

    教えて頂いたWebページを参考にもう一度cv::matでの実装を見直して見たいと思います。

    キャンセル

+1

こんにちは。

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/01/12 10:34

    回答頂きありがとうございます!

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

    キャンセル

  • 2016/01/12 11:06

    pi-chanさんへのコメントに

    > ただ、違うこととしてcv::matで記述した場合、dst.imgが黒ではなく全て青色になっていました…。

    と書かれてますが、dst_imgはグレイスケール画像ですよね? 青になるってことは表示過程での変換にミスがあると思います。そのミスがまだ残っていて、dst_imgの内容を適切に見れていないということはないでしょうか?

    また、min_val, max_val, min_loc, max_locの各値も常に0なのでしょうか?

    キャンセル

  • 2016/01/13 11:38

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

    キャンセル

同じタグがついた質問を見る

  • Xcode

    4905questions

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

  • OpenCV

    1506questions

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

  • Objective-C

    1262questions

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

  • iPhone

    1108questions

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

  • iPad

    162questions

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