OpenCV鼠标滑轮事件
鼠标的滑轮事件实现图像的缩放很方便,具体在回调函数中如下写:
其中scale可以在外部定义为全局变量,通过响应CV_EVENT_MOUSEWHEEL滑轮事件获取Scale的具体值。
获取Scale值需要关注两个问题,滑轮滑动的方向和滑动量的大小。滑动方向通过getMouseWheelDelta(flags)获取,当返回值>0时,表示向前滑动;当返回值<0时,表示向后滑动。滑动量根据滑动方向自行设置相应的滑动步长即可。
void onMouse(int event, int x, int y, int flags, void* )
{double value;float step=0.02;switch (event){case CV_EVENT_MOUSEWHEEL:value = getMouseWheelDelta(flags);if (value>0)scale +=step;else if(value<0)scale -=step;break;default:break;}
}
下面是简单编写的滑动滑轮实现图像的缩放操作代码:
#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;float scale=1.0;void zoomInAndOut(const float scale, const Mat srcImg, Mat &dstImg)
{Mat M=Mat::eye(3,3,CV_32FC1);int imgHeight=srcImg.rows;int imgWidth=srcImg.cols;uchar* pSrcData = (uchar*)srcImg.data;uchar* pDstData = (uchar*)dstImg.data;Point2f center(imgWidth / 2.0, imgHeight / 2.0);//计算仿射矩阵M.at<float>(0, 0) = scale;M.at<float>(0, 2) = (1 - scale)*center.x;M.at<float>(1, 1) = scale;M.at<float>(1, 2) = (1 - scale)*center.y;float a11 = M.at<float>(0, 0);float a12 = M.at<float>(0, 1);float a13 = M.at<float>(0, 2);float a21 = M.at<float>(1, 0);float a22 = M.at<float>(1, 1);float a23 = M.at<float>(1, 2);float a31 = M.at<float>(2, 0);float a32 = M.at<float>(2, 1);float a33 = M.at<float>(2, 2);float bx = a11*a22 - a21*a12;float by = a12*a21 - a11*a22;if ( abs(bx) > 1e-3 && abs(by) > 1e-3){bx = 1.0 / bx;by = 1.0 / by;float cx = a13*a22 - a23*a12;float cy = a13*a21 - a23*a11;for (int j =0; j < imgHeight; j++){for (int i = 0; i < imgWidth; i++){float u = (a22*i - a12*j - cx) *bx;float v = (a21*i - a11*j - cy) *by;int u0 = floor(u);int v0 = floor(v);int u1 = floor(u0 + 1);int v1 = floor(v0 + 1);if (u0 >= 0 && v0 >= 0 && u1 < imgWidth && v1 < imgHeight){float dx = u - u0;float dy = v - v0;float weight1 = (1 - dx)*(1 - dy);float weight2 = dx*(1 - dy);float weight3 = (1 - dx)*dy;float weight4 = dx*dy;for (int k=0; k<srcImg.channels(); k++){pDstData[j*imgWidth * 3 + i * 3 + k] = weight1*pSrcData[v0*imgWidth * 3 + u0 * 3 + k] +weight2*pSrcData[v0*imgWidth * 3 + u1 * 3 + k] +weight3*pSrcData[v1*imgWidth * 3 + u0 * 3 + k] +weight4*pSrcData[v1*imgWidth * 3 + u1 * 3 + k];}}else{for (int k=0; k<srcImg.channels(); k++){pDstData[j*imgWidth * 3 + i * 3 + k] = 0;}}}}}
}void onMouse(int event, int x, int y, int flags, void* )
{double value;float step=0.02;switch (event){case CV_EVENT_MOUSEWHEEL:value = getMouseWheelDelta(flags);if (value>0)scale +=step;else if(value<0)scale -=step;break;default:break;}
}void main()
{string imgPath="data/source_images/";Mat srcImg = imread(imgPath+"moon.jpg");pyrDown(srcImg, srcImg);pyrDown(srcImg, srcImg);Mat dstImg = srcImg.clone();dstImg.setTo(0);string windowName="showImg";namedWindow(windowName);imshow(windowName, srcImg);waitKey(10);setMouseCallback(windowName, onMouse, NULL);float scaleMin=0.5;float scaleMax=2;while (true){scale = (scale<scaleMin)? (scaleMin): scale;scale = (scale>scaleMax)? (scaleMax): scale;zoomInAndOut(scale, srcImg, dstImg);imshow(windowName, dstImg);waitKey(10);}
}
OpenCV鼠标滑轮事件相关推荐
- html鼠标滑轮事件,js鼠标滚轮上下滚动监听事件应用实例(跨浏览器,亲测)
最近做项目涉及到多个DIV切换效果,包括普通按钮点击切换和鼠标滚轮上下滚动切换等:其主要涉及到的内容就是鼠标滚轮上下切换的事件监听,在此记录一下:也希望能帮到各位有需要的朋友. 以下为项目实例: $( ...
- qt界面中禁用某个控件的鼠标滑轮事件
主要思想就是:当进入滑轮的滚动事件的时候,就禁用该控件,而进入鼠标点击事件的时候,就将这个控件进行激活 如:spinBox控件,鼠标的过滤事件可以参考博客:https://blog.csdn.net/ ...
- JS监听鼠标滑轮事件
上才艺 var box = document.getElementById('box');function onMouseWheel(ev) {var ev = ev || window.event; ...
- C#——检测鼠标滑轮事件
private void Form1_Load(object sender, EventArgs e){this.MouseWheel += new MouseEventHandler(Form1_M ...
- 滚动条响应鼠标滑轮事件实现上下滚动的js代码
<script type="text/javascript"> var scrollFunc=function(e){ e=e || window.event; if( ...
- Vue中禁止鼠标滑轮事件
可以通过mousewheel.prevent来执行该事件 因为我只有一个页面,所以我直接在大盒子里调用 <div class="allcontent" @mousewheel ...
- vue 组件封装 | s-fullpage 全屏滚动 (内含绑定鼠标滑轮滚动事件、避免鼠标滑轮连续滚动、滑动过渡动画等实用技巧)
目录 目标 实现原理(要点) 完整代码 s-fullpage 和 s-fullpageItem s-fullpage.vue s-fullpageItem.vue 使用范例 范例效果 目标 实现类似插 ...
- Python,OpenCV鼠标事件进行矩形、圆形的绘制(随机颜色、随机半径)
Python,OpenCV鼠标事件进行矩形.圆形的绘制(随机颜色.随机半径) 1. 效果图 2. 源码 参考 这篇博客将介绍鼠标事件,并介绍鼠标事件矩形.圆形的绘制: 所有的鼠标事件(左键按下.左键释 ...
- OpenCV鼠标事件和滑动条事件
鼠标事件 ① 鼠标事件是通过传统的回调函数机制来完成. void your_mouse_callback(int event, int x, int y, int flags, void* param ...
最新文章
- Linux下内存问题检测神器 valgrind
- 五个你绝不可忽视的HTML5特性
- HDU - 7028 Decomposition 无向完全图构造欧拉回路
- Github | 标星3W+ ! Face Recognition世界上最简洁的人脸识别库!
- P1280 尼克的任务
- Linux lamp环境验证码无法显示
- Windows下SVN备份脚本
- 爬虫单个ip代理设置_代理IP是怎么帮助爬虫持续工作的
- HTTP URL长度限制
- 科研计算机视觉常用绘图软件,科研图形处理——除了R、Graphpad外,这款软件也不要错过哦!...
- 时延估计器的蒙特卡洛仿真分析
- 龙芯2F笔记本安装gentoo系统
- 蓝牙 UUID 解释
- 观点 | 如何让智慧城市这头巨象跳芭蕾?
- 解决阿里云ESC启动kube-proxy服务时出现错误 亲测有效
- 天嵌E9开发板tftp烧录eMMC教程(Android)
- 【Python学习】数据归一化Scaling与标准化Normalization间的区别与相关实现
- 服务器虚拟成多人同时使用,同一台云服务器多人同时登录吗
- 《PTA——拼题A》之第1012题
- Big-man与PHP的交战(一)——阅读PHP代码
热门文章
- 组织结构图用什么做最简单?树图网组织结构图在线制作简单又漂亮
- You called this URL via POST, but the URL doesn't end in a slash and you hav。。。
- AIIA开发者大会——百度·产业AI技术公开课
- HTML期末作业-基于HTML+CSS+JavaScript制作学生信息管理系统模板
- 三星为企业服务器开发高性能PCIe 5.0固态硬盘;阳狮集团升任张珲杰为明思力中国董事总经理 | 全球TMT...
- Effie:沉浸写作,创造价值
- 自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 Noisy relationships
- UBLOX板卡基础设置--F9P板卡配置(基准站和流动站)
- #20 ifconfig、route、netstat、ip、ss命令详解与修改主机名与网卡配置文件
- 一进制存在吗?为什么?