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

SourceChord

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

OpenCVでパラメータ操作用ウィンドウを作ってみる

C# OpenCV

以前、OpenCVSharpで作成したウィンドウに、スライダーを付けてみました。
http://sourcechord.hatenablog.com/entry/2016/08/21/202200

このスライダーを活用し、スライダーだけが並んだウィンドウを作ることができます。
画像を表示しているウィンドウ上にスライダーで余計なスペースを取ることなく、 画像を編集するためのスライダーが並んだ、操作パネルのようなものが作成できます。

    class Program
    {
        static int _threashold = 0;
        static int _max = 0;

        static Window _win;
        static Mat _gray;
        static Mat _dst;

        static void Main(string[] args)
        {
            _gray = new Mat();
            _dst = new Mat();
            using (var src = new Mat(@"Images/1.jpg"))
            {
                Cv2.CvtColor(src, _gray, ColorConversionCodes.BGRA2GRAY);

                _win = new Window("dst image", _gray);
                using (var ctrl = new Window("control panel", null))
                {
                    ctrl.Resize(640, 80);
                    ctrl.CreateTrackbar2("Threshold", 10, 255, OnThreasholdChanged, null);
                    ctrl.CreateTrackbar2("Max", 10, 255, OnMaxChanged, null);


                    Cv2.WaitKey();
                }
            }
        }

        private static void OnThreasholdChanged(int pos, object userdata)
        {
            _threashold = pos;
            Console.WriteLine($"Threashold: {_threashold}");

            UpdateWindow(_win, _gray, _dst, _threashold, _max);
        }

        private static void OnMaxChanged(int pos, object userdata)
        {
            _max = pos;
            Console.WriteLine($"Max: {_max}");

            UpdateWindow(_win, _gray, _dst, _threashold, _max);
        }

        private static void UpdateWindow(Window win, Mat src, Mat dst, int threashold, int max)
        {
            Cv2.Threshold(src, dst, threashold, max, ThresholdTypes.Binary);
            win.ShowImage(dst);
        }
    }

f:id:minami_SC:20160826073211p:plain

スライダーの実装では、コールバック関数を使って設定値を扱うんで、微妙に値のやり取りがめんどくさいですね・・・

ここでは手軽に書くために、コールバック関数側でも色々な変数にアクセスできるように、static変数で定義したりしてます。
でも、こうするとusingを使ったリソース破棄ができないのが少々残念な感じ。

問題点

ただし、この方法も少し問題があります。

なぜか、スライダーのみのウィンドウは、思った通りにウィンドウサイズを調整できません。。。
Resize関数で、ウィンドウのリサイズもできるのですが、この関数でうまくリサイズできない場合もあったり、、、

あくまでも、OpenCVでのウィンドウ表示やスライダーなどのGUI機能は、 テスト用・プロトタイプ作成用と割り切って使うのがよいかもしれません。