• 締切済み

画像の比較について

書き込み失礼します。 プログラム初心者です。 現在、私はVC++とOpenCVをつかってテンプレートマッチングなるものを試しています。 その中でマッチング結果(0.0や0.5、1.0など)を見たいと思っているのですが、画像と画像を比較すると0.0から1.0に正規化しているにも関わらず現れる数値は15495939などの値になってしまったりします。 見ようとしている場所が悪いのかプログラムが悪いのか画像が悪いのか(画像はカメラで取得したものを使用)が全くわかりません。 大変申し訳ありませんがご助言に頂けたら幸いです。 いかに私が書いているテンプレートマッチングのプログラムの一部をしめします。 //テンプレートマッチングを行う cvMatchTemplate(sourceBinaryImage,templateBinaryImage,differenceMapImage,CV_TM_SQDIFF); //テンプレートが画像のどの部分にあるのかという情報を得る cvMinMaxLoc(differenceMapImage,&minValue,&maxValue,&minLocation,&maxLocation,NULL); //結果の表示方法の統一 cvNormalize(differenceMapImage,differenceMapImage,1,0,CV_MINMAX); printf("%d\n",&minValue);

みんなの回答

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.5

> &minValueではなく、minValueとして数値を表示させなくてはならなかったということでしょうか? それくらいは手元で試せば質問するまでもなくわかるんですから、まずやってみませんか? その上で疑問点等あるならその相談には乗りますから。

yu9992000
質問者

お礼

プログラム試してみたところ正常なマッチング結果を見ることができました。 この疑問についてはとりあえず落ち着きました。 大変ありがとうございました。 自分で試して疑問点が解決できなかった時は恐縮ですがまたよろしくお願いいたします。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

> 完全には理解できていないです。 いえ、下の質問があるところを見ると「完全には」ではなく「全く」理解できていません。 > 私の質問項目にある8桁程度の数字がアドレスであるということでしょうか? もちろん、そういう話です。 printf()のフォーマット文字列以外の引数でポインタを渡すのは「%sに対応する文字列」だけです。 それ以外のケースでポインタを渡した場合、そのポインタ(=アドレス)の値をそのまま解釈して出力します。 従って、&minValueを渡すということはminValueのポインタを渡す、即ちminValueのアドレスを表示するよう指示しているということです。

yu9992000
質問者

補足

ご回答ありがとうございます。 まったく理解できていないのが事実です。すみません アドレスを見たいわけではないので、 &minValueではなく、minValueとして数値を表示させなくてはならなかったということでしょうか?

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

#1とは別人ですが、 > この場合%dではなく、%lfを使用するべきでした。 「minValueのアドレス」を、の部分を読んでいないか理解できていませんね?

yu9992000
質問者

補足

はい 完全には理解できていないです。 私の質問項目にある8桁程度の数字がアドレスであるということでしょうか?

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

printfのdoubleに対する書式は%f等です。 http://www.kijineko.co.jp/tech/superstitions/printf-format-for-double.html このプログラムでは ・ cvMinMaxLoc で minValueの値を取得 → differenceMapImageの正規化 の順で処理されているので、 minValue は正規化前の最小値です。 > また、正規化処理はcvMatchTemplateのメソッドとcvNormalizeとしてほかのコマンドとして行った場合では違いは出てくるのでしょうか? cvMatchTemplateでの正規化は、各座標での計算結果を同じものさしで比較できるように、値の範囲を一定にするためのものです。最終結果の最大最小が1.0/0.0になるわけではありません。(例えば、SQDIFF_NORMでテンプレートと完全に一致する座標がなければ、結果は0.0より大きくなります) cvNormalize(differenceMapImage,differenceMapImage,1,0,CV_MINMAX); の場合は、最大最小を1.0/0.0に変換するので、上の例の結果で0.0にならなかったものが0.0になります。

yu9992000
質問者

お礼

ご回答ありがとうございます。 大変参考になりました。おかげさまで正常なマッチング結果を見ることができました。 メソッド内での正規化とコマンドでの正規化を吟味して使っていきます。 本当に助かりました。

  • usatan2
  • ベストアンサー率37% (163/436)
回答No.1

printf("%d\n",&minValue); これじゃ、「minValueのアドレス」を「整数」として、表示していますよ。

yu9992000
質問者

お礼

ご回答いただきありがとうございます。 確かに表示形式に誤りがありました。 この場合%dではなく、%lfを使用するべきでした。 ありがとうございます。 また、正規化処理はcvMatchTemplateのメソッドとcvNormalizeとしてほかのコマンドとして行った場合では違いは出てくるのでしょうか? 未熟な質問ですが、よろしければお答えください。