OpenCV鼠标事件始终在鼠标滚动时接收事件10和* flag * 0吗?

时间:2019-02-09 10:45:19

标签: c++ opencv

问题在于,在旧版本的Ubuntu 16.04和OpenCV 3.4上,无论滚轮方向如何,getMouseWheelDelta(flag)始终等于零。

在我的较新版本的Ubuntu 18.04机器上,从未使用过OpenCV 4,此功能运行良好,并且getMouseWheelDelta(flag)根据滚动方向返回-1或1:

#include "opencv2/core.hpp"
#include <iostream>
using namespace std;
using namespace cv;

void on_mouse(int event, int x, int y, int flag, void* userdata)
{
    printf("event = %d, %d\n", event, getMouseWheelDelta(flag));
    if (event==EVENT_MOUSEWHEEL)
    {
        if (getMouseWheelDelta(flags) > 0)
            zoom += 0.1f; // this newer gets executed on Ubuntu 16.04 and OpenCV 3.4
        else
            zoom -= 0.1f;
    }
}

int main()
{
    Mat mSrc = imread("xxxxx.jpg");
    imshow("src", mSrc); 
    setMouseCallback( "src", on_mouse, NULL );

    waitKey(0);

    return 0;
}

获取鼠标滚轮增量会根据滚动方向返回正值和负值。

问题是,当我在较旧的Ubuntu 16.04,Open CV 3.4上尝试相同的代码时,无论向上或向下滚动,我始终会收到事件10和0。使用此信息放大照片时,应该如何获得滚轮方向?

在OpenCV文档中说:

getMouseWheelDelta()

Note:
Mouse-wheel events are currently supported only on Windows.

但是为什么它可以在我的Ubuntu 18.04机器上运行,又如何在较旧的Linux版本上实现呢?

2 个答案:

答案 0 :(得分:0)

我刚遇到类似的问题。在python中,getMouseWheelDelta()函数似乎不存在,但是我找到了一种处理事件的方法。也许在ubuntu的c ++中也可以使用类似的实现。

def ProcessMouseEvent(event,x,y,flags, params):
    print(event)
    print(flags)
    # mousewheel event code is 10
    if event == 10:
            #sign of the flag shows direction of mousewheel
            if flags > 0:
                #scroll up
            else:
                #scroll down

Python版本3.7.1
OpenCV版本3.4.3

答案 1 :(得分:0)

我检查了其他事件,看来ubuntu 16.04和OpenCV 3.4中的滚动与新版本有所不同,它是事件11而不是事件10,这是水平鼠标滚动cv :: EVENT_MOUSEHWHEEL。如果我检查此值,则如果我向上滚动,它将给出最大16位负值,而如果我向下滚动,则将给出正值。这很奇怪,但至少现在我可以知道用户是否正在使用鼠标滚轮滚动。

cv :: EVENT_MOUSEWHEEL = 10,//在较新的版本上返回+ -1

cv :: EVENT_MOUSEHWHEEL = 11 //在旧版本上返回+-最大16位值