示例程序:

#include <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);
// ================================== //
// ---------- 全局变量声明 ----------- //
Rect g_rectangle;
bool g_bDrawingBox = false;
RNG g_rng();
// ================================== //
int main()
{
g_rectangle = Rect(-/*x*/, -/*y*/, /*width*/, /*height*/); // Rect_<_Tp>::Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height): x(_x), y(_y), width(_width), height(_height) {}
Mat srcImage(, , CV_8UC3),tempImage;
srcImage.copyTo(tempImage);
srcImage = Scalar::all(); // 设置鼠标操作回调函数
namedWindow(WINDOW_NAME);
setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);
//程序主循环,当进行绘制的标识符为真的时候,进行绘制
while ()
{
srcImage.copyTo(tempImage); // 复制原图像到临时变量
if (g_bDrawingBox)DrawRectangle(tempImage, g_rectangle); // 当进行绘制的标识符为真,则进行绘制
imshow(WINDOW_NAME, tempImage);
if (waitKey() == ) break;
}
return ;
}
// ----------- 子函数的定义部分 -------------- //
// on_MouseHandle() 函数,
//描述:鼠标回调函数,根据不同的鼠标事件进行不同的操作
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_rectangle.width = x - g_rectangle.x;
g_rectangle.height = y - g_rectangle.y;
}
}
break;
// 左键按下消息
case EVENT_LBUTTONDOWN:
{
g_bDrawingBox = true;
g_rectangle = Rect(x, y, , ); // 记录起始点
}
break;
case EVENT_LBUTTONUP:
{
g_bDrawingBox = false; // 置标识符为false
// 对宽和高小于0的处理
if (g_rectangle.width < )
{
g_rectangle.x += g_rectangle.width;
g_rectangle.width *= -;
}
if (g_rectangle.height < )
{
g_rectangle.y += g_rectangle.height;
g_rectangle.height *= -;
}
//调用函数进行绘制
DrawRectangle(image, g_rectangle);
}
break;
default:
break;
}
}
// 自定义的矩形绘制函数
void DrawRectangle(cv::Mat& img, cv::Rect box)
{
rectangle(img, box.tl(), box.br(), Scalar(g_rng.uniform(, ), g_rng.uniform(, ), g_rng.uniform(, )));
}

  

opencv:鼠标操作的更多相关文章

  1. opencv鼠标操作及GUI矩形绘画

    OpenCV的鼠标操作是通过一个中介函数配合回调函数来实现的.指定鼠标操作消息回调函数的函数为SetMouseCallback. void setMouseCallback(const string& ...

  2. 如何用OpenCV跟踪鼠标操作

    转载:如何用OpenCV跟踪鼠标操作 http://blog.skyoung.org/2014/05/01/how-to-track-mouse/ 在视频第一帧手动标记出目标的位置是在线视觉跟踪中最基 ...

  3. opencv —— setMouseCallback 响应鼠标操作事件

    鼠标操作:setMouseCallback 函数 借助回调函数,实现对鼠标每次操作的相应,即每进行一步鼠标操作,都会执行一次回调函数. void setMouseCallback(const stri ...

  4. OpenCV——图像的载入、显示、输出到文件和滑动条、鼠标操作

    图像的载入.显示.输出到文件和滑动条 滑动条 示例: 鼠标操作

  5. HighGUI图形图像界面初步——鼠标操作

    OpenCV中的鼠标操作和滑动条的消息映射方式很类似,都是通过一个中介函数配合一个回调函数来实现的,创建和指定滑动条回调函数为createTrackbar, 而指定鼠标操作消息回调函数的函数为setM ...

  6. Python模拟键盘输入和鼠标操作

    Python模拟键盘输入和鼠标操作 一.Python键盘输入模拟: import win32api import win32con win32api.keybd_event(17,0,0,0)  #c ...

  7. c# 鼠标操作

    1#region 3using System; 4using System.Runtime.InteropServices; 6#endregion 8namespace Windows.Forms. ...

  8. WPF 中模拟键盘和鼠标操作

    转载:http://www.cnblogs.com/sixty/archive/2009/08/09/1542210.html 更多经典文章:http://www.qqpjzb.cn/65015.ht ...

  9. python selenium-webdriver 元素操作之鼠标操作(四)

    上节内容主要说明了元素的定位,本节内容说要说对元素的操作,元素的操作分为两部分一部分是鼠标的操作,另一种是对键盘对元素的操作,下面我们主要讲解一下鼠标对元素的操作. webdriver 模块中几种比较 ...

随机推荐

  1. redis中默认有多少个哈希槽?

    Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余 ...

  2. 【我的Android进阶之旅】Android Studio查看Logcat时,如果一行Log太长如何换行显示?

    使用Android Studio一段时间了,还有很多小技巧没有掌握.今天又发现了一个比较好用的小技巧,这里分享出来. 1.Android Studio默认显示效果 比如我们用Logcat来查看打印的L ...

  3. 我的Android进阶之旅------>如何解决Android 5.0中出现的警告: Service Intent must be explicit:

    我的Android进阶之旅-->如何解决Android 5.0中出现的警告: java.lang.IllegalArgumentException: Service Intent must be ...

  4. 安装指定版本的Ionic或Cordova(转载)

    安装ionic 及 cordova npm install -g cordova ionic 更新命令 npm update -g cordova ionic 安装特定版本 npm install - ...

  5. 吴超老师课程--Hbase Shell

    hbase提供了一个shell的终端给用户交互 名称 命令表达式 创建表 create '表名称', '列族名称1','列族名称2','列族名称N' 添加记录 put '表名称', '行名称', '列 ...

  6. linux网络基础设置 以及 软件安装

    ifconfig #查看所有已激活的网卡信息 临时配置 #yum install net-tools -y 默认ifconfig是没有安装的,可能需要安装 ifconfig eth0 #查看单独一块网 ...

  7. java 偏向锁怎么升级为轻量级锁

    因为偏向锁,锁住对象时,会写入对象头相应的标识,我们先把对象头(官方叫法为:Mark Word)的图示如下(借用了网友的图片): 通过上面的图片,我们可以知道,对象处于偏向锁时,mark word中的 ...

  8. Ubuntu启动文件破坏启动恢复方法

    reboot后主机登录显示如下图: 解决步骤: 1.fs0:(回车) 2.edit startup.nsh 3.添加下面字段: fs0: cd EFI/ubuntu grubx64.efi 4.重启即 ...

  9. MySQL引擎及选择

    一.MySQL的存储引擎 完整的引擎说明还是看官方文档:http://dev.mysql.com/doc/refman/5.6/en/storage-engines.html 这里介绍一些主要的引擎 ...

  10. kafka入门使用

    kafka版本0.11.0.1以上自带zookeeper,必须要求环境中有jdk,解压后进入目录 1.在kafka解压目录下下有一个config的文件夹,里面放置的是我们的配置文件 consumer. ...