OpenCV 鼠标事件在鼠标滚动时总是接收事件 10 和 *flag* 0?

thi*_*ore 2 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

OpenCV 文档中写道:

getMouseWheelDelta()

Note:
Mouse-wheel events are currently supported only on Windows.
Run Code Online (Sandbox Code Playgroud)

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

J.D*_*.D. 5

我刚刚遇到了类似的问题。在 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
Run Code Online (Sandbox Code Playgroud)

Python版本3.7.1
OpenCV版本3.4.3