示例程序:

#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. DotNetBar.Bar图标列表的使用

    DotNetBar.Bar图标列表的使用 老帅 控件DevComponents.DotNetBar.Bar怎样使用图像列表呢?比方给工具条或者菜单加上图标.例如以下几步就可以! 方法1: 1.放一个S ...

  2. Linux命令之pip

    使用pip进行install,sudo pip install xxx 使用pip进行update,sudo pip install --update xxx 使用pip设置超时时间,sudo pip ...

  3. windows下的Mysql安装与基本使用(zip)

    一.安装过程 Mysql社区版下载地址:http://dev.mysql.com/downloads/mysql/ --注意,已管理员身份运行cmd.exe,很重要!!目录在,c:\windows\s ...

  4. Typecho部署安装

    此文章已经在这里上. 如果您看到这篇文章,表示您的 blog 已经在digitalocean.com安装成功.下面说下安装的步骤,此文章都是在digitalocean.com的centos上成功安装: ...

  5. appcmd应用

    appcmd资料: http://www.jb51.net/article/36024.htm 官方文档:https://docs.microsoft.com/zh-cn/iis/get-starte ...

  6. oracle 创建视图、修改视图、删除视图、利用视图操作基本表

    转:http://blog.sina.com.cn/s/blog_6b58d2fa0100rgvw.html 1.使用create or replace view命令创建视图 语法格式: create ...

  7. <context:annotation-config/> 的理解

    转载:http://www.cnblogs.com/iuranus/archive/2012/07/19/2599084.html 当我们需要使用BeanPostProcessor时,直接在Sprin ...

  8. Microservice 概念

    一天我司招财猫姐(HR 大人)问我,你给我解释一下 Microservice 是什么吧.故成此文.一切都是从一个创业公司开始的. 故事 最近的创业潮非常火爆,我禁不住诱惑也掺和了进去,创建了一家公司. ...

  9. CAS单点登录的原理

    1.首先了解几个概念 1).TGC:Ticket-granting cookie,存放用户身份认证凭证的cookie,在浏览器和CAS Server间通讯时使用.2).TGT:ticket grant ...

  10. Oracle 集合操作

    在 Oracle 中提供了三种类型集合操作:并(UNION).交(INTERSECT).差(MINUS) · UNION:将多个查询的结果组合到一个查询结果之中,没有重复内容 · UNION ALL: ...