首页 > 其他分享 >OpenCV窗口交互(窗口滑动条,鼠标响应)

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

时间:2024-07-17 21:29:26浏览次数:12  
标签:窗口 鼠标 img int void sp OpenCV EVENT

窗口交互操作
##### (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 onm ouse, 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();
}

在打开的图片中绘制椭圆

在这里插入图片描述

标签:窗口,鼠标,img,int,void,sp,OpenCV,EVENT
From: https://blog.csdn.net/sunny_code_/article/details/140497103

相关文章

  • 嘿!通义灵码周边「超大鼠标垫」上线啦,更多玩法等待解锁
    【领鼠标垫】简单3步体验通义灵码,即可领取灵码限量版超大鼠标垫!体验通义灵码升级模型和新功能,贏灵码限量周边和大奖!两种活动玩法,丰富好礼送不停,快来参与吧!【玩法一】完成安装、学习、体验通义灵码简单三步,即可领取通义灵码限量版超大鼠标垫(限通义灵码新用户)。【玩法二】邀请更......
  • 嘿!通义灵码周边「超大鼠标垫」上线啦,更多玩法等待解锁
    【领鼠标垫】简单3步体验通义灵码,即可领取灵码限量版超大鼠标垫!体验通义灵码升级模型和新功能,贏灵码限量周边和大奖!两种活动玩法,丰富好礼送不停,快来参与吧!【玩法一】完成安装、学习、体验通义灵码简单三步,即可领取通义灵码限量版超大鼠标垫(限通义灵码新用户)。【玩法二】邀请更......
  • 使用OpenCV实现摄像头测距
    使用OpenCV实现摄像头测距摄像头测距就是计算照片中的目标物体到相机的距离。可以使用相似三角形(triangle similarity)方法实现,或者使用更复杂但更准确的相机模型的内参来实现这个功能。使用相似三角形计算物体到相机的距离假设物体的宽度为 W,将其放到离相机距离为 D ......
  • 鼠标录制器哪个好用,5款热门鼠标连点器软件分享(收藏)
    鼠标录制怎么操作?在我们日常的工作生活中,经常需要用到屏幕录制工具,如电脑录屏或者手机录屏,使用鼠标录制功能的话,可以省时省力。鼠标录制工具可以记录用户的鼠标移动、点击和键盘输入,并在需要时回放这些操作。这样,用户可以自动化执行重复性任务。用户可以设置热键来快速启动和停......
  • WPF 透明窗口可以调整尺寸(通过拖拽窗口边缘)
    通过这篇文章,我们可以实现:让WPF的透明窗口可以通过拖拽窗口的边缘,自由的调整尺寸。我们可以通过拖拽窗口的上方,来移动窗口。我们可以禁止窗口拖到屏幕边缘时自动最大化。还可以等比例的改变窗口的大小。还可以等比例的改变窗口中控件的大小参考文章AllowsTransp......
  • Python学习笔记—100页Opencv详细讲解教程
    目录1创建和显示窗口...-4-2加载显示图片...-6-3保存图片...-7-4视频采集...-8-5视频录制...-11-6控制鼠标...-12-7TrackBar控件...-14-8.RGB和BGR颜色空间...-16-9.HSV和HSL和YUV..-17-10颜色空间的转化...-18-11mat的深......
  • 【python】PyQt5的窗口界面的各种交互逻辑实现,轻松掌控图形化界面程序
    ✨✨欢迎大家来到景天科技苑✨✨......
  • ActiViz实战:ActiViz中的自己实现鼠标双击事件
    文章目录1、添加鼠标事件2、网上实现双击事件的方式3、增加双击的时间限制4、补充说明1、添加鼠标事件  已知在C#中观察者/命令模式会报错,正常添加鼠标事件如下:privatevoidVtkInteractorStyleTest(){vtkInteractorStylestyle=vtkInteractorS......
  • 鼠标该怎么挑选?好鼠标的这几个要素你一定要知道
    鼠标,这个小小的设备,如今已经成为了我们生活中不可或缺的一部分。随着科技的不断发展,鼠标也在不断地演变和升级,为我们的生活带来了更多的便利和乐趣。无论是在工作中还是生活中,鼠标都扮演着重要的角色。在工作中,鼠标可以帮助我们快速地打开文件、编辑文档、发送邮件等等,提高......
  • pycharm的git控制窗口里对远程分支进行checkout后,如果和本地文件有冲突会怎么办
    在PyCharm中,当你checkout一个远程分支时,它确实会将该分支的文件更新到本地。这一过程类似于在命令行中执行gitcheckout<branch>,然后将远程分支的内容同步到本地工作目录当你在PyCharm中检出一个远程分支时,如果本地文件有未提交的更改且这些更改与即将检出的分支发生冲突,Py......