鼠标的滑轮事件实现图像的缩放很方便,具体在回调函数中如下写:

其中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鼠标滑轮事件相关推荐

  1. html鼠标滑轮事件,js鼠标滚轮上下滚动监听事件应用实例(跨浏览器,亲测)

    最近做项目涉及到多个DIV切换效果,包括普通按钮点击切换和鼠标滚轮上下滚动切换等:其主要涉及到的内容就是鼠标滚轮上下切换的事件监听,在此记录一下:也希望能帮到各位有需要的朋友. 以下为项目实例: $( ...

  2. qt界面中禁用某个控件的鼠标滑轮事件

    主要思想就是:当进入滑轮的滚动事件的时候,就禁用该控件,而进入鼠标点击事件的时候,就将这个控件进行激活 如:spinBox控件,鼠标的过滤事件可以参考博客:https://blog.csdn.net/ ...

  3. JS监听鼠标滑轮事件

    上才艺 var box = document.getElementById('box');function onMouseWheel(ev) {var ev = ev || window.event; ...

  4. C#——检测鼠标滑轮事件

    private void Form1_Load(object sender, EventArgs e){this.MouseWheel += new MouseEventHandler(Form1_M ...

  5. 滚动条响应鼠标滑轮事件实现上下滚动的js代码

    <script type="text/javascript"> var scrollFunc=function(e){ e=e || window.event; if( ...

  6. Vue中禁止鼠标滑轮事件

    可以通过mousewheel.prevent来执行该事件 因为我只有一个页面,所以我直接在大盒子里调用 <div class="allcontent" @mousewheel ...

  7. vue 组件封装 | s-fullpage 全屏滚动 (内含绑定鼠标滑轮滚动事件、避免鼠标滑轮连续滚动、滑动过渡动画等实用技巧)

    目录 目标 实现原理(要点) 完整代码 s-fullpage 和 s-fullpageItem s-fullpage.vue s-fullpageItem.vue 使用范例 范例效果 目标 实现类似插 ...

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

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

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

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

最新文章

  1. Linux下内存问题检测神器 valgrind
  2. 五个你绝不可忽视的HTML5特性
  3. HDU - 7028 Decomposition 无向完全图构造欧拉回路
  4. Github | 标星3W+ ! Face Recognition世界上最简洁的人脸识别库!
  5. P1280 尼克的任务
  6. Linux lamp环境验证码无法显示
  7. Windows下SVN备份脚本
  8. 爬虫单个ip代理设置_代理IP是怎么帮助爬虫持续工作的
  9. HTTP URL长度限制
  10. 科研计算机视觉常用绘图软件,科研图形处理——除了R、Graphpad外,这款软件也不要错过哦!...
  11. 时延估计器的蒙特卡洛仿真分析
  12. 龙芯2F笔记本安装gentoo系统
  13. 蓝牙 UUID 解释
  14. 观点 | 如何让智慧城市这头巨象跳芭蕾?
  15. 解决阿里云ESC启动kube-proxy服务时出现错误 亲测有效
  16. 天嵌E9开发板tftp烧录eMMC教程(Android)
  17. 【Python学习】数据归一化Scaling与标准化Normalization间的区别与相关实现
  18. 服务器虚拟成多人同时使用,同一台云服务器多人同时登录吗
  19. 《PTA——拼题A》之第1012题
  20. Big-man与PHP的交战(一)——阅读PHP代码

热门文章

  1. 组织结构图用什么做最简单?树图网组织结构图在线制作简单又漂亮
  2. You called this URL via POST, but the URL doesn't end in a slash and you hav。。。
  3. AIIA开发者大会——百度·产业AI技术公开课
  4. HTML期末作业-基于HTML+CSS+JavaScript制作学生信息管理系统模板
  5. 三星为企业服务器开发高性能PCIe 5.0固态硬盘;阳狮集团升任张珲杰为明思力中国董事总经理 | 全球TMT...
  6. Effie:沉浸写作,创造价值
  7. 自然语言处理NLP星空智能对话机器人系列:深入理解Transformer自然语言处理 Noisy relationships
  8. UBLOX板卡基础设置--F9P板卡配置(基准站和流动站)
  9. #20 ifconfig、route、netstat、ip、ss命令详解与修改主机名与网卡配置文件
  10. 一进制存在吗?为什么?