鼠标事件

① 鼠标事件是通过传统的回调函数机制来完成。

void your_mouse_callback(int event, int x, int y, int flags, void* param)

其中,第一个参数要指明事件,第二个和第三个参数是鼠标事件的位置,第四个参数是标志位,第五个参数是一个void类型的指针,可用于传递额外的信息。

鼠标事件类型
事件 数值 含义
cv::EVENT_MOUSEMOVE 0 鼠标移动事件
cv::EVENT_LBUTTONDOWN 1 鼠标左键按下事件
cv::EVENT_RBUTTONDOWN 2 鼠标右键按下事件
cv::EVENT_MBUTTONDOWN 3 鼠标中键按下事件
cv::EVENT_LBUTTONUP 4 鼠标左键释放事件
cv::EVENT_RBUTTONUP 5 鼠标右键释放事件
cv::EVENT_MBUTTONUP 6 鼠标中键释放事件
cv::EVENT_LBUTTONBLCLK 7 鼠标左键双击事件
cv::EVENT_RBUTTONBLCLK 8 鼠标右键双击事件
cv::EVENT_MBUTTONBLCLK 9 鼠标中键双击事件
cv::EVENT_MOUSEWHEEL 10 滑动滚轮上下滚动
cv::EVENT_MOUSEHWHEEL 11 滑动滚轮左右滚动
鼠标事件标志
标志 数值 含义
cv::EVENT_FlAG_LBUTTON 1 指示鼠标左键已关闭。
cv::EVENT_FlAG_RBUTTON 2 指示鼠标右键已关闭。
cv::EVENT_FlAG_MBUTTON 4 指示鼠标中键已关闭。
cv::EVENT_FlAG_CTRLKEY 8 指示CTRL键被按下。
cv::EVENT_FlAG_SHIFTKEY 16 指示SHIFT键被按下。
cv::EVENT_FlAG_ALTKEY 32 指示ALT键被按下。

② 在定义完回调函数后需要注册该回调函数。

void cv::setMouseCallback(const string& windowName, cv::MouseCallback on_mouse, void* param=NULL)

其中,第一个参数是回调函数作用的窗口名称,第二个参数是要注册的回调函数,第三个是要给回调函数传递的特定信息。

