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 ...
随机推荐
- 找回Git中丢失的Commit
在使用Git的过程中,有时候会因为一些误操作,比如reset.rebase.merge等.特别是在Commit之后又执行了git reset --hard HEAD强制回滚本地记录以及文件到服务器版本 ...
- MySQL数据库学习02: SELECT语句
声明:本篇文章大多数内容出自<MySQL必知必会>,仅供学习参考,勿作他用! 第4章 检索数据 4.1 SELECT语句 SELECT子句用于检索数据库中的表数据.它几乎是MySQL中最常 ...
- 《UNP》学习之TCP状态转换
CLOSED:TCP起始状态 LISTEN:绑定端口后进入listen状态,一般是服务端 SYN_SENT:发送SYN连接请求,主动打开连接的一方进入SYN_SENT SYN_RCVD:接收到SYN连 ...
- grep命令及基本正则表达式
grep命令是Linux系统中一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功 ...
- 别纠结mybatis啦,赶紧来瞅瞅吧
自从用了mybatis后,被坑的次数不下于无数次,今天我们就来说说最最头疼的错误,看看有多少人入过这个坑呢. 当程序出现了 Result Maps collection already contain ...
- HDFS Federation
http://hadoop.apache.org/docs/r2.9.0/hadoop-project-dist/hadoop-hdfs/Federation.html Background HDFS ...
- 记一个CRenderTarget中的BUG及解决办法
转载请注明出处:http://www.cnblogs.com/Ray1024 一.问题描述 在MFC中使用Direct2D有现成的方法,在Visual Studio 2010 SP1及以上环境中MFC ...
- DAY5-小别-2018-1-15
有两天没有写了,前天考完试出去浪了,惭愧自己没有学习:昨天,启程回家看完了循环内容的视频,晚上十点半火车到站,没抽出时间写了,还看了<黑客帝国>,有点小感触,人工智能的时代即将到来,我们该 ...
- file中private_data
这个是Linux下连接VFS文件系统框架和不同文件/文件系统底层实现之间的一个核心数据结构,虽然它只是一个指针,但是一个指针可以解决所有问题,有了它,妈妈再也不用担心我的学习.我们回想一下用户态线程的 ...
- [搬运]在C#使用.NET设计模式的新观点
原文地址:http://www.dotnetcurry.com/dotnet/1092/dotnet-design-patterns 软件开发有许多设计模式.其中一些模式非常受欢迎.说几乎所有的模式都 ...