为什么右键单击会在我的 OpenCV imshow() window 中打开一个下拉菜单?

Why does a right click open a drop down menu in my OpenCV imshow() window?

我正在尝试 运行 我系统上的 OpenCV Grabcut Sample

这是来自 cv2.getBuildInformation() 的构建信息:

在 Grabcut 示例脚本中,我需要 'draw a rectangle around the object using the right mouse button.' 由于某些原因,当我单击鼠标右键时会出现一个下拉菜单(这是我单击并按住鼠标右键):

这以前没有发生过,但自从我重新格式化我的电脑并重新安装 OpenCV 后,我得到了这个下拉菜单。 imshow window 看起来也不一样。我尝试安装很多视频编解码器包 (from this tutorial),但没有帮助。

此下拉菜单干扰了鼠标回调函数。我怎样才能去掉这个下拉菜单?

我使用命令 pip3 install opencv-contrib-python 安装了 OpenCV。我知道我缺少一些包,所以我尝试安装(但失败了 - '无法通过正则表达式找到任何包......') 这些来自 this tutorial 的包:

sudo apt-get install python-devel numpy
sudo apt-get install gcc gcc-c++
sudo apt-get install gtk2-devel
sudo apt-get install ffmpeg-devel
sudo apt-get install gstreamer-plugins-base-devel

您正在使用 Qt highgui 后端,它看起来像是强制 right-click 上下文菜单,但无法在不重新编译 opencv 的情况下禁用它。如果您之前没有看到它,很可能您使用的是不同的后端。

如果您更喜欢使用 Qt 并且不介意稍微更改 opencv 源代码并重新构建,那么似乎可以更改文件 modules/highgui/src/window_QT.cpp 中的 DefaultViewPort::contextMenuEvent() 方法以跳过构建菜单并直接返回 will可能工作(或者由于您添加的某些标志而有选择地构建菜单)。目前,Qt highgui 后端 auto-creates 菜单使用常规菜单中可用的任何操作。

这是截至 2019 年 6 月 18 日当前 opencv master 分支中的方法的 link:

https://github.com/opencv/opencv/blob/1d2ef6b2a14fd5f80277d64b14e4a9a2faddc7d8/modules/highgui/src/window_QT.cpp#L2697

其中有这个代码:

void DefaultViewPort::contextMenuEvent(QContextMenuEvent* evnt)
{
    if (centralWidget->vect_QActions.size() > 0)
    {
        QMenu menu(this);

        foreach (QAction *a, centralWidget->vect_QActions)
            menu.addAction(a);

        menu.exec(evnt->globalPos());
    }
}

另一种无需重新编译即可工作的替代方法可能是使用左拖动进行选择,同时检查是否按住了其他修改键(如 shift 或 ctrl)。

顺便说一句,我还没有实际测试过这两种方法中的任何一种,祝你好运! :-)

更新: 如果您仍然想要 Qt 但不需要花哨的菜单选项和额外的行为等,看起来您可以在创建 window 时添加 CV_GUI_NORMAL 标志以禁用 CV_GUI_EXPANDED Qt功能。

在 Python 中,您可以将 cv2.WINDOW_GUI_NORMAL 标志传递给 namedWindow() 以禁用下拉列表(仅当您有 Qt 后端时才支持该标志):

cv2.namedWindow("window_name", cv2.WINDOW_GUI_NORMAL)

然后调用

cv2.imshow("window_name", img)

Link namedWindow 函数的文档是 here.