SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

OpenCVで浮動小数点形式の画像バッファを使ってみる

今までのサンプルコードでは、CV_8UC3のよう形で各要素ごとunsigned charなデータで画像バッファを扱っていました。

OpenCVでは、Mat型のインスタンスを作成するときの引数指定で、 16bit整数型や浮動小数点型などの形式のバッファも作れるようになっています。

利用できる型

Mat型の変数を作る際に、MatTypeで画像バッファのデータ型の種類が指定ができます。

var mat = new Mat(240, 320, MatType.CV_32FC3);

インテリセンスでのコード補間で候補が表示されるので、なんとなく使えると思います。
f:id:minami_SC:20160828231359p:plain

これらのMatType型の、各要素は以下のような意味になってます。
f:id:minami_SC:20160828231410p:plain

サンプル

これだけでは、あまり意味はないですが、CV_32FC3でMatを作成して、グラデーションを書いてみました。

ウィンドウ表示の前に、特に型変換などせずともそのまま表示できるようです。

        static void Main(string[] args)
        {
            using (var mat = new Mat(240, 320, MatType.CV_32FC3))
            using (var win = new Window("image"))
            {
                var indexer = mat.GetGenericIndexer<Vec3f>();

                for (var y = 0; y < mat.Height; y++)
                {
                    for(var x = 0; x < mat.Width; x++)
                    {
                        var px = new Vec3f();
                        px[0] = (float)x / mat.Width;
                        px[1] = (float)y / mat.Height;
                        px[2] = 0;
                        indexer[y, x] = px;
                    }
                }

                win.ShowImage(mat);
                Cv2.WaitKey();
            }
        }

f:id:minami_SC:20160828231417p:plain