OpenCV鼠标事件和滑动条事件

鼠标事件

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

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

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

鼠标事件类型
事件数值含义
cv::EVENT_MOUSEMOVE0鼠标移动事件
cv::EVENT_LBUTTONDOWN1鼠标左键按下事件
cv::EVENT_RBUTTONDOWN2鼠标右键按下事件
cv::EVENT_MBUTTONDOWN3鼠标中键按下事件
cv::EVENT_LBUTTONUP4鼠标左键释放事件
cv::EVENT_RBUTTONUP5鼠标右键释放事件
cv::EVENT_MBUTTONUP6鼠标中键释放事件
cv::EVENT_LBUTTONBLCLK7鼠标左键双击事件
cv::EVENT_RBUTTONBLCLK8鼠标右键双击事件
cv::EVENT_MBUTTONBLCLK9鼠标中键双击事件
cv::EVENT_MOUSEWHEEL10滑动滚轮上下滚动
cv::EVENT_MOUSEHWHEEL11滑动滚轮左右滚动

 

鼠标事件标志
标志数值含义
cv::EVENT_FlAG_LBUTTON1指示鼠标左键已关闭。
cv::EVENT_FlAG_RBUTTON2指示鼠标右键已关闭。
cv::EVENT_FlAG_MBUTTON4指示鼠标中键已关闭。
cv::EVENT_FlAG_CTRLKEY8指示CTRL键被按下。
cv::EVENT_FlAG_SHIFTKEY16指示SHIFT键被按下。
cv::EVENT_FlAG_ALTKEY32指示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;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GSMA:中国有望成为全球领先的5G市场之一

来源&#xff1a;GSMA移动智库近日&#xff0c;GSMA&#xff08;全球移动通信协会&#xff09;发布首个《中国移动经济发展报告2019》。报告称&#xff0c;中国的移动生态系统在2018年为中国经济创造了5.2万亿元 (7,500亿美元) 的附加值&#xff0c;相当于2018年中国GDP的5.5%。…

canal —— 阿里巴巴mysql数据库binlog的增量订阅消费组件

阿里巴巴mysql数据库binlog的增量订阅&消费组件canal &#xff0c;转载自 https://github.com/alibaba/canal 最新更新 canal QQ讨论群已经建立&#xff0c;群号&#xff1a;161559791 &#xff0c;欢迎加入进行技术讨论。canal消费端项目开源: Otter(分布式数据库同步系统…

OpenCV的滤波与卷积

目录 预备知识 滤波、核和卷积 边界外推和边界处理 阈值化操作 Otsu算法 自适应阈值 平滑 简单模糊和方框型滤波器 中值滤波器 高斯滤波器 双边滤波器 导数和梯度 索贝尔导数 Scharr滤波器 拉普拉斯变换 图像形态学 膨胀和腐蚀 通用形态学函数 开操作和闭操…

中国科协发布20个重大科学问题和工程技术难题

来源&#xff1a;晓艳的科技坊6月30日&#xff0c;中国科协在第二十一届中国科协年会闭幕式上发布了2019年20个对科学发展具有导向作用、对技术和产业创新具有关键作用的前沿科学问题和工程技术难题。   中国科学院院士、中国科协名誉主席韩启德表示&#xff0c;中国科协重大…

OpenCV常见的图像变换

拉伸、收缩、扭曲和旋转 最简单的图像变换是调整图像大小&#xff0c;使其变大或变小。但实际操作时要比想象的复杂一些&#xff0c;因为调整大小带来了像素如何插值&#xff08;放大&#xff09;或合并&#xff08;减少&#xff09;的问题。 均匀调整 cv::resize() void c…

边缘计算对于工业物联网的重要性

来源&#xff1a;物联网世界随着物联网的发展&#xff0c;工业制造设备所产生的数据量将越来越多。如果这些数据都要放到云端处理&#xff0c;就需要无穷无尽的频谱资源、传输带宽和数据处理能力&#xff0c;“云”难免不堪重负&#xff0c;此时就需要边缘计算来分担云计算的压…

全新算法助机器学习抵抗干扰

来源&#xff1a;科技日报 机器学习模型受到攻击将产生严重的后果&#xff0c;但如果对这一情形提前预防呢&#xff1f;就像人类针对即将到来的病毒去接种疫苗一样。据澳大利亚联邦科学与工业研究组织&#xff08;CSIRO&#xff09;官方网站消息&#xff0c;该机构的一个研究团…

磁共振成像技术发展简史丨科学史

来源&#xff1a;中国科学院苏州生物医学工程技术研究所编者按&#xff1a;核磁共振是一种常见的影像检查方式。全球首次为病人做核磁共振检查是在1977年7月3日。该技术是基于物理学家拉比有关测量原子核在磁场中性质的研究发展而来的。拉比在1988年去世前不久&#xff0c;也使…

