OpenCV窗口交互(窗口滑动条,鼠标响应)

窗口交互操作
##### (1)图像窗口滑动条

​ Open-CV 中创建滑动条函数原型为:

int createTrackbar(const String& trackbarname, const String& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);

trackbarname :滑动条名称

winname :创建滑动条窗口名称

value:滑动条初始值指针

count:滑动条最大值

onChange:回调函数,滑动时调用该函数更新数据,函数原型----------void Foo(int , void*)

void Foo(int , void*): int为滑动条的值,void*为任意类型数据,按需求传入

userdata:传递给回调函数的可选参数

利用crateTrackbar() 可实现亮度调整

//增加亮度演示
//回调函数实现
static void track(int light,void*img)
{
	Mat imgg = *(Mat*)img;
	Mat m = Mat::zeros(imgg.size(),imgg.type());
	Mat dst = Mat::zeros(imgg.size(), imgg.type());
	addWeighted(imgg, 1.0, m, 0, light, dst); //加法增加亮度
	imshow("亮度", dst);
}
// 创建Trackbar()
void tract_bar_demo(Mat& img)
{
	namedWindow("亮度", WINDOW_AUTOSIZE);
	int maxnum = 200;  //最大亮度
	int con_value = 0;  // 初始亮度
	createTrackbar("contrast:", "亮度", &con_value, maxnum, track_con, (void*)(&img));
}

//同理可实现亮度减小操作

运行tract_bar_demo:亮度调节为80时图像明显增亮

在这里插入图片描述
在这里插入图片描述

(2)鼠标响应

设置鼠标响应函数原型为

void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);

winname: 添加鼠标窗口名称

onMouse: 鼠标响应的回调函数

userdata: 传递可选参数,与Foo中void*类似

回调函数原型为

typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);

event: 鼠标响应标注,为枚举类型,根据鼠标不同操作变化

x,y: 为鼠标在图像中的x,y坐标

flags:鼠标拖拽类型,为枚举类型,根据鼠标不同操作变化

//event参数含义
enum MouseEventType
{
	  EVENT_MOUSEMOVE       = 0, //!<  表示鼠标指针已移动到窗口上方。
       EVENT_LBUTTONDOWN    = 1, //!< 表示鼠标左键被按下。
       EVENT_RBUTTONDOWN    = 2, //!< 表示鼠标右键被按下。
       EVENT_MBUTTONDOWN    = 3, //!< 表示鼠标中键被按下。
       EVENT_LBUTTONUP      = 4, //!< 表示释放鼠标左键。
       EVENT_RBUTTONUP      = 5, //!< 表示释放鼠标右键。
       EVENT_MBUTTONUP      = 6, //!< 表示鼠标中键释放。
       EVENT_LBUTTONDBLCLK  = 7, //!< 表示双击鼠标左键。
       EVENT_RBUTTONDBLCLK  = 8, //!< 表示双击鼠标右键。
       EVENT_MBUTTONDBLCLK  = 9, //!< 表示双击鼠标中键。
       EVENT_MOUSEWHEEL     = 10,//!< 正值和负值分别表示向前和向后滚动。
       EVENT_MOUSEHWHEEL    = 11 //!< 正值和负值分别表示向右和向左滚动。
}

//flags参数含义
enum MouseEventFlags {
       EVENT_FLAG_LBUTTON   = 1, //!< 表示鼠标左键未按下。
       EVENT_FLAG_RBUTTON   = 2, //!<表示鼠标右键未按下。
       EVENT_FLAG_MBUTTON   = 4, //!< 表示鼠标中键未按下。
       EVENT_FLAG_CTRLKEY   = 8, //!< 表示按下“CTRL”
       EVENT_FLAG_SHIFTKEY  = 16,//!< 表示按下SHIFT键。
       EVENT_FLAG_ALTKEY    = 32 //!< 表示按下ALT键。
     };

利用setMouseCallback()可用鼠标绘制矩形,圆形等

// 绘制椭圆演示


//回调函数

Point sp(-1, -1); // 鼠标按下的点坐标
Point ed(-1, -1); // 鼠标松开的点坐标
Mat temp;
static void on_draw(int event, int x, int y, int flag, void* userdata)
{
	Mat img = *((Mat*)userdata);
	if (event == EVENT_LBUTTONDOWN)
	{//当按下左键时记录起始点
		sp.x = x;
		sp.y = y;
		cout << sp;
	}
	else if (event == EVENT_LBUTTONUP)
	{// 当松开左键时记录结束点,绘制后将起始点初始化
		ed.x = x;
		ed.y = y;
		int dx = (ed.x + sp.x)/2;
		int dy = (ed.y + sp.y)/2;
		RotatedRect rorect;//
		rorect.center = Point(dx, dy);
		rorect.angle = 0;
		rorect.size.width = abs(ed.x-sp.x);
		rorect.size.height = abs(ed.y - sp.y);
		ellipse(img, rorect, Scalar(0, 255, 255),1,8);//在两点确定的矩形中绘制椭圆
		imshow("绘制", img);
		
		temp = img.clone();
		sp.x = -1;
		sp.y = -1;
	}
	else if (event == EVENT_MOUSEMOVE && sp.x>0 && sp.y>0)
	{//鼠标移动时持续绘制
		ed.x = x;
		ed.y = y;
		temp.copyTo(img);
		Rect rect(sp, ed);
		float dx = (ed.x + sp.x) / 2;
		float dy = (ed.y + sp.y) / 2;
		RotatedRect rorect;
		rorect.center = Point(dx, dy);
		rorect.angle = 0;
		rorect.size.width = abs(ed.x - sp.x);
		rorect.size.height = abs(ed.y - sp.y);
		ellipse(img, rorect, Scalar(0, 255, 255), 2, 8);
		imshow("绘制", img);
	}

}


//设置鼠标响应
void QuickDemo::mouse_Draw(Mat& img)
{
	namedWindow("绘制", WINDOW_AUTOSIZE);
	setMouseCallback("绘制", on_draw,(void*)(&img));
	imshow("绘制",img);
	temp = img.clone();
}

在打开的图片中绘制椭圆

在这里插入图片描述

  • 22
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值