一、创建滑动条

createTrackbar(const String & trackbarname, const String & winname, int* value, int count, onChange =, TrackbarCallback 0, void * userdata =0)
 
trackbarname:滑动条的名称。
 winname:创建滑动条窗口的名称。
 value:指向整数变量的指针,该指针指向的值反映滑块的位置,创建后,滑块位置由此变量定义。
 count:滑动条的最大取值。
 onChange:每次滑块更改位置时要调用的函数的指针。该函数应该原型为void Foo (int,void *) ;,其中第一个参数是轨迹栏位置,第二个参数是用户数据。如果回调是NULL指针,则不会调用任何回调,只更新数值。
 userdata:传递给回调函数的可选参数。
 滑动条创建样例如下:
//定义全局变量src
Mat src;
//回调函数,通过回调不断的显示新的图片
void callBack(int value, void*)
{
	float a = value / 100.0;
	Mat img2 = src * a;
	imshow("demo", img2);
}
int main() {
	src = imread("1.jpg");
	//显示图像
	namedWindow("demo");
	imshow("demo", src);
	//滑动条初始值
	int value = 100;
	//创建滑动条
	createTrackbar("百分比", "demo", &value, 600, callBack, 0);
	waitKey(0);
	return 0;
}
 
二、鼠标事件相应
setMouseCallback(const String & winname, MouseCallback onMouse,void * userdata = 0)
 
winname:添加鼠标响应的窗口的名字
 onMouse:鼠标响应的回调函数。
 userdata:传递给回调函数的可选参数。
 回调函数:
typedef void(*cv::MouseCallback)(int event, int x, int y, int flags,void “userdata)
 
event:鼠标响应事件标志,参数为EVENT_*形式。
 x:鼠标指针在图像坐标系中的x坐标。
 y:鼠标指针在图像坐标系中的y坐标。
 flags:鼠标响应标志,参数为EVENT_FLAG_*形式。
 userdata:传递给回调函数的可选参数。
 
 
 本节的样例如下:
Mat src;
Mat imgPoint;
Point prePoint;
void mouse(int event, int x, int y, int flags, void*)
{
	//如果单机右键
	if (event==EVENT_RBUTTONDOWN)
	{
		cout << "要使用左键" << endl;
	}
	//如果单机左键
	if (event == EVENT_LBUTTONDOWN)
	{
		prePoint = Point(x, y);
		cout << "起始坐标是" << prePoint << endl;
	}
	//鼠标按住左键移动
	if (event == EVENT_MOUSEMOVE && (flags & EVENT_FLAG_LBUTTON))
	{
		//绘制鼠标移动轨迹
		Point pt(x, y);
		//绘制直线
		line(src, prePoint, pt, Scalar(255, 255, 255), 2, 5, 0);
		//将当前位置信息赋值给前一时刻信息,方便下一时刻继续移动
		prePoint = pt;
		imshow("1", src);
		//通过改变图像像素显示鼠标移动轨迹
		imgPoint.at<Vec3b>(y, x) = Vec3b(255, 255, 255);
		imgPoint.at<Vec3b>(y, x - 1) = Vec3b(255, 255, 255);
		imgPoint.at<Vec3b>(y, x + 1) = Vec3b(255, 255, 255);
		imgPoint.at<Vec3b>(y + 1, x) = Vec3b(255, 255, 255);
		imgPoint.at<Vec3b>(y + 1, x) = Vec3b(255, 255, 255);
		imshow("2", imgPoint);
	}
}
int main(){
	//读取图片
	src = imread("1.jpg");
	if (!src.data)
	{
		printf("不能打开空图片");
		return -1;
	}
	//拷贝读入的图像
	src.copyTo(imgPoint);
	imshow("1", src);
	imshow("2", imgPoint);
	//鼠标响应
	setMouseCallback("1", mouse, 0);
	waitKey(0);
	return 0;
                


















