`

鼠标操作

 
阅读更多
#include <opencv2/opencv.hpp>
using namespace cv;
 
#define WINDOW_NAME "【程序窗口】"
 
//全局函数声明部分
void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectangle(cv::Mat& img, cv::Rect box);  //在临时变量的图片上绘制矩形
void ShowHelpText();
//全局变量声明部分
Rect g_rectanle;
bool g_bDrawingBox = false; //是否进行绘制
RNG g_rng(12345);
//main函数
int main(int argc, char** argv)
{
	//准备参数
	g_rectanle = Rect(-1,-1,0,0);
	Mat srcImage(600,800,CV_8UC3), tempImage;
	srcImage.copyTo(tempImage);	//复制源图到临时变量
	g_rectanle = Rect(-1,-1,0,0);
	srcImage  = Scalar::all(0);
	//设置鼠标操作回调函数
	namedWindow(WINDOW_NAME);
	setMouseCallback(WINDOW_NAME, on_MouseHandle,(void*)&srcImage);
 
	//程序主循环,当进行绘制的标示符 为真时,进行绘制
	while (1)
	{
		srcImage.copyTo(tempImage); //复制源图到临时变量
		if (g_bDrawingBox)
		{
			DrawRectangle(tempImage,g_rectanle); //当绘制的标示符为真,则进行绘制
		}
		imshow(WINDOW_NAME, tempImage);
		imwrite("123.jpg", tempImage);
		if (waitKey(10) == 27)
		{
			break;
		}
	}
	return 0;
}
///////////鼠标的回调函数,根据不同的鼠标事件进行不同的操作
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{
	Mat& image = *(cv::Mat*)param;
	//鼠标移动 消息
	switch (event)
	{
	case EVENT_MOUSEMOVE:
		{
			if (g_bDrawingBox) //如果是否进行绘制的表示为真,则记录下长和宽到RECT变量中
			{
				g_rectanle.width = x - g_rectanle.x;
				g_rectanle.height = y - g_rectanle.y;
			}
		}
		break;
	//左键按下
	case EVENT_LBUTTONDOWN:
		{
			g_bDrawingBox = true;
			g_rectanle = Rect(x, y, 0, 0); //记录起始点
		}
		break;     // 起初此处遗漏掉了break;造成只能绘制出随机颜色的点,不能绘制矩形
	//左键抬起消息
	case EVENT_LBUTTONUP:
		{
			g_bDrawingBox = false;//置标示符为false
			//对宽和高小于0的处理
			if (g_rectanle.width < 0)
			{
				g_rectanle.x += g_rectanle.width;
				g_rectanle.width *= -1;
			}
			if (g_rectanle.height < 0)
			{
				g_rectanle.y += g_rectanle.height;
				g_rectanle.height *= -1;
			}
			//调用函数进行绘制
			DrawRectangle(image, g_rectanle);
		}
		break;
	default:
		break;
	}	
}
 
//自定义的矩形绘制函数
 
void DrawRectangle(cv::Mat& img, cv::Rect box)
{
	rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(0,255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));
}

 

OpenCv中的鼠标操作和滑动条的消息映射方式类似

SetMouseCallback 函数的作用是为指定的窗口设置鼠标回调函数

Void setMouseCallback(const string& winname,MouseCalllback onMouse,void* userdata = 0)

第一个参数,const string& 类型的 winname,窗口的名字。

第二个参数,MouseCallback类型的 onMouse,指定窗口里每次鼠标事件发生的时候,被调用的函数指针。

这个函数的原型的大概形式为 void Foo(int event,int x,int y,int flags,void* param).

其中event是EVENT_+变量之一,X和Y是鼠标指针在图像坐标系()中的坐标值,flags是EVENT_FLAG的组合,param 是用户定义的传递到SetMouseCallback函数调用的参数,如EVENT_MOUSEMOVE为鼠标移动消息,EVENT_LBUTTONDOWN为鼠标左键按下消息等。

在OpenCv2中,上述“EVENT_”之前可以加上“CV_”前缀。

第三个参数,void*类型的userdata,用户定义的传递到回调函数的参数,有默认值0.

 

 

 

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    unity 仿3DMax鼠标操作

    ### Unity 仿3DMax鼠标操作 在Unity中模拟3DMax的鼠标操作是一项非常实用的功能,特别是对于那些习惯了3DMax操作环境的用户来说。本文将详细介绍如何在Unity中实现这一功能,包括如何通过鼠标操作平移、旋转以及...

    易语言仿按键精灵录制键盘鼠标操作的代码

    "易语言仿按键精灵录制键盘鼠标操作的代码" 易语言仿按键精灵录制键盘鼠标操作的代码是使用易语言来实现模拟键盘鼠标操作的录制,通过使用DLL命令来模拟鼠标和键盘的操作。该代码提供了一个完整的解决方案,包括...

    鼠标操作基本练习鼠标操作基本练习鼠标操作基本练习

    鼠标操作基本练习,方便初次接触电脑人掌握鼠标使用鼠标操作基本练习,方便初次接触电脑人掌握鼠标使用鼠标操作基本练习,方便初次接触电脑人掌握鼠标使用鼠标操作基本练习,方便初次接触电脑人掌握鼠标使用鼠标操作...

    嘉嘉鼠标游戏(小学生学习鼠标操作)2.0绿色版

    嘉嘉鼠标游戏是一款绿色免费的适合小学生学习鼠标操作的游戏。软件操作简单,有趣好玩,便于少儿熟练掌握鼠标的运用技巧。 嘉嘉鼠标游戏使用方法 游戏规则: 1、单击。在草地上不断出现许多米老鼠,用鼠标光标对准它...

    C语言五子棋代码 支持鼠标操作

    【C语言五子棋代码 支持鼠标操作】 在编程领域,C语言是一种基础且强大的编程语言,广泛用于系统开发、软件实现以及教学。本项目是利用C语言编写的一个五子棋游戏,它不仅实现了基本的游戏逻辑,还特别加入了鼠标...

    C语言写的鼠标操作

    本文将深入探讨如何使用C语言进行鼠标操作,这可以帮助开发者更好地理解底层系统工作原理,增强其在图形用户界面(GUI)编程中的能力。 一、Windows API与鼠标操作 在Windows操作系统中,我们可以利用Windows API...

    Excel编辑鼠标操作模拟

    本示例代码着重于“Excel编辑鼠标操作模拟”,这意味着我们要探讨如何通过编程方式来模拟用户在Excel中进行的各种鼠标操作。这在自动化测试、数据分析或者自定义功能开发中具有重要意义。 首先,我们要理解Windows...

    c语言鼠标操作源代码

    在C语言中实现鼠标操作可能并不像在高级编程语言中那样直观,因为C语言本身并不直接支持GUI(图形用户界面)或鼠标事件处理。但是,通过使用特定的库,如Windows API(应用程序接口)在Windows操作系统下,或者利用...

    对鼠标操作进行屏幕鼠标录象

    标题中的“对鼠标操作进行屏幕鼠标录象”指的是创建一个应用程序,它可以记录用户在计算机屏幕上进行的鼠标活动。这样的功能通常用于制作教程、演示或自动化某些任务,因为它们能够捕捉到用户的所有点击和移动,然后...

    向日葵iPad远程控制鼠标操作先睹为快.docx

    向日葵iPad远程控制鼠标操作先睹为快 向日葵iPad远程控制鼠标操作先睹为快是基于iPad的远程控制软件,能够实现移动设备远程访问和控制PC电脑的功能。该软件具有完全免费、便捷、实用的特点,让用户可以随时随地地...

    c#关于鼠标操作的基本实例

    在这个基本实例中,我们将深入探讨如何在WinForms应用中处理鼠标操作。 一、鼠标事件概述 在C# WinForms中,控件通常会引发一系列与鼠标交互相关的事件。这些事件包括: 1. MouseDown:当鼠标按钮被按下时触发。 2...

    C++鼠标操作实例C++鼠标操作实例

    本实例主要讲解如何在C++中实现鼠标操作,包括鼠标选点和显示,以及处理鼠标消息。我们将通过以下几个方面来深入理解这个主题: 1. **Windows API和消息机制**: 在Windows环境下,C++通常借助Windows API来实现对...

    HyperMesh快捷键、鼠标操作、键盘操作

    ### HyperMesh快捷键、鼠标操作、键盘操作详解 #### 一、HyperMesh简介 HyperMesh是一款高性能的有限元前处理软件,广泛应用于汽车、航空航天、机械制造等多个领域。其强大的功能使得用户能够高效地进行网格划分、...

    模拟鼠标操作.zip

    本压缩包"模拟鼠标操作.zip"包含了一个用C语言编写的程序,它利用了Windows API中的`mouse_event`函数来实现这一功能。下面我们将详细探讨这个知识点。 `mouse_event`是Windows API提供的一种系统级函数,用于模拟...

    VB后台模拟键盘鼠标操作,游戏实例源码【YK】

    本知识点主要涵盖VB(Visual Basic)编程语言在后台模拟键盘鼠标操作的应用,通过提供的游戏实例源码,我们可以深入理解这一技术。VB是一种基于事件驱动的编程环境,它为开发Windows应用程序提供了直观的图形用户...

    C语言鼠标操作方法及源码 鼠标中断 鼠标函数中断

    ### C语言中的鼠标操作方法及源码解析 #### 概述 在早期的DOS操作系统中,通过调用特定的中断指令(中断号为33H)可以实现对鼠标的操作控制。这种技术对于理解计算机底层硬件操作具有重要的意义。本文将详细介绍...

    Unity鼠标操作(平移、旋转、缩放)

    完整的工程源码,利用鼠标左键实现平移操作,利用鼠标右键实现旋转操作,利用鼠标滚轮实现缩放操作。具体讲解见https://blog.csdn.net/sunbowen63/article/details/89325314

    不用鼠标操作电脑

    不用鼠标操作电脑 一、常见用法: 二、使用“Windows资源管理器”的快捷键 三、使用 WINDOWS键 四、使用“我的电脑”和“Windows资源管理器”的快捷键 五、使用对话框中的快捷键 六、使用“桌面”、“我的电脑”...

    汇编语言课程设计:鼠标操作绘制图案

    在这个“汇编语言课程设计:鼠标操作绘制图案”的项目中,我们将深入探讨如何利用汇编语言来实现图形用户界面中的基本交互功能,即通过鼠标操作来绘制图案。 首先,我们要理解的是汇编语言的基本概念。汇编语言使用...

Global site tag (gtag.js) - Google Analytics