首页 > 编程语言 >C++,OpenCV鼠标操作(8)

C++,OpenCV鼠标操作(8)

时间:2023-04-10 16:02:11浏览次数:44  
标签:pshape 鼠标 int void C++ OpenCV DrawShape EVENT

鼠标事件响应

void setMouseCallback(const String& winname, MouseCallback onm ouse, void* userdata = 0);
/*******************************************************************
*			winname: 			监听窗口名称
*			onMouse:			鼠标事件回调函数
*			userdata:			递给回调函数的可选参数
*********************************************************************/

鼠标事件回调函数

typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);
//MouseCallback onm ouse
void onm ouse(int event,int x,int y,int flag,void *param)
/*******************************************************************
*			event: 			事件类型
*			x:				鼠标所在图像的坐标
*			y:				
*		    flags:			代表拖拽事件
*			param:			自己定义的onMouse事件的ID
*********************************************************************/    

鼠标事件类型

enum MouseEventTypes {
       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 	//鼠标滚轮 正数和负数分别表示向右和向左滚动  
     };

鼠标拖拽类型

enum MouseEventFlags {
       EVENT_FLAG_LBUTTON   = 1,    //左键拖动
       EVENT_FLAG_RBUTTON   = 2, 	//右键拖动
       EVENT_FLAG_MBUTTON   = 4, 	//中键拖动
       EVENT_FLAG_CTRLKEY   = 8, 	//ctr拖动
       EVENT_FLAG_SHIFTKEY  = 16,	//shift拖动
       EVENT_FLAG_ALTKEY    = 32 	//alt拖动
     };

综合代码

//Opencv鼠标左键画圆,右键画方
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class DrawShape 
{
public:
	DrawShape() :mat(imread("mm.jpg")) {}
	void Show(string wName = "drawShape") 
	{
		imshow(wName, mat);
	}
	void DrawCircle(int x = 300, int y = 300, int r = 10) 
	{
		circle(mat, Point(x, y), r, Scalar(0, 255, 0));
	}
	void DrawRecagnle(int x = 200, int y = 200, int w = 40, int h = 40) 
	{
		rectangle(mat, Rect(x, y, w, h), Scalar(255, 0, 0));
	}
	static void onm ouse(int event, int x, int y, int flag, void* param);
protected:
	Mat mat;
};
void DrawShape::OnMouse(int event, int x, int y, int flag, void* param)
{
	DrawShape* pshape = (DrawShape*)param;
	switch(event)
	{
	case EVENT_LBUTTONDOWN:
		cout << "左键按下......." << endl;
		pshape->DrawCircle(x,y,10);
		break;
	case EVENT_RBUTTONDOWN:
		cout << "右键按下......." << endl;
		pshape->DrawRecagnle(x-5,y-5,10,10);
		break;
	}
}
int main() 
{
	DrawShape* pshape = new DrawShape;
	namedWindow("drawShape");
	setMouseCallback("drawShape", &DrawShape::OnMouse, pshape);
	//主循环
	while (1) 
	{
		pshape->Show();
		if (waitKey(10) == 27) 
		{
			break;
		}
	}
	delete pshape;
	pshape = nullptr;
	return 0;
}

标签:pshape,鼠标,int,void,C++,OpenCV,DrawShape,EVENT
From: https://blog.51cto.com/u_15959862/6181062

相关文章

  • c++ stdcall 方式与 C# 传递 struct 数据类型?
    usingnamespacestd;#include<iostream>#include<thread>#include<mutex>structMyStruct{char*myString;intlength;//othermembers};#ifdef__cplusplusextern"C"{#endif__declspec(dllexport)int_......
  • 《c++徒步》MFC篇——新建MFC项目
    VS2019安装MFC原文链接:https://blog.csdn.net/qq_36556893/article/details/899459431.打开vs安装程序2.选择VisualStudio扩展开发3.选择C++MFC生成工具(x86和x64)进行安装4.选择修改,等待安装VS2008新建MFC原文链接:https://www.likecs.com/show-454706.htmlVS2008......
  • c++中BOOL和bool的区别
    一:在网上找到了BOOL和bool的区别:1、类型不同BOOL为int型bool为布尔型2、长度不同bool只有一个字节BOOL长度视实际环境来定,一般可认为是4个字节3、取值不同bool取值false和true,是0和1的区别BOOL取值FALSE和TRUE,是0和非0的区别二:bool是标准C++数据类型,可取值true和false......
  • c++ 多线程摘记
    有没有linux和windows通用的多线程库?ChatGPT:是的,C++11标准引入了一个名为std::thread的多线程库,它可以在Windows和Linux上使用。std::thread库提供了一种方便的方式来创建和管理线程,包括启动、等待、终止和同步线程。此外,它还提供了一些便利的功能,例如线程局部存储......
  • C++派生类里析构函数和构造函数的调用顺序
    C++派生类里析构函数和构造函数的调用顺序1.定义一个哺乳类Mammal,在由此派生出狗类Dog,定义一个Dog类的对象,观察基类和派生类的构造函数与析构函数的调用顺序。#include<bits/stdc++.h>usingnamespacestd;classMammal{public: Mammal(){ cout<<"constructedM"<<e......
  • 《c++徒步》MFC篇——MFC基础知识
    MFC简介原文链接:https://www.cnblogs.com/zhouwanqiu/p/6914090.html1、什么是MFC?全称:MicrosoftFoundationClassLibrary(微软基础类库)1-MFC从硬盘存在形式来说就是一个库(静态MFC库、动态MFC库)2-MFC从原理来说还是一个程序框架2、为什么使用MFC?基于框架编程,提高工作效......
  • c++遍历容器元素
    for(autoi:v)遍历容器元素1.auto2.auto&3.constauto&4.constautoC++11新增了一种循环:基于范围(range-based)的for循环。这简化了一种常见的循环任务:对数组(或容器类,如vector和array的每个元素执行相同的操作,如下例所示:doubleprices[5]={4.99,10.99,6......
  • C++标准输入输出
    一、问题引入关于C和C++的输入输出区别,虽然在C++中仍然可以使用scanf和printf,但建议使用cin和cout。虽然使用不同的函数得到的结果一样,但仔细检测发现,cin和cout没有格式控制符了,意味着输入更简单了二、解决过程#include<iostream>usingnamespacestd;intmain(......
  • C++指针
    指针指针的基本概念1、指针的作用:可以通过指针间接访问内存(指针就是内存地址)内存编号是从0开始记录的,一般用16进制数字表示可以利用指针变量保存地址指针变量定义的语法#include<iostream>usingnamespacestd;intmain(){ //1、定义指针 inta=10......
  • C++-Ubuntu core dumped(核心已转储)-GDB调试
    C++-Ubuntucoredumped(核心已转储)-GDB调试Linux的可执行程序异常退出时,提示“核心已转储”。此时需要系统生成core文件,并通过GDB调试以确定问题。https://blog.csdn.net/scjdas/article/details/128585787设置系统生成core文件用ulimit-a查看corefilesize项是否......