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>)
scale +=step;
else if(value<)
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(,,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>(, ) = scale;
M.at<float>(, ) = ( - scale)*center.x;
M.at<float>(, ) = scale;
M.at<float>(, ) = ( - scale)*center.y; float a11 = M.at<float>(, );
float a12 = M.at<float>(, );
float a13 = M.at<float>(, );
float a21 = M.at<float>(, );
float a22 = M.at<float>(, );
float a23 = M.at<float>(, );
float a31 = M.at<float>(, );
float a32 = M.at<float>(, );
float a33 = M.at<float>(, ); float bx = a11*a22 - a21*a12;
float by = a12*a21 - a11*a22;
if ( abs(bx) > 1e- && abs(by) > 1e-)
{
bx = 1.0 / bx;
by = 1.0 / by;
float cx = a13*a22 - a23*a12;
float cy = a13*a21 - a23*a11; for (int j =; j < imgHeight; j++)
{
for (int i = ; 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 + );
int v1 = floor(v0 + );
if (u0 >= && v0 >= && u1 < imgWidth && v1 < imgHeight)
{
float dx = u - u0;
float dy = v - v0;
float weight1 = ( - dx)*( - dy);
float weight2 = dx*( - dy);
float weight3 = ( - dx)*dy;
float weight4 = dx*dy; for (int k=; k<srcImg.channels(); k++)
{
pDstData[j*imgWidth * + i * + k] = weight1*pSrcData[v0*imgWidth * + u0 * + k] +
weight2*pSrcData[v0*imgWidth * + u1 * + k] +
weight3*pSrcData[v1*imgWidth * + u0 * + k] +
weight4*pSrcData[v1*imgWidth * + u1 * + k];
}
}
else
{
for (int k=; k<srcImg.channels(); k++)
{
pDstData[j*imgWidth * + i * + k] = ;
}
}
}
}
}
} 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>)
scale +=step;
else if(value<)
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(); string windowName="showImg";
namedWindow(windowName);
imshow(windowName, srcImg);
waitKey(); setMouseCallback(windowName, onMouse, NULL);
float scaleMin=0.5;
float scaleMax=;
while (true)
{
scale = (scale<scaleMin)? (scaleMin): scale;
scale = (scale>scaleMax)? (scaleMax): scale;
zoomInAndOut(scale, srcImg, dstImg);
imshow(windowName, dstImg);
waitKey();
}
}
OpenCV鼠标滑轮事件的更多相关文章
- 鼠标滑轮事件QWheelEvent
一般鼠标滑轮事件会发出信号,参数是QWheelEvent,只需要新建槽函数,QWheelEvent作为参数. void myMouseWheelEvent(QWheelEvent* even) {)/ ...
- JS鼠标滑轮事件的写法和按键的事件
在body注册一下滑轮事件 <body onload="win_onload();"></body> 然后JS代码如下: function win_onlo ...
- WPF滚动条嵌套,响应鼠标滑轮事件的处理
在C# 中,两个ScrollViewer嵌套在一起或者ScrollViewer里面嵌套一个ListBox.Listview(控件本身有scrollviewer)的时候,我们本想要的效果是鼠标滚动整个S ...
- 滚动条响应鼠标滑轮事件实现上下滚动的js代码
<script type="text/javascript"> var scrollFunc=function(e){ e=e || window.event; if( ...
- Winform鼠标滑轮控制自定义滚动条
场景:类似QQ聊天的窗体中,需要添加自定义滚动条vScroll.主窗体中panel存放空间,右边有垂直的滚动条vScroll. 问题:已经实现vScroll和Panel.VerticalScroll滚 ...
- 问题记录:JavaFx 鼠标滑轮滚动事件监听!
问题描述: 在listview的item里面添加鼠标拖拽排序功能.代码如下: setOnMouseDragged(event -> { //设定鼠标长按0.3秒后才可拖拽 防止误操作 isCan ...
- js鼠标滑轮滚动事件绑定(兼容主流浏览器)
/** Event handler for mouse wheel event. *鼠标滚动事件 */ var wheel = function(event) { var delta = 0; if ...
- opencv —— setMouseCallback 响应鼠标操作事件
鼠标操作:setMouseCallback 函数 借助回调函数,实现对鼠标每次操作的相应,即每进行一步鼠标操作,都会执行一次回调函数. void setMouseCallback(const stri ...
- js判断鼠标滑轮滚动方向并根据滚动的方向触发不同的事件
<script> var scrollFunc = function (e) { var direct = 0; e = e || window.event; if (e.wheelDel ...
随机推荐
- C#学习之设计模式:工厂模式
最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...
- Python学习_03_列表、元组、字符串
列表.元组.字符串这些通过顺序访问的对象统称为序列. 序列的标准操作符 对于一般的序列对象,包括列表.元组.字符串,都具有以下的标准操作: 1. element [not] in seq判断一个元素是 ...
- UWP 手绘视频创作工具技术分享系列 - 文字的解析和绘制
本篇作为技术分享系列的第二篇,详细讲一下文字的解析和绘制,这部分功能的研究和最终实现由团队共同完成,目前还在寻找更理想的实现方式. 首先看一下文字绘制在手绘视频中的应用场景 文字是手绘视频中很重要的表 ...
- 分布式监控系统Zabbix3.2添加自动发现磁盘IO并注册监控
zabbix并没有给我们提供这么一个模板来完成在Linux中磁盘IO的监控,所以我们需要自己来创建一个,在此还是在Linux OS中添加. 由于一台服务器中磁盘众多,如果只一两台可以手动添加,但服务 ...
- MicroPython开发之物联网快速开发板
Python的火热让其运行在MCU端的MicroPython也逐渐迎来了春天.MicroPython的出现让Python这种"胶水语言"成功引用到嵌入式领域,也使得Python控制 ...
- Mac新手使用指南:brew安装的nginx常用命令
安装:brew install nginx/sudo brew install nginx 启动:brew services start nginx/sudo brew services start ...
- Virtualbox虚拟机安装与设置
Virtualbox与VMware类似,都是虚拟机软件,在win10下安装Virtualbox直接默认安装即可.版本:VirtualBox-5.2.0-118431-Win.exe 安装完成后,点击左 ...
- SAP HANA中的SLT简介
在以SAP系统作为主要ERP的企业中,不同系统之间的数据库数据同步是个重要的工作.对于这种需求,除了开发ABAP接口之外,也有高效的工具可用.SLT就是其中之一. SLT是SAP的第一个ETL(Ext ...
- MySQL大小写敏感问题和命名规范
注:本文大部内容参考自互联网相关文章 1.MySQL大小写敏感规则 MySQL中,一个库会对应一个文件夹,库里的表会则以文件的方式存放在文件夹内,所以,操作系统对大小写的敏感性决定了数据库和表的大小写 ...
- app额外后台运行操作
//在视图中运行操作中进行周期操作 - (void)applicationDidEnterBackground:(UIApplication *)application { [self beingBa ...