最先进的AI还不如动物聪明?首届AI-动物奥运会英国开赛!

来源&#xff1a;animalaiolympics,新智元【导读】目前&#xff0c;即使是最先进的AI智能体&#xff0c;在适应环境变化的能力方面&#xff0c;还无法与动物相提并论。听上去很不可思议对不对&#xff0c;不服来比比看&#xff1f;日前&#xff0c;动物-AI奥运会正式拉开帷幕&a…

background-size 兼容ie8以下浏览器的方法

filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(srcimgs/section-1.png, sizingMethodscale); -ms-filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(srcimgs/section-1.png, sizingMethodscale)";转载于:https://www.cnblogs.com/wend…

一文尽览5G全产业链及新机遇

来源&#xff1a;5G产业圈5G牌照的发放&#xff0c;对通信产业发展具有重要的战略意义。这不仅仅是为了5G商用&#xff0c;更赋予了多重目的。比如为了利用5G技术推动经济结构创新、促进经济增长、帮助华为中兴、结交爱立信诺基亚&#xff0c;分化高通英特尔……甚至可能是为了…

Windows10+Ubuntu 18.04.2+ROS 安装笔记(SSD单硬盘)上

Windows10Ubuntu 18.04.2ROS 安装笔记&#xff08;SSD单硬盘&#xff09;上一、前言二、化繁为简三、补充说明小结一、前言 最近需要学习ROS和python,于是便需要装Linux系统&#xff0c;于是选则了主流的 Ubuntu 18.04系统&#xff0c;同时与ROS 也是兼容性最好的系统。 之前…

实验室蒋田仔研究员:脑网络组图谱近10年研究详解【附PPT】

来源&#xff1a;模式识别国家重点实验室【导读】脑是人体最为复杂的器官&#xff0c;脑图谱是理解脑的结构和功能的基石。它为探索复杂的脑部结构和异常变化进行"导航"。因此&#xff0c;脑图谱绘制一直以来都是神经科学、认知科学、心理学和脑疾病研究的共同前沿领…

5G最完整的PPT

来源&#xff1a;云数据中心5G未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能&#xff0c;互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&a…

Windows10+Ubuntu 18.04.2+ROS 安装笔记(SSD单硬盘)下

Windows10Ubuntu 18.04.2ROS 安装笔记&#xff08;SSD单硬盘&#xff09;下一、前言二、化繁为简二、补充说明三、测试ROS 是否安装成功一、前言 最近需要学习ROS和python,于是便需要装Linux系统&#xff0c;于是选则了主流的 Ubuntu 18.04系统&#xff0c;同时与ROS 也是兼容…

了解宇宙万物的“第三种方法”​,人工智能正在改变科学

来源&#xff1a;quantamagazine编辑&#xff1a;张卓骏、luciana、笪洁琼、Aileen当今物理和天文实验所产生的海量信息&#xff0c;没有任何一个人或者团队可以完整的处理。有些实验数据每天以千兆字节的规模在增加——而且这个趋势只会越来越明显。想象一下&#xff0c;一台以…

pytorch的backward参数

首先&#xff0c;如果out.backward()中的out是一个标量的话&#xff08;相当于一个神经网络有一个样本&#xff0c;这个样本有两个属性&#xff0c;神经网络有一个输出&#xff09;那么此时我的backward函数是不需要输入任何参数的。 运行结果&#xff1a; 不难看出&#xff0c…

C#表格文字多收缩样式

C#表格文字多收缩样式 <style>.divOpen {height: 24px;overflow: hidden;} </style> ----------------- var html <div class"divOpen" οnclick"divClick(this)" style"cursor: pointer; min-width:100px;">;html value;ht…

意识的哲学、生理及智能属性研究

来源&#xff1a;人机与认知实验室摘要&#xff1a;意识问题一直是各个领域最棘手的难题。本文将从意识的哲学属性、意识的脑属性和意识的智能属性三个角度&#xff0c;分别研究意识研究领域中主要观点与所遇困境&#xff0c;并在文章最后介绍目前已有的意识理论与模型。关键字…

美国反垄断调查背后,硅谷科技巨头不为人知的“阴暗面”

来源&#xff1a;军工圈6月4日&#xff0c;美国众议院司法机构小组委员会负责人向媒体证实&#xff0c;美国政府准备对亚马逊、苹果、Facebook和谷歌4大科技巨头进行反垄断调查。据称&#xff0c;执行反垄断法的美国联邦贸易委员会&#xff08;以下简称FTC&#xff09;和美国司…