#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);//-----------------------------------【全局变量声明部分】-----------------------------------
//      描述:全局变量的声明
//-----------------------------------------------------------------------------------------------
Rect g_rectangle;
bool g_bDrawingBox = false;//是否进行绘制
RNG g_rng(12345);//-----------------------------------【main( )函数】--------------------------------------------
//      描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-------------------------------------------------------------------------------------------------
int main(int argc, char** argv)
{//【1】准备参数g_rectangle = Rect(-1, -1, 0, 0);Mat srcImage(600, 800, CV_8UC3), tempImage;srcImage.copyTo(tempImage);g_rectangle = Rect(-1, -1, 0, 0);srcImage = Scalar::all(0);//【2】设置鼠标操作回调函数namedWindow(WINDOW_NAME);setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);//【3】程序主循环,当进行绘制的标识符为真时,进行绘制while (1){srcImage.copyTo(tempImage);//拷贝源图到临时变量if (g_bDrawingBox) DrawRectangle(tempImage, g_rectangle);//当进行绘制的标识符为真,则进行绘制imshow(WINDOW_NAME, tempImage);if (waitKey(10) == 27) break;//按下ESC键,程序退出}return 0;
}//--------------------------------【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, 0, 0);//记录起始点}break;//左键抬起消息case EVENT_LBUTTONUP:{g_bDrawingBox = false;//置标识符为false//对宽和高小于0的处理if (g_rectangle.width < 0){g_rectangle.x += g_rectangle.width;g_rectangle.width *= -1;}if (g_rectangle.height < 0){g_rectangle.y += g_rectangle.height;g_rectangle.height *= -1;}//调用函数进行绘制DrawRectangle(image, g_rectangle);}break;}
}//-----------------------------------【DrawRectangle( )函数】------------------------------
//      描述:自定义的矩形绘制函数
//-----------------------------------------------------------------------------------------------
void DrawRectangle(cv::Mat& img, cv::Rect box)
{cv::rectangle(img, box.tl(), box.br(), cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//随机颜色
}

opencv 鼠标的使用相关推荐

  1. Python,OpenCV鼠标事件进行矩形、圆形的绘制(随机颜色、随机半径)

    Python,OpenCV鼠标事件进行矩形.圆形的绘制(随机颜色.随机半径) 1. 效果图 2. 源码 参考 这篇博客将介绍鼠标事件,并介绍鼠标事件矩形.圆形的绘制: 所有的鼠标事件(左键按下.左键释 ...

  2. opencv鼠标操作,画矩形

    opencv鼠标操作,画矩形 效果图 主要两个函数在作用 //-------------------全局函数声明部分------------------------- //描述:全局函数的声明 //- ...

  3. Day 2 - Opencv 鼠标事件回调并在图像上显示像素值

    Day 2 - Opencv 鼠标事件回调并在图像上显示像素值 #include <highgui.hpp> #include <opencv.hpp> #include &l ...

  4. openCV鼠标事件实例

    1.原理 OpenCV的鼠标事件主要涉及两个函数: 回调函数cvSetMouseCallback void cvSetMouseCallback( const char* window_name, C ...

  5. OpenCV鼠标事件和滑动条事件

    鼠标事件 ① 鼠标事件是通过传统的回调函数机制来完成. void your_mouse_callback(int event, int x, int y, int flags, void* param ...

  6. opencv 鼠标事件

    import cv2 as cv events = [i for i in dir(cv) if 'EVENT' in i] print( events ) # 打印所有的鼠标事件 import nu ...

  7. python opencv 截取矩形区域_python+OpenCV 鼠标交互图片切割矩形区域

    about 本文参考了: 不用鼠标交互,手动设参 先来个热身运动的先,直接手动设参选择.一个要点就是把一个RGB图片看成一个3维的数组. import cv2 def main(): org = cv ...

  8. OpenCV————鼠标绘制和滑动条

    导入包 import cv2 import numpy as np 可以通过下面的代码来查看所有的鼠标事件函数 events=[i for i in dir(cv2) if 'EVENT' in i] ...

  9. OpenCV鼠标滑轮事件

    鼠标的滑轮事件实现图像的缩放很方便,具体在回调函数中如下写: 其中scale可以在外部定义为全局变量,通过响应CV_EVENT_MOUSEWHEEL滑轮事件获取Scale的具体值. 获取Scale值需 ...

  10. opencv 鼠标绘图

    程序如下: // 17MouseDraw.cpp : 定义控制台应用程序的入口点. //鼠标绘图,按下'r'键可以重新绘图,按下's'键则保存图片到磁盘中 #include "stdafx. ...

最新文章

  1. 面试官:缓存穿透、缓存雪崩和缓存击穿是什么?
  2. linux 定时运行脚本_教你如何在Linux下让Python脚本自启动和定时启动
  3. POST教程笔记 - WinHttp获取网页源码
  4. 一文看懂专有网络和交换机的定义及关系
  5. 138 张图带你 MySQL 入门!
  6. 方舟编译器编译linux,方舟编译器环境配置
  7. Caffe(13)--(SSRNet模型)Keras转Caffe教程
  8. C#生成Excel出现8000401a的错误的另一种解决办法。
  9. linux limbo镜像文件下载,limbo 2000镜像下载
  10. Booth算法笔算快捷方式
  11. 卡诺模型案例分析_KANO模型案例分析---来自58学车
  12. 等保合规 等保监测 等保合规评测
  13. 图像处理公共数据库下载地址集锦
  14. 复古传奇服务器维护时间,复古传奇手游刷怪时间
  15. 微信跨公众号进行支付
  16. mtd nandflash 分析
  17. 类型萃取类型检查 Type-Traits LibraryType Checks --- C++20
  18. layui开启表格头部工具栏不显示的问题
  19. XenServer中本地磁盘管理
  20. 浙江大学求是科学班计算机,浙大校友网

热门文章

  1. java关于排版的说法正确是_Java代码规范--排版,命名---以及一个例子
  2. 在linux上配置telnet服务器,Ubuntu 10.10 下配置Telnet服务器
  3. java基础试题_Java基础测试题带答案
  4. 博图能打开s7200吗_脚上有一个穴位,能帮你打开任督二脉,是真的吗?
  5. 为何要学习 Linux?
  6. Mysql:如何使用limit
  7. Android登陆界面实现-支持输入框清楚和震动效果功能
  8. 作为一个程序员,数学对你到底有多重要
  9. Linux 简单架设防火墙路由器
  10. 洛谷 P1168 中位数(优先队列)