#include "stdafx.h"
#include <opencv2/opencv.hpp>// 定义回调函数
void my_mouse_callback(int event, int x, int y, int flags, void* param);cv::Rect box;
bool drawing_box = false;// 在图像上画一个方框的子程序
void draw_box(cv::Mat& img, cv::Rect box) {cv::rectangle(img, box.tl(), box.br(), cv::Scalar(0x00, 0x00, 0xff));
}void help() {std::cout << "Call: ./ch4_ex4_1\n" << "show how to use a mouse to draw regions in an image." << std::endl;
}int main()
{help();box = cv::Rect(-1, -1, 0, 0);cv::Mat image(200, 200, CV_8UC3);cv::Mat temp;image.copyTo(temp);box = cv::Rect(-1, -1, 0, 0);image = cv::Scalar::all(0);cv::namedWindow("Box Example");// 注册回调函数cv::setMouseCallback("Box Example", my_mouse_callback, (void*)&image);for (;;){image.copyTo(temp);if (drawing_box){draw_box(temp, box);}cv::imshow("Box Example", temp);if (cv::waitKey(15) == 27){break;}}cv::destroyWindow("Box Example");return 0;
}void my_mouse_callback(int event, int x, int y, int flags, void* param) {cv::Mat& image = *(cv::Mat*) param;switch (event) {// 鼠标移动时间,实现左键按下时随鼠标位置改变实时绘图case cv::EVENT_MOUSEMOVE: {if (drawing_box){   box.width = x - box.x;box.height = y - box.y;}}break;// 鼠标左键按下时间,定起点case cv::EVENT_LBUTTONDOWN: {drawing_box = true;box = cv::Rect(x, y, 0, 0);}break;// 鼠标左键释放事件,绘制图像case cv::EVENT_LBUTTONUP: {drawing_box = false;if (box.width < 0){box.x += box.width;box.width *= -1;}if (box.height < 0){box.y += box.height;box.height *= -1;}draw_box(image, box);}break;}
}

运行结果:

滑动条、滚动条和开关

① 创建一个滑动条

int cv::createTrackbar(const string& trackbarName, const string& windowName, int* value, int count, cv::TrackbarCallback onChange, void* param)

其中:第一个参数是滑动条名称,第二个参函数是将要添加到的父窗口的名称,第三个参数是指向整数的指针,这个整数值会随着滑动钮的移动自动变化,第四个参数是滑动条可以滑动的最大值,第五个参数是回调函数,最后一个参数是传给回调函数的参数。

② 可获取或设置滑动条的位置值

int cv::getTrackbarPos(const string& trackbarName, const string& windowName)

void cv::setTrackbarPos(const string& trackbarName, const string& windowName, int pos)

③ 开关功能

开关是只有两个位置的滚动条,当它处于“开”状态的时候为1, 处于“关”状态的时候为0。

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>using namespace std;int g_switch_value = 1;
void switch_off_function() {cout << "Pause\n";
}void switch_on_function(){cout << "run\n";
}void switch_callback(int position, void*) {if (position == 0){switch_off_function();}else{switch_on_function();}
}void help() {cout << "Call: my.avi" << endl;cout << "Shows putting a pause button in a video." << endl;
}
// 使用滚动条来创建一个“开关”,用来控制视频的播放功能
int main()
{cv::Mat frame;cv::VideoCapture g_capture;g_capture.open("D:\\mgtv\\123.mp4");help();cv::namedWindow("example", 1);cv::createTrackbar("switch", "example", &g_switch_value, 1, switch_callback);for (;;){if (g_switch_value){g_capture >> frame;if (frame.empty()){break;}cv::imshow("example", frame);}if (cv::waitKey(10) == 27){break;}}cv::destroyWindow("example");return 0;
}

OpenCV鼠标事件和滑动条事件相关推荐

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

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

  2. opencv给图片加滑动条调节窗口大小

    起因:最近对图片进行截取矩形区域操作时,发现了opencv一个很蛋痛的地方,使用imshow()函数展示图片的时候,一旦图片的分辨率过高,就不能完全显示.要是调整参数为WINDOWSIZE_NORMA ...

  3. python opencv Intel Realsense 使用滑动条调整图片的曝光率

    # -*- coding: utf-8 -*- """ @File : 200113:测试跟踪条tracebackbar().py @Time : 2020/1/13 9 ...

  4. OpenCV学习笔记:反色显示图片、鼠标事件、键盘事件和窗口滑动条操作

    环境CentOS7 g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-16) $ pkg-config --modversion opencv 2.4.13 参照< ...

  5. HighGUI图像用户界面初步(滑动条、鼠标操作)

    文章目录 1.Mat类简析 2.图像的载入:imread()函数 3.图像的显示:imshow()函数 4.创建窗口:namedWindow()函数 5.输出图像到文件:imwrite()函数 6.综 ...

  6. openCV滑动条TrackBar事件实例

    1.原理 函数原型: int createTrackbar( const string& trackname, const string& winname, int *value, i ...

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

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

  8. 获取滑动条位置,动态调整对话框显示位置;为动态添加的button添加click事件

    1.获取滑动条位置,动态调整对话框显示位置 应用场景:页面上有三个按钮,所处位置高度不同,有的按钮需要移动滑动条才能看到,各个按钮点击后要弹出同一个对话框,为了保证对话框始终显示在当前视野的中央位置, ...

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

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

最新文章

  1. C++:随笔6---new\delete\虚方法\抽象方法
  2. 链表 -- 双向循环链表(线性表)
  3. ADF Jar包循环引用会出问题
  4. git钩子放服务器_如何在GitLab中添加服务器端的预接收钩子?
  5. 基于数据挖掘的旅游推荐APP(一):开篇
  6. VTK:Qt之RenderWindowNoUiFile
  7. appium+python自动化项目实战(二):项目工程结构
  8. Laravel中的env函数获取不到确定存在的配置
  9. 【未来已来】百度老板李彦宏:人工智能是下一道主菜
  10. 计算机的发展经历阶段应用领域,手机的发展经历了哪3个阶段?
  11. linux 安装wordpress
  12. 银行系统的开发精华1
  13. laravel之生成PDF文档-TCPDF
  14. javascript回调函数有什么用
  15. 计算机造句英语,电子计算机造句_造句大全
  16. STM32f4日记9之LD3320语音识别(您的私人语音助手MICRO)
  17. 委托、事件 茴字有几种写法
  18. 1. 批处理常用符号详解:
  19. 华为与复旦大学合作开发全国首个医学人工智能课程
  20. Matlab_逐步回归

热门文章

  1. MYSQL错误: ERROR 1205: Lock wait timeout exceeded(处理MYSQL锁等待)解决办法
  2. pandas object转float_25个Pandas实用技巧
  3. 别再搞纯文本了!多模文档理解更被时代需要!
  4. 美团NLP中心算法实习生内推啦!
  5. 【小马哥】Spring Cloud系列讲座
  6. 征稿 | Big Data Research 专刊(影响因子 2.95)
  7. 论文浅尝 | 时序与因果关系联合推理
  8. docker挂载文件躺过的坑
  9. Peacock:大规模主题模型及其在腾讯业务中的应用-2015
  10. Githug第42关rebase_onto通关秘籍