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通道分别是 色调,饱和度,亮度。通过分割,合并通道的操作可以对单个通道的进行修改,在后面的目标追踪也会用到。