ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

OpenCVのmatchTemplateがうまく動かない!

 以下のコードが上手く動かず、しばし悩む。

まったく同じ画像のはずなのに、どうしてもminMaxLocの結果が0.85になる。なぜだ。そこで、各画像のメモリを覗いてみた。

 まずはイメージの探索対象側。イメージサイズは2×4, 32bit。0xf0f0f000 というパターンが7回続いた後に0x00000000が来ている。

f:id:donadonasan:20161022185535p:plain

次に、探索イメージ(pattern)。こちらもイメージサイズは2×4, 32bit。

f:id:donadonasan:20161022185930p:plain

なんと、こちらは0xf0f0f0ffというパターンが続き、その後0x000000ffが来ている。各ピクセルの4バイト目が、両者で食い違っていたのだ。OpenCVのmatchTemplateって、アルファチャンネルをサポートしていないから、結果に影響しないはずなんだがなあ。でも、影響するなら仕方ない。

もう少し調べてみたところ、探索対象側はMFCのCImageで作成されており、探索イメージはOpenCVにより作成していることがわかった。どうやら、両者でアルファチャンネルのデフォルト値が異なっているようだ。

そもそも、なんでアルファチャンネルを使っていないのに、使うコードになっているのだろう?元コードを書いた5年前の自分に聞いてみたいが、そんなことはできない。おそらく、CImageに関係する自分の8年ぐらい前のコードがアルファチャンネルを使っていたから、とかそんな理由だと思うが・・・。

ってわけで、ピクセル辺り32bitだったものを24bitのアルファチャンネルを使わないコードに書き換えてみた。その結果、無事minMaxLocの結果が1.0に。問題解決。