Python OpenCV 错误:当前线程不是对象的线程

Posted

技术标签:

【中文标题】Python OpenCV 错误:当前线程不是对象的线程【英文标题】:Python OpenCV Error: Current thread is not the object's thread 【发布时间】:2019-02-19 14:45:45 【问题描述】:

我在使用 cv2 模块运行简单代码时出错。

只是:

import cv2

img = cv2.imread('sudoku.png',0)

cv2.imshow('image',img)

它失败并出现以下错误:

QObject::moveToThread: Current thread (0x1b74720) is not the object's thread (0x1e57d70).
Cannot move to target thread (0x1b74720)

我用谷歌搜索了这个错误并尝试了很多东西,但没有帮助。我尝试在没有 pip 的情况下安装,我尝试使用分步安装(来自官方 OpenCV)但没有任何帮助。

当我跑步时:

cv2.__version__

它返回 3.4.3

【问题讨论】:

Is this the complete error message? No traceback, no line numbers? 是的,我只有 3 行代码,它就是控制台中出现的所有内容 另外,你使用的是哪个cv2 包——官方包还是opencv-python?哪个操作系统和 Python 实现?您是从交互式控制台还是 ipython/jupyter 使用它? 我试过用官方的但是不行,所以只好安装opencv-python。操作系统是 Ubuntu,我正在通过 PyCharm 运行代码,但是当我从控制台运行它时收到相同的错误 你是在运行python2还是python3,我在google上发现了类似的问题,但可能你也找到了它们并尝试了建议。一个临时的解决方案是使用 matplotlib 而不是 opencv imshow。 【参考方案1】:

通过简单地更新一个库,我的系统上的错误已得到修复。

要找出它的来源,假设是 Linux,请尝试以下操作,

LD_DEBUG=files python -c "import cv2"

或者,

LD_DEBUG=files python -c "import cv2 ; img = cv2.imread('myimage.png',0) ; cv2.imshow('image',img) ; cv2.waitKey(0)"

在我的机器上,它在一个 blas 库中失败了。我更新了那个库,现在代码运行没有错误。

这是一个旧错误,您可以在许多在线社区中找到它的讨论。

我的测试代码如下。值得注意的是,该错误没有再次发生,而且显然与 Qt 无关。

import cv2

img = cv2.imread('sudoku.png',0)

cv2.imshow('image',img)

cv2.waitKey(0)

【讨论】:

我注意到问题出现在 'cv2.imshow' 函数中,因为我的代码就是我在这里粘贴的所有内容。 @Desiigner 我很好奇,您是否尝试过我的建议,是否解决了您的问题? @DrM 所以我尝试了你的代码,它可以工作,完全没有错误。运行 Jupyter Notebook 时出现原始错误,所以我认为我不应该运行笔记本。我还发现只要省略 waitKey() 就可以使用笔记本 我遇到了 python 3.8 Ubuntu 18.04 的问题,运行 LD_DEBUG 时我得到“ 26295:初始化程序:python 26295:26295:26295:转移控制:python 26295:回溯(最近一次调用最后一次) :文件“”,第 1 行,在 ModuleNotFoundError:没有名为“cv2”的模块 26295:26295:调用fini:python [0] 26295:“。在基础 conda 环境中 pip install opencv-python 后我仍然有问题。【参考方案2】:

根据发布在 OpenCV GitHub 上的 this issue,这是一个已知问题,开发人员表示几乎不可能修复。这显然是由于系统上的任何 Qt 安装与 OpenCV 附带的 Qt 发生冲突引起的。有一些建议可以从系统中删除 libqt5x11extras5 包。这可能会解决某些问题,但任何在使用基于 Qt 的窗口管理器的 Linux 发行版上运行这些库的人都会通过删除此包来使他们的桌面环境无法使用(我自己尝试过)。

您可以尝试在运行cmake 时使用WITH_GTK=ON 选项从源代码构建OpenCV,这将使用GTK 而不是Qt,从而避免冲突。但是,在使用虚拟环境时,这很难在 Python 中使用。

【讨论】:

目前的希望似乎是,当 OpenCV 在其下一个版本中迁移到 Qt 5 时,该问题将消失。 4.4.0版本还是一样的问题。 @AndreasK。是的,我认为他们不想修复它。已经三年了。 根本不一定如此。在我的系统上,它被追溯到一个 blas 库,更新该 blas 库会使错误消失。因此,尽管赢得了 6 票,但这似乎并不完全正确。 @DrM 如果我的回答对某些人来说是一个解决方案而不是其他人,它仍然不是一个可行的解决方案吗?【参考方案3】:

如前所述,此问题的基础在opencv-python issue 46 中进行了讨论,并且是由于主机和 opencv-python 发行版上的以下库的重复libQtDBus libQtCore libQtGui

最近在最新版本的 opencv-python 中解决了这个问题。这不是对源代码的修复,而是强制 pip 通过

编译新可用的源代码
pip install --no-binary opencv-python opencv-python

这会导致opencv-python使用与宿主机相同的库,所以冲突不再存在。

【讨论】:

请注意,使用最新的 opencv-python 编译可能需要一些时间 @matanster 表示同意,我很惊讶地发现我的 PC Ryzen 7 3700X 64GB RAM、NVIDIA 2080Ti 大约需要 20-30 分钟......真是一个图书馆~!【参考方案4】:

对我来说,这个问题的解决方案是删除 Anaconda,然后安装 pip,然后使用简单的 pip install 命令安装 OpenCV。

【讨论】:

以上是关于Python OpenCV 错误:当前线程不是对象的线程的主要内容,如果未能解决你的问题,请参考以下文章

Python OpenCV线程

Python OpenCV - ConvexHull 错误“点不是 numpy 数组,也不是标量”?

通过引用传递一个垫子对象 OpenCv

如何在Python中使用OpenCV的

无法解压缩不可迭代的numpy.float64对象python3 opencv

OpenCv 是不是已经线程化?