1. 程式人生 > >c# opencvsharp學習筆記(5)CvTrackbar,HSV,通道分割合併

c# opencvsharp學習筆記(5)CvTrackbar,HSV,通道分割合併

1.CvTrackbar

public CvTrackbar(string name, string window, CvTrackbarCallback callback);
public CvTrackbar(string name, string window, CvTrackbarCallback2 callback);
        //
        // 摘要:
        //     Constructor
        //
        // 引數:
        //   name:
        //     Trackbar name滑動條的名字
        //
        //   window:
        //     Window name視窗名字,要依附的圖片的視窗名,不能單獨
        //
        //   value:
        //     Initial slider position初始滑塊位置
        //
        //   max:
        //     The upper limit of the range this trackbar is working with.
        //此 trackbar 使用的範圍的上限。
        //   callback:
        //     Callback handler   回撥的控制代碼,就是名字,每次滑塊改變位置時都要呼叫委託。
        public CvTrackbar(string name, string window, int value, int max, CvTrackbarCallback callback);

  
        public CvTrackbar(string name, string window, int value, int max, CvTrackbarCallback2 callback, object userdata);
//callback2支援同時傳遞兩個變數

1.1建立一個trackbar並在控制中列印位置

       CvTrackbarCallback cvTrackbarcbV = new CvTrackbarCallback(Pos);
           //委託函式,就是把trackbar的值作為委託函式的實參呼叫委託的函式
            Window window = new Window("tbar");//建立一個新視窗"tbar"
            CvTrackbar cvTrackbarV = new CvTrackbar("bar", "tbar",cvTrackbarcbV);
            //在"tbar"視窗上加一個trackbar
            Cv2.WaitKey();


           //在main外宣告一個函式
            static void Pos(int pos)
           {
            Console.WriteLine(pos);//把pos在控制檯中打印出來
           }

1.2建立一個trackbar在圖片上把位置寫出來

Mat sion = new Mat("Sion.png", ImreadModes.Color);//載入圖片
CvTrackbarCallback2 cvTrackbarcbV = new CvTrackbarCallback2(Pos);//使用2,來傳遞2個變數
Cv2.ImShow("sion", sion);//開啟視窗
CvTrackbar cvTrackbarV = new CvTrackbar("bar", "sion",0,255, cvTrackbarcbV,sion);//把sion也傳遞過去,直接依附在圖片視窗上
Cv2.WaitKey();



//在main外宣告
static void Pos(int pos, object userdata)
{
Mat a = (Mat)userdata;//接收sion並把object轉換成mat
Mat sion = new Mat ();
a.CopyTo(sion);//不要直接用等於,因為那樣字會直接疊在一起
Point point = new Point(100, 100);//字的位置
Cv2.PutText(sion, pos.ToString(), point, HersheyFonts.HersheyComplex, 2, Scalar.RandomColor(), 2);//寫字
Cv2.ImShow("sion", sion);//重新整理視窗
}

1.3建立一個trackbar用它來改變圖片亮度

 Mat sion = new Mat("Sion.png", ImreadModes.Color);
            CvTrackbarCallback2 cvTrackbarcbV = new CvTrackbarCallback2(PosValue);
            Cv2.ImShow("sion", sion);
            CvTrackbar cvTrackbarV = new CvTrackbar("bar", "sion",0,255, cvTrackbarcbV,sion);
            Cv2.WaitKey();

            //在mian外宣告
          static void PosValue(int pos, object userdata)
          {
            Mat a = (Mat)userdata;//接收sion並把object轉換成mat
            Mat sion = new Mat();
            a.CopyTo(sion);
            Cv2.CvtColor(sion, sion, ColorConversionCodes.BGR2HSV);//BGR轉成HSV
            Mat[] channel = Cv2.Split(sion);//分割通道
            for (int i = 0; i < channel[2].Rows; i++)//遍歷所有畫素
            {
                for (int j = 0; j < channel[2].Cols; j++)
                {
                    channel[2].Set(i, j, pos);//改變亮度
                }
            }
            //Cv2.ImShow("色調", channel[0]);
            //Cv2.ImShow("飽和度", channel[1]);
            //Cv2.ImShow("亮度", channel[2]);
            Cv2.Merge(channel, sion);//合併通道
            Cv2.CvtColor(sion, sion, ColorConversionCodes.HSV2BGR);//HSV必須轉為BGR才能正常顯示
            Cv2.ImShow("sion", sion);
          }

//hsv通道分別是   色調,飽和度,亮度。通過分割,合併通道的操作可以對單個通道的進行修改,在後面的目標追蹤也會用到。