opencv鼠标事件函数setMouseCallback()详解

这篇具有很好参考价值的文章主要介绍了opencv鼠标事件函数setMouseCallback()详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

opencv鼠标事件函数setMouseCallback()详解
1、鼠标事件函数:
(1)鼠标事件函数原型:setMouseCallback(),此函数会在调用之后不断查询回调函数onMouse(),直到窗口销毁
  void setMouseCallback(
	const String& winname, 
	MouseCallback onMouse, 
	void* userdata = 0
)

参数解释:
 winname:窗口名称;
 onMouse:回调函数;
 userdata:传递给回调函数用户自定义的外部数据,userdata是一个 void 类型的指针;

(2)回调函数onMouse(),可随意命名,但是要与 setMouseCallback()函数里的回调函数名称一致
void onMouse(
	int event, 
	int x, 
	int y, 
	int flags, 
	void *userdata
) 

参数解释:
event:表示鼠标事件类型的常量(
	#define CV_EVENT_MOUSEMOVE 0             //滑动
	#define CV_EVENT_LBUTTONDOWN 1           //左键点击
	#define CV_EVENT_RBUTTONDOWN 2           //右键点击
	#define CV_EVENT_MBUTTONDOWN 3           //中键点击
	#define CV_EVENT_LBUTTONUP 4             //左键放开
	#define CV_EVENT_RBUTTONUP 5             //右键放开
	#define CV_EVENT_MBUTTONUP 6             //中键放开
	#define CV_EVENT_LBUTTONDBLCLK 7         //左键双击
	#define CV_EVENT_RBUTTONDBLCLK 8         //右键双击
	#define CV_EVENT_MBUTTONDBLCLK 9         //中键双击
);
x和y:鼠标指针在图像坐标系的坐标;
flags:鼠标事件标志的常量;
userdata:回调函数接收,用户自定义的外部数据,userdata是一个 void 类型的指针;

2、代码示例:

利用鼠标事件函数,提取ROI区域:

(1)main.cpp
#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>

using namespace cv;
using namespace std;

int main() {
	//读取图像,BGR存储在Mat矩阵里
	Mat src = cv::imread("C:\\cpp\\image\\suzy4.jpg");
	if (src.empty()) {
		printf("could not load image..../n");
		return -1;
	}

	Demo demo;
	demo.mouseEvent(src);

	waitKey();
	destroyAllWindows();
	return 0;
}
(2)头文件demo.h
#include <opencv2/opencv.hpp>

using namespace cv;

class Demo
{
public:
	void mouseEvent(Mat &image);
private:

};

(3)demo.cpp
#include <Demo.h>

using namespace std;

Point sp(-1, -1);
Point ep(-1, -1);
Mat temp;
static void onMouse(int event, int x, int y, int flags, void *userdata) {
	/**
	* 对指针userdata,进行转换和解引用的操作,将userdata指向的Mat对象,赋值给名为image的变量,以便后续对图像数据的处理:
	* userdata是一个void类型的指针,需要转换为Mat类型的指针,然后用*运算符解引用,得到Mat对象,再赋值给名为image的变量,这样就可以对image进行操作了;
	*/
	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);
			temp.copyTo(image);
			imshow("ROI区域", image(box));
			rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);
			imshow("鼠标绘制", image);
			// ready for next drawing
			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("鼠标绘制", image);
			}
		}
	}
}

void Demo::mouseEvent(Mat &image) {
	namedWindow("鼠标事件", WINDOW_AUTOSIZE);

	/**
	* 由于回调函数需要传入的是一个void类型指针,我们先取image的地址,再将&image强制转换为void类型指针,具体操作如下:
	* &image:获取变量image的内存地址,即Mat对象的指针;
	* (void*):是一个强制类型转换,将image的地址转换为void类型指针,这样就可以将参数传递给回调函数了;
	*/
	setMouseCallback("鼠标绘制", onMouse, (void*)(&image));
	imshow("鼠标绘制", image);
	temp = image.clone();
}

(4)效果演示

opencv鼠标事件函数setMouseCallback()详解,opencv,opencv文章来源地址https://www.toymoban.com/news/detail-693664.html

