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 ...
随机推荐
- arm-linux-objdump反汇编使用指南
一. arm-linux-objdump常用来显示二进制文件信息,常用来查看反汇编代码 二. 常用选项: 1.-b bfdname 指定目标码格式 2.-disassemble或者-d 反汇编 ...
- x的x次幂的值为10,求x的近似值
public class Main { static double eps = 1e-7; public static void main(String[] args){ double l = 2,r ...
- Pycharm选择pyenv安装的Python版本
在macOS上使用pyenv实现Python多版本共存后,pyenv安装的Python版本存在于macOS下的 ~/.pyenv/versions/下. 在Pycharm时,选择此目录下对应的版本即可 ...
- jBPM学习之部署流程定义
也许部署流程定义的方法有很多,这里选用的是用Java代码调用工作流引擎提供的部署服务API.在这之前,假设你的Eclipse已经安装好了GPD工作流画图工具,并且学会了画出最简单的HelloWorld ...
- 【python3之文件操作】
一.文件操作 1.文件处理的流程 1)打开文件,得到文件句柄并赋值给一个变量 2)通过句柄对文件进行操作 3)关闭文件 例如: f = open('chenli.txt') #打开文件 first_l ...
- 轻量级弹出框 lightbox
1. 引入 lightbox.css 和 lightbox.js 2.检查 CSS 并确定调用的 prev.gif 和 next.gif 文件在正确的位置. 同样要确定调用的 loading.gif ...
- 【分块】BZOJ2821 作诗(Poetize)
2821: 作诗(Poetize) Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 3265 Solved: 951[Submit][Status][ ...
- jsp分页
<%! int pataSize=5;// 每页多少数据 int totalCount =0; //数据共多少 int pageCount = 0; ///数据共有多少页 ...
- 【转载】MySQL5.6.27 Release Note解读(innodb及复制模块)
新功能 问题描述(Bug #18871046, Bug #72811): 主要为了解决一个比较“古老”的MySQL在NUMA架构下的“swap insanity”问题,其表现为尽管为InnoDB ...
- Percona Toolkit 2.2.19 is now available
New Features: 1221372: pt-online-schema-change now aborts with an error if the server is a slave, be ...