読者です 読者をやめる 読者になる 読者になる

SourceChord

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

OpenCvSharpで作成したウィンドウにスライダーを付けてみる

C# OpenCV

OpenCvSharpで作成したウィンドウに、スライダーを付けてみます。

作成したウィンドウに対してCreateTrackbar2を呼び出すことで、ウィンドウにスライダーを付加できます。

ちなみに、CreateTrackbar/CreateTrackbar2と似たような名前の関数が用意されてますが、それぞれの用途の違いなどはまだ把握できてないです。。。
関数のシグネチャが若干違いますが、どちらの関数でもスライダーを作成できました。

スライダーの作成

まずは、スライダーを作成して、スライダーの位置が変化したらその座標をコンソールに表示してみます。

    class Program
    {
        static void Main(string[] args)
        {
            using (var src = new Mat(@"Images/1.jpg"))
            {
                using (var win = new Window("dst image", src))
                {
                    win.CreateTrackbar2("test", 10, 255, OnPosChanged, null);

                    Cv2.WaitKey();
                }
            }

        }

        private static void OnPosChanged(int pos, object userdata)
        {
            Console.WriteLine($"pos: {pos}");
        }
    }

f:id:minami_SC:20160821201953p:plain

スライダーの設定値を利用して画像処理

続いて、スライダーを使って画像処理のパラメータを変化させてみます。
このサンプルでは、スライダーで指定した値を用いて、画像の二値化の閾値を変化させます。

ここでは、コールバック関数は関数として別途定義するのではなく、ラムダ式で書いてます。
こうしておくと、ラムダ式の外側の変数をキャプチャして、ラムダ式内で利用できるので、何かと便利です。

    class Program
    {
        static void Main(string[] args)
        {
            using (var src = new Mat(@"Images/1.jpg"))
            using (var gray = new Mat())
            using (var dst = new Mat())
            {
                Cv2.CvtColor(src, gray, ColorConversionCodes.BGRA2GRAY);
                using (var win = new Window("dst image", gray))
                {
                    win.CreateTrackbar2("Threshold", 10, 255, (pos, userdata) =>
                    {
                        Cv2.Threshold(gray, dst, pos, 255, ThresholdTypes.Binary);
                        win.ShowImage(dst);
                        // win.Image = dst; // ShowImageのかわりにこう書いてもOK
                    }, null);

                    Cv2.WaitKey();
                }
            }
        }
    }
実行結果

スライダーを操作すると、二値化処理の閾値を変更できます。
f:id:minami_SC:20160821202000p:plain