Qt+OpenCV联合开发(十九)--鼠标操作与响应

2023-10-24 16:50

本文主要是介绍Qt+OpenCV联合开发(十九)--鼠标操作与响应,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基本知识

如果你想要用鼠标在图上做标记等,就要用到创建鼠标回调函数的函数setMouseCallback(),以及鼠标事件回调函数onMouse()。

通过鼠标对图像视窗最常见的操作有:

  • 左键单击按下
  • 左键单击抬起
  • 左键按下拖动
  • 鼠标指针位置移动

1、setMouseCallback()函数

c++原型

void setMousecallback(const string& winname, MouseCallback onMouse, void* userdata=0);
winname  窗口的名字
onMouse  鼠标回调函数(响应函数)。监视到鼠标操作后调用并处理相应动作。 这个函数的原型应该为void on_Mouse(int event, int x, int y, int flags, void* userdata);
userdate  传给回调函数的参数(鼠标响应处理函数的ID,识别号)

2、MouseCallback onMouse()函数

c++原型

void on_Mouse(int event,int x,int y,int flags,void *userdata);
event    CV_EVENT_*变量之一,代表了鼠标的各种操作
x和y   鼠标指针在图像坐标系的坐标(不是窗口坐标系) 
flags   代表鼠标的拖拽事件,以及键盘鼠标联合事件,共有32种事件
userdata   用户定义的传递到setMouseCallback函数调用的参数。

 on_Mouse函数名可以随意取

3、鼠标事件

常用的事件:

  • #defineCV_EVENT_MOUSEMOVE     //鼠标指针位置移动
  • #defineCV_EVENT_LBUTTONDOWN  //左键单击按下
  • #defineCV_EVENT_RBUTTONDOWN    //右键单击按下
  • #defineCV_EVENT_LBUTTONUP    //左键单击抬起
  • #defineCV_EVENT_RBUTTONUP   //右键单击抬起

单次单击操作响应事件及顺序:
Opencv中setMouseCallback()创建了一个鼠标回调函数,每次在图像上单击鼠标左键再抬起的过程,都会分3次调用鼠标响应函数,并且响应顺序是:

  1. 左键单击按下
  2. 左键单击抬起
  3. 鼠标指针位置移动(即使原地单击,鼠标位置并没有移动)

二、实现效果

1、不能看见鼠标的整个绘制过程

 2、可以看见鼠标的整个绘制过程,但把绘制过程经过的所有矩形都绘制出来了

 3、实时截取ROI区域(最终版)

 

三、代码

Point sp(-1, -1);//鼠标的开始的位置
Point ep(-1, -1);
Mat temp;
static void on_draw(int event,int x,int y,int flags,void *userdata)//参数1表示鼠标事件
{Mat image = *((Mat*)userdata);if(event == EVENT_LBUTTONDOWN)//如果鼠标的左键按下{sp.x = x;sp.y = y;std::cout << "start point:" <<sp<< std::endl;}else if (event == EVENT_LBUTTONUP){ep.x = x;ep.y = y;int dx = ep.x - sp.x;int dy = ep.y - sp.y;if (dx > 0 && dy > 0){Rect box(sp.x, sp.y, dx, dy);imshow("ROI area", image(box));rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);imshow("mouse_drawing", image);//复位,为下一次做准备sp.x = -1;sp.y = -1;}}else if (event == EVENT_MOUSEMOVE){if (sp.x > 0 && sp.y > 0){ep.x = x;ep.y = y;int dx = ep.x - sp.x;int dy = ep.y - sp.y;if (dx > 0 && dy > 0){Rect box(sp.x, sp.y, dx, dy);temp.copyTo(image);rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);imshow("mouse_drawing", image);}}}
}
void test1::mouse_drawing(Mat &image)
{namedWindow("mouse_drawing", WINDOW_AUTOSIZE);setMouseCallback("mouse_drawing", on_draw,(void*)(&image));//设置窗口的回调函数。参数1表示名称,参数2表示调用on_drawimshow("mouse_drawing", image);temp = image.clone();//保存原图
}

注:

1、因为自定义的on_draw方法有接收userdata参数,所以setMouseCallback的userdata一定要传,不然程序直接异常结束

 2、用rectangle函数画完矩形一定要及时更新图像(imshow),不然绘制不出来

 3、要想看到鼠标的整个绘制过程,要添加EVENT_MOUSEMOVE事件,还要判断只有鼠标左键按下的时候才进行绘制,每次绘制结束的时候要复位

4、绘制时只想要绘制一个,每次绘制前,前面一个图就要檫除,可以先保存一下原图,temp = image.clone();然后到绘制的时候 temp.copyTo(image);完成对前面绘制矩形的檫除

5、可以绘制矩形后要想提取ROI区域,用imshow("ROI area", image(box));

6、矩形的绘制一定要在窗口里面(可完善)

附鼠标相关事件

 原创不易,转载请注明出处:

Qt+OpenCV联合开发(十八)--鼠标操作与响应

这篇关于Qt+OpenCV联合开发(十九)--鼠标操作与响应的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/276516

相关文章

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元,传统键盘输入方式正悄然进化。以往,面对实体键盘,我们常需目光游离于屏幕与键盘之间,以确认指尖下的精准位置。而屏幕键盘虽直观可见,却常因占据屏幕空间,迫使我们在操作与视野间做出妥协,频繁调整布局以兼顾输入与界面浏览。 幸而,韦季李输入法的横空出世,彻底颠覆了这一现状。它不仅对输入界面进行了革命性的重构,更巧妙地将鼠标这一传统外设融入其中,开创了一种前所未有的交互体验。 想象

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字