以前、OpenCVSharpで作成したウィンドウに、スライダーを付けてみました。
http://sourcechord.hatenablog.com/entry/2016/08/21/202200
このスライダーを活用し、スライダーだけが並んだウィンドウを作ることができます。
画像を表示しているウィンドウ上にスライダーで余計なスペースを取ることなく、
画像を編集するためのスライダーが並んだ、操作パネルのようなものが作成できます。
class Program { staticint _threashold = 0; staticint _max = 0; static Window _win; static Mat _gray; static Mat _dst; staticvoid 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(); } } } privatestaticvoid OnThreasholdChanged(int pos, object userdata) { _threashold = pos; Console.WriteLine($"Threashold: {_threashold}"); UpdateWindow(_win, _gray, _dst, _threashold, _max); } privatestaticvoid OnMaxChanged(int pos, object userdata) { _max = pos; Console.WriteLine($"Max: {_max}"); UpdateWindow(_win, _gray, _dst, _threashold, _max); } privatestaticvoid UpdateWindow(Window win, Mat src, Mat dst, int threashold, int max) { Cv2.Threshold(src, dst, threashold, max, ThresholdTypes.Binary); win.ShowImage(dst); } }
スライダーの実装では、コールバック関数を使って設定値を扱うんで、微妙に値のやり取りがめんどくさいですね・・・
ここでは手軽に書くために、コールバック関数側でも色々な変数にアクセスできるように、static変数で定義したりしてます。
でも、こうするとusingを使ったリソース破棄ができないのが少々残念な感じ。
問題点
ただし、この方法も少し問題があります。
なぜか、スライダーのみのウィンドウは、思った通りにウィンドウサイズを調整できません。。。
Resize関数で、ウィンドウのリサイズもできるのですが、この関数でうまくリサイズできない場合もあったり、、、
あくまでも、OpenCVでのウィンドウ表示やスライダーなどのGUI機能は、 テスト用・プロトタイプ作成用と割り切って使うのがよいかもしれません。