为什么右键单击在OpenCV imshow()窗口中打开一个下拉菜单?

时间:2019-06-17 00:07:49

标签: python opencv imshow

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

  • OpenCV版本4.1.0
  • Python版本3.6.8
  • IDLE版本3.6.8
  • Ubuntu 18.04.2

这是cv2.getBuildInformation()的构建信息: build information

在Grabcut Sample脚本中,我需要“使用右键鼠标按钮在对象周围绘制一个矩形”。出于某种原因,当我单击鼠标右键(即单击并按住鼠标右键)时,会出现一个下拉菜单:

drop down

以前从未发生过,但是由于我重新格式化了计算机并重新安装了OpenCV,因此获得了此下拉菜单。 imshow窗口看起来也不同。我尝试安装许多视频编解码器程序包(from this tutorial),但这无济于事。

此下拉菜单会干扰鼠标回调功能。如何摆脱此下拉菜单?

我使用命令pip3 install opencv-contrib-python安装了OpenCV。我知道我缺少一些软件包,所以我尝试安装(但失败-'无法通过regex找到任何软件包...')来自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

2 个答案:

答案 0 :(得分:3)

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

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

然后致电

cv2.imshow("window_name", img)

namedWindow函数的文档的链接是here

答案 1 :(得分:1)

您正在使用Qt highgui后端,它看起来像在不重新编译opencv的情况下就禁用了右键单击上下文菜单而无法禁用它。如果您以前没有看过,则可能是您使用了其他后端。

如果您更喜欢使用Qt,并且不介意稍微更改opencv源并重建,则好像更改了文件DefaultViewPort::contextMenuEvent()中的modules/highgui/src/window_QT.cpp方法以跳过构建菜单,只是返回就可以了(或者由于您添加了一些标志而使其有选择地构建菜单)。目前,Qt highgui后端会使用常规菜单中可用的任何操作来自动创建菜单。

以下是截至2019-06-18的当前opencv master分支中的方法的链接:

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,但又不需要花哨的菜单选项和其他行为,那么看起来您可以在创建窗口时添加CV_GUI_NORMAL标志以禁用CV_GUI_EXPANDED Qt功能。