AndroidのOpenCVの色空間が破綻していることに気づいた
ずっと気づいていなかった。
OpenCVでは、ピクセル当たりの色要素数だけを意識して色空間は意識しない。色空間はアプリが管理することになっている。例えば、OpenCVtが画像データを扱うデータ形式の一つMatは、色要素数は管理するが、色空間は管理しない。ただ、一部、OpenCVが特定の色空間を意識する場合もある。ここまでは、一応わかっていた。
imreadとimwriteは、OpenCVが色空間を意識する特別な場合の一つだ、ということもわかっていた。
でも、imreadとimwriteが意識する色空間が具体的にはBGRまたはBGRAだ、ということは、さっきまでわかっていなかった。
と、ここまではOpenCVそのものの話。
Android用のOpenCVでは、android独自機能として、bitmapToMatとmatToBitmapという関数があり、Androidのビットマップデータオブジェクト(android.graphics.Bitmap)と、OpenCVのイメージデータ形式Matとの間で形式を変換してくれるのだが、この関数はMatの色空間がRGBAであることを前提にしている。このことも一応わかっていた。
その結果、bitmapToMat/matToBitmapと、imread/imwriteとを、一つのアプリ中で組み合わせて使うと、色空間がわけわからなくなって破綻する、ということに、さっき気づいた。
いや、まぁ、そういうものだということを意識して、どの変数はどの色空間なのかきちんと覚えておいて書き分けるとか、アプリが使う色空間を一種類に統一しておいて、違う場合はいちいち変換するとか、そうやってアプリを書けば問題ないわけだが、「カラー」「グレースケール」「二値」くらいの意識でコーディングしちゃうと、「カラー」の画像がどういう色空間なのか、わけがわからなくなる、というわけだ。
最近作っているナンプレのアプリが、そういう状況で破綻してしまっていることに、さっき気づいたのでした。ははは。なんでこういう仕様なんだか。なんて言ってもしょうがないので、今から直します。
« ナンプレ破りバージョン0.7 | トップページ | 「ナンプレ破り」Google Playで公開中 »


コメント