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 ...
随机推荐
- Python简单小程序练习
1.九九乘法表 #!/usr/bin/python for i in range(1,10): for j in range(i): j += 1 print ("%d * %d = %-2 ...
- bash脚本之数组学习
在bash中可使用索引数组和关联数组,bash在4.0版本之后才添加了对关联数组的支持 一.索引数组 1.定义索引数组 # 方式1 array_value=(1 2 3 4 5 6)或者array_v ...
- SqlServer Partition 分区表
分区表 测试版本: Microsoft SQL Server 2014 - 12.0.2000.8 (X64) Feb 20 2014 20:04:26 Copy ...
- zabbix借助onealert实现微信报警
官网:http://wiki.110monitor.com/integration/zabbix-manual.html) Zabbix安装包部署方式 1)下载agent软件包 请在Zabbix服务器 ...
- APP瘦身绝技(快速减少包大小)
如果要清理无用类文件和无用图片,参考博客<iOS 清理Xcode项目中没有使用到的图片资源和类文件>.当下众多app项目,尤其是初创公司,明显的特点就是,开发周期短,迭代更新快,甚至一周一 ...
- [js高手之路] vue系列教程 - 事件专题(4)
本文主要讲解事件冒泡,事件绑定的简写,事件默认行为,按键码等一系列与事件相关的知识. 一.事件绑定的简写,@事件类型. 之前我的[js高手之路] vue系列教程 - vue的事件绑定与方法(2) 用 ...
- 《UNIX环境高级编程》第七章进程环境
7.2 main函数 1.C程序总是从main函数开始执行的,原型:int main(int argc,char *argv[]);argc是命令行参数的个数argc是指向参数的各个指针所构成的数组2 ...
- 【转载】CSRF攻击及其应对之道
在我最开始接触JavaEE时,我工作的第一个内容就是解决项目中存在的CSRF漏洞,当时的解决方法是在Referer添加token的方法.我对CSRF攻击的主要认知和解决的大部分思路都来自于这篇文章. ...
- 老铁,这年头不会点Git真不行!!!
版本控制 说到版本控制,脑海里总会浮现大学毕业是写毕业论文的场景,你电脑上的毕业论文一定出现过这番景象! 毕业论文_初稿.doc 毕业论文_修改1.doc 毕业论文_修改2.doc 毕业论文_修改3. ...
- Java基础(五)-Java序列化与反序列化
.output_wrapper pre code { font-family: Consolas, Inconsolata, Courier, monospace; display: block !i ...