OpenCvSharpで作成したウィンドウに、スライダーを付けてみます。
作成したウィンドウに対してCreateTrackbar2
を呼び出すことで、ウィンドウにスライダーを付加できます。
ちなみに、CreateTrackbar/CreateTrackbar2と似たような名前の関数が用意されてますが、それぞれの用途の違いなどはまだ把握できてないです。。。
関数のシグネチャが若干違いますが、どちらの関数でもスライダーを作成できました。
スライダーの作成
まずは、スライダーを作成して、スライダーの位置が変化したらその座標をコンソールに表示してみます。
class Program { staticvoid 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(); } } } privatestaticvoid OnPosChanged(int pos, object userdata) { Console.WriteLine($"pos: {pos}"); } }
スライダーの設定値を利用して画像処理
続いて、スライダーを使って画像処理のパラメータを変化させてみます。
このサンプルでは、スライダーで指定した値を用いて、画像の二値化の閾値を変化させます。
ここでは、コールバック関数は関数として別途定義するのではなく、ラムダ式で書いてます。
こうしておくと、ラムダ式の外側の変数をキャプチャして、ラムダ式内で利用できるので、何かと便利です。
class Program { staticvoid 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(); } } } }
実行結果
スライダーを操作すると、二値化処理の閾値を変更できます。