到了这里,关于opencv鼠标事件函数setMouseCallback()详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ opencv鼠标事件,在图像上画矩形

    opencv中常用的除了TrackBar滑动条事件,还有丰富的鼠标事件,与TrackBar类似,鼠标事件也是使用回调函数判断动作的发生,并执行相关的操作。整个行为与QT的信号与槽类似。 在图像中画出矩形,需要使用setMouseCallback()和MouseCallback()函数。 本文使用的头文件及命名空间: 设

    2024年02月11日
    浏览(35)
  • QT基础:event 函数重载、筛选鼠标按压事件、获取鼠标位置、右键显示菜单、修改鼠标样式功能演示

    这里演示的是QT基础,主要包含: event 函数重载、筛选鼠标按压事件、获取鼠标位置、右键显示菜单、修改鼠标样式等功能演示, 适合初学者食用 。 演示功能:点击鼠标左键、右键、中键、左右键同时点击,输出鼠标当前坐标;按下鼠标中键,鼠标样式被替换,按下鼠标左

    2024年02月09日
    浏览(48)
  • js常用点击、鼠标、键盘事件--详解

    JavaScript 提供了多种事件类型,包括点击事件、鼠标事件和键盘事件。您可以通过监听这些事件来响应用户的交互动作。以下是一些常见事件及其相应的 JavaScript 代码示例: 1. 点击事件: 2. 鼠标事件(例如鼠标移入、移出、移动等): 3. 键盘事件(例如按下按键、释放按键

    2024年02月12日
    浏览(58)
  • Opencv C++图像处理:矩阵Mat + 随机数RNG + 计算耗时 + 鼠标事件

    数据类型 字节数 取值范围 bool型(布尔型) 1 [0 or 1] BOOL型(int型) 4 [TRUE or FALSE] sbyte型(有符号8位整数) 1 [128 ~ 127] bytet型(无符号8位整数) 8U 2 [0 ~ 255] short型(有符号16位整数) 16S 2 [-32,768 ~ 32,767] ushort型(无符号16位整数) 16U 2 [0 ~ 65,535] int型(有符号32位整数) 32S 4 [

    2024年02月03日
    浏览(56)
  • 【opencv学习】鼠标回调函数、鼠标控制画矩形

    1.回调函数可以简单理解为一边做一件事的同时做另一件事,优化之前的实现完一个函数后才实现另一个的问题。 鼠标回调函数就是一边鼠标操作画图,一边显示画出的图像。 2.实现一个矩形rec只需要知道一个左上角的坐标和宽高即可实例化对象。

    2024年02月14日
    浏览(54)
  • Qt 自定义窗口的标题栏,重写鼠标事件实现,关闭隐藏,最大化/最小化,重写窗口事件函数,实现鼠标选中边框拉大拉小,双击标题栏切换窗口最大化和最小化

    Qt 自定义窗口的标题栏,重写鼠标事件实现,关闭隐藏,最大化/最小化,重写窗口事件函数,实现鼠标选中边框拉大拉小,双击标题栏切换窗口最大化和最小化 1、main.cpp 2、widget.h 3、widget.cpp 4、效果展示 5、完成

    2024年02月16日
    浏览(70)
  • 曲鸟全栈UI自动化教学(五):Selenium的键盘鼠标事件详解

    在之前的教学中对于页面的操作只涉及到了两个:点击、输入;其实Selenium的键盘鼠标操作还有很多,现在就为你一一讲解。 【Python测试交流群:8140 78962】 1.1 我们可以使用 send_keys 来输入我们想要输入的内容 例如打开百度,搜索框输入: 曲鸟 csdn : 1.2 也可以指定按键输入

    2024年02月07日
    浏览(42)
  • OPENCV C++(三)二值化灰度函数+调用摄像头+鼠标响应+肤色检测

    图像 目标图像 rgb转灰度 灰度图,目标图,阈值,大于阈值的转换的像素值,方法为大津法 灰度图,目标图,大于阈值的转换的像素值,自适应方法,二值化方法 虽然人物的信息丢失了很多,但是背景基本上被去掉了。丢失的人物的信息可以通过位运算等恢复。在去除背景

    2024年02月14日
    浏览(60)
  • OpenCV SIFT源码详解——detectAndCompute函数详解

    useProvidedKeypoints参数决定当前是探测关键点还是计算描述符 useProvidedKeypoints 为true时,执行compute功能,计算描述符;为false时,执行detect功能,探测关键点; 当探测关键点时,构建的高斯金字塔首层图像会扩大两倍, firstOctave 等于-1;而计算描述符时, firstOctave 会根据传入的

    2024年02月16日
    浏览(39)
  • OpenCV inRange 函数使用详解

            本文是 OpenCV图像视觉入门之路的第6篇文章,本人详细的解决了RGB转HSV,HSV通过AI来进行HSV转 inRange() 函数的范围值操作,简单全面的解决了OpenCV对于图像中某个颜色的分析工作,本文通过识别红色区域和蓝色区域来编写示例程序和博客,也讲述了各种操作,例如:

    2024年02月03日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包