Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么右键单击会在我的OpenCV imshow()窗口中打开下拉菜单?_Python_Opencv_Imshow - Fatal编程技术网

Python 为什么右键单击会在我的OpenCV imshow()窗口中打开下拉菜单?

Python 为什么右键单击会在我的OpenCV imshow()窗口中打开下拉菜单?,python,opencv,imshow,Python,Opencv,Imshow,我正在尝试在我的系统上运行: OpenCV版本4.1.0 Python版本3.6.8 空闲版本3.6.8 Ubuntu 18.04.2 这是来自cv2.getBuildInformation()的生成信息: 在Grabcut示例脚本中,我需要“使用鼠标右键在对象周围绘制一个矩形”。出于某种原因,当我单击鼠标右键时会出现一个下拉菜单(这是我单击并按住鼠标右键): 这以前没有发生过,但是自从我重新格式化了我的计算机并重新安装了OpenCV之后,我得到了这个下拉菜单。imshow窗口看起来也不

我正在尝试在我的系统上运行:

  • OpenCV版本4.1.0
  • Python版本3.6.8
  • 空闲版本3.6.8
  • Ubuntu 18.04.2
这是来自
cv2.getBuildInformation()
的生成信息:

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

这以前没有发生过,但是自从我重新格式化了我的计算机并重新安装了OpenCV之后,我得到了这个下拉菜单。
imshow
窗口看起来也不一样。我试着安装了很多视频编解码器软件包(),但都没有用

此下拉菜单干扰鼠标回调函数。我怎样才能摆脱这个下拉菜单

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


您使用的是Qt
highgui
后端,它似乎强制右键单击上下文菜单,而不需要重新编译opencv就可以禁用它。如果您以前没有看到它,很可能您使用的是不同的后端

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

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

其中包含以下代码:

void DefaultViewPort::contextMenuEvent(QContextMenuEvent*evnt)
{
如果(centralWidget->vect_QActions.size()>0)
{
QMenu菜单(此菜单);
foreach(QAction*a,centralWidget->vect_QActions)
菜单。添加操作(a);
menu.exec(evnt->globalPos());
}
}
另一种可能不需要重新编译的方法是,在检查是否按住了其他修改键(如shift或ctrl)的同时,使用左拖动进行选择

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

更新:
如果您仍然需要Qt,但不需要花哨的菜单选项和额外的行为等,那么在创建窗口时可以添加
CV\u GUI\u NORMAL
标志,以禁用
CV\u GUI\u EXPANDED
Qt功能。

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

cv2.namedWindow(“窗口名称”,cv2.window\u GUI\u正常)
然后打电话

cv2.imshow("window_name", img)

指向
namedWindow
函数文档的链接是。

我想对于这类问题,您应该添加有关操作系统(Ubuntu18.04?)、Python安装、IDE等的详细信息(并且,您总是使用您的精美动画!:-),这些操作系统看起来像是highgui使用的后端工件。这篇文章展示了如何使用GTK。也许你以前用过类似Qt的东西?不管怎样,正如HansHirse所说,我们没有足够的信息可以确定。@rob3c我添加了更多关于我的系统的信息。我不确定我需要补充什么信息。谢谢你的帮助。使用修改器键是最简单的解决方案。我现在能够实现将GrabCut应用于DL模型的语义分段的目标:看起来它工作得很好!使用修改键当然比完全重新编译要好:-)@StephenMeschke你是如何实现修改键的?添加一些代码会很有用(请注意,不幸的是,我必须使用鼠标右键单击:我要做的是让用户双击上下文菜单,这会取消上下文菜单。这是一种黑客行为,但目前仍然有效)。
cv2.imshow("window_name", img)