day9:窗口交互:滑动条和鼠标事件

1:窗口滑动条:

代码示例:通过滑动条改变亮度

static void on_change(int a, void* userdata)
{
	Mat temp = *((Mat* )userdata);
	Mat res;
	addWeighted(temp, 1, 0, 0, a, res);
	imshow("trackbar_operate", res);
}
void visionagin::TrackbarOperate(Mat& img)
{
	int current_val = 50;
	int max_val = 200;
	namedWindow("trackbar_operate", WINDOW_AUTOSIZE);//必须先创建窗口
	createTrackbar("亮度调整", "trackbar_operate", &current_val, max_val, on_change,(void*)&img);
	on_change(current_val, (void*)&img);
	//imshow("trackbar_operate", img);在回调函数里显示
}

 2:鼠标事件:

 

 

鼠标响应就是当鼠标位于对应的图像窗口内时,时刻检测鼠标状态,当鼠标状态发生改变时,调用回调函数,并根据回调函数中的判断逻辑选择执行相应的操作.例如 ,回调函数中只处理鼠标左键按下的事件 ,即判断 event 标志是否为 EVENT_LBUTIONDOWN,只有当 event=EVENT _BUTTONDOWN 肘,才有相应的逻辑操作,否则将不会进行任何操作。

代码:

static void on_mouse(int event, int x, int y, int flag, void* userdata)
{
	Mat temp = *((Mat*)userdata);
	Point prept(x, y);//鼠标左键按下时的起始坐标
	if (event == EVENT_LBUTTONDOWN )
	{
		cout << "起始坐标是:" << prept << endl;
	}
	if (event == EVENT_MOUSEMOVE && (flag & EVENT_FLAG_LBUTTON))
	{
		//通过改变像素点的颜色显示轨迹
		/*
		temp.at<Vec3b>(y, x) = (255, 255, 255);//矩阵几行几列,对应y,x
		imshow("鼠标操作", temp);
		*/
		Point curpt(x, y);//通过连续画直线显示
		line(temp, prept, curpt, Scalar(0, 0, 255), 2);
		prept = curpt;
		imshow("鼠标操作", temp);
	}
}
void visionagin::MouseOperate(Mat& img)
{
	namedWindow("鼠标操作", WINDOW_AUTOSIZE);
	setMouseCallback("鼠标操作", on_mouse, (void*)&img);
	imshow("鼠标操作", img);
}

 两种方法显示鼠标移动轨迹:

1.改变鼠标坐标像素值;

2.连续画直线。

运行后发现存在问题:鼠标运行过快,轨迹的显示会断断续续,还未找到解决方案。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值