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

Des*_*ner 13 python opencv cv2

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

只是:

import cv2

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

cv2.imshow('image',img)
Run Code Online (Sandbox Code Playgroud)

它失败并出现以下错误:

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

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

当我运行时:

cv2.__version__
Run Code Online (Sandbox Code Playgroud)

它返回 3.4.3

waT*_*eim 12

如前所述,这个问题的基础在opencv-python 问题 46 中讨论,并且是由于以下库在主机和 opencv-python 发行版libQtDBus libQtCorelibQtGui 上的重复造成的

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

pip install --no-binary opencv-python opencv-python
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,使用最新的 opencv-python 编译可能需要较长时间 (2认同)

jmi*_*loy 12

我还没有花时间完全理解这个问题,但据我了解,这是由环境中某些插件的多个冲突版本引起的。我尝试安装构建 opencv-python 但该方法存在错误。另一个建议是更改您的导入顺序,但我的成功与否参半,而且我今天无法让它在项目中运行。

但我找到了一个对我有用的解决方法。安装opencv-python-headless而不是opencv-python. 这将避免安装冲突的插件。它可能不适合你,具体取决于你需要 opencv 的哪些功能。

$ pip uninstall opencv-python
$ pip install opencv-python-headless
Run Code Online (Sandbox Code Playgroud)


sma*_*nts 7

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

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

  • OpenCV 4.5.1 中问题仍然存在... (2认同)

DrM*_*DrM 3

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

要找出它来自哪里,假设是 Linux,请尝试以下操作,

LD_DEBUG=files python -c "import cv2"
Run Code Online (Sandbox Code Playgroud)

或者,

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

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

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

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

import cv2

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

cv2.imshow('image',img)

cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)