c# opencvsharp學習筆記(5)CvTrackbar,HSV,通道分割合併
阿新 • • 發佈:2019-01-04
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通道分別是 色調,飽和度,亮度。通過分割,合併通道的操作可以對單個通道的進行修改,在後面的目標追蹤也會用到。