如何修复python中opencv中的错误“QObject :: moveToThread:”?

时间:2017-09-27 13:59:21

标签: python python-2.7 opencv

我在python中使用opencv2,代码为

import cv2
cv2.namedWindow("output", cv2.WINDOW_NORMAL)       
cv2.imshow("output",im)
cv2.resizeWindow('output', 400,400)
cv2.waitKey(0)
cv2.destroyAllWindows()

我的错误是

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

我调试并发现它在我使用cv2.waitKey(0)时发生了。我该如何解决?感谢

更新:我使用的是3.3.0.0。如果我使用旧版本,我有错误

OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in cvDestroyAllWindows, file /io/opencv/modules/highgui/src/window.cpp, line 577 Traceback (most recent call last): File "tools/demo_handbone.py", line 220, in <module> demo(net, im_name) File "tools/demo_handbone.py", line 159, in demo cv2.destroyAllWindows() cv2.error: /io/opencv/modules/highgui/src/window.cpp:577: error: (-2) The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config, then re-run cmake or configure script in function cvDestroyAllWindows

21 个答案:

答案 0 :(得分:5)

我遇到了同样的问题,对我来说是opencv-python版本的问题。
我的Linux机器的环境如下:

$ cat /etc/lsb-release 
...
DISTRIB_DESCRIPTION="Ubuntu 18.04.5 LTS"
$ date
Tue Aug 11 11:43:16 KST 2020
$ python --version
Python 3.7.8
$ pip list|grep Qt
PyQt5                5.15.0
PyQt5-sip            12.8.0
$ pip list|grep opencv-python
opencv-python        4.3.0.38

我将opencv-python 4.3.0.38 降级为 4.3.0.36

$ pip uninstall opencv-python
$ pip install opencv-python==4.3.0.36
$ pip list|grep opencv-python
opencv-python        4.3.0.36

答案 1 :(得分:4)

首先,卸载您可能已安装的任何OpenCV版本。如果您使用sudo pip uninstall opencv-python 安装:

sudo apt-get install libopencv-dev python-opencv

接下来,尝试使用Linux发行版的软件包管理器安装OpenCV。对于Ubuntu / Debian,这是:

HomeFragment

答案 2 :(得分:4)

如果您使用 Anaconda 虚拟环境并同时执行 conda install pyqt(1) pip install opencv-python,则可能会发生这种情况。这会在两个 PyQt 版本(opencv-python 自带)之间产生冲突并导致错误。

解决方案是通过pip安装PyQt,即pip install PyQt5


(1) 或者任何依赖于 pyqt 的东西,例如conda install matplotlib.

答案 3 :(得分:2)

我已解决此问题,并发布了解决方案in related issue on OpenCV github page。但是为了方便起见,我也将其张贴在这里。

就我而言,我几乎完成了所有解决方案:

  • 使用pip3安装opencv-python
  • 使用apt install python-opencv安装
  • 我遵循了@areche solution,最后得到了kdelibs5-plugins,它是我大多数台式机环境的重要模块,因此我放弃了卸载它。

最后,我找到了解决方案

  • pip uninstall opencv-python在我的python和虚拟环境的所有实例上
  • pip3 uninstall opencv-python在我的python和虚拟环境的所有实例上
  • sudo apt remove python-opencv

然后,我下载了最新的opencv,在我的情况下为opencv-4.1.1,我进行了构建。 用于建筑:

mkdir build; cd build; ccmake .. 然后我按下了c,再次按下了c,然后按下了g来生成文件,然后 sudo make -j8 成功构建后,我将build\lib\python3\cv2.cpython.xxxxxx.so复制到usr/local/lib/python3.5/dist-packages/并将其重命名为cv2.so 对每个虚拟环境执行相同的操作。 (我不确定这是否合乎逻辑,但对我有用)。

然后一切正常,没有任何错误。

答案 4 :(得分:1)

我在Ubuntu 18.04 LTS下通过从pipapt卸载任何OpenCV软件包并直接从源代码安装OpenCV来解决此问题。也许本教程会有所帮助:

https://www.pyimagesearch.com/2018/08/15/how-to-install-opencv-4-on-ubuntu/

答案 5 :(得分:1)

参考:https://blog.csdn.net/flyfor2013/article/details/110132458

pip3 卸载 opencv-python

pip3 install opencv-python==4.1.1.26

当我降级 opencv-python 4.5 -> 4.1.1.26 然后好的

//

pip3 >= 20.3 使用:pip3 install --use-deprecated=legacy-resolver opencv-python==

pip3 >= 9.0 使用:pip3 install opencv-python==

我试试

pip3 卸载 opencv-python

pip3 install opencv-python==4.3.0.36

也行

答案 6 :(得分:1)

我能够通过安装新的pyqt来解决此问题。

如果您正在使用anaconda,请在下面写下:

$ conda安装pyqt

答案 7 :(得分:1)

这可能是由于Qt库的安装冲突引起的。以下命令为我修复了该问题:

sudo apt-get删除libqt5x11extras5 libqt5x11extras5-dev

答案 8 :(得分:0)

重新安装opencv-python lib就可以了。

pip uninstall opencv-python
pip install opencv-python=4.2.0.34

4.2 版本是最新的 opencv python,不会抛出这个错误。我试过 4.3 或 4.4+,不行。

这个问题的主要原因可能是PyQt5和Opencv的冲突。

答案 9 :(得分:0)

问题出在 OpenCV 版本上,以下版本为我解决了所有问题。

pip uninstall opencv-python
pip install opencv-python==4.1.2.30

我正在使用 - Python 3.8.5 和 conda

我也尝试升级pyqt,但没有用

答案 10 :(得分:0)

这是兼容性问题。甚至“conda install install pyqt”的方式也行。请确保您可以安装特定版本的 opencv 库。更高版本可能会出现同样的问题。

pip install opencv-python==4.1.1.26
pip install opencv-contrib-python==4.1.1.26

干杯,

答案 11 :(得分:0)

这个错误发生在更高版本的 openCv 中,比如 4.3.0.38 或更高版本,我用 pip 尝试了 4.3.0.36 版本,这个问题为我解决了,但是在较低版本中我遇到了很多问题,比如窗口加载不正确,如果使用的是 Ubuntu,我建议您从系统中完全卸载 opencv,然后尝试使用下面给出的命令重新安装,

pip install opencv-contrib-python3

答案 12 :(得分:0)

我知道线程有点旧,但是发布给其他人,我遇到了同样的问题,这是因为即使在运行之后

pip3 uninstall opencv-python

我检查过系统中的另一个open-cv版本

pip list

(我猜pip只会删除它找到的第一个版本) 所以我再次运行了该命令

pip3 uninstall opencv-python

现在只需安装opencv by

pip install opencv-python

为我工作。

答案 13 :(得分:0)

当我尝试运行detectron2演示时,我遇到了同样的问题。我的操作系统是Centos7,而我 卸载一些有关qt的应用程序。

找到有关qt的应用程序。

yum list installed |grep qt

删除应用程序

yum -y remove xxx...

答案 14 :(得分:0)

我有同样的问题。使用opencv imshow函数会引发移动线程错误。最终,我发现Ubuntu 16.04预先安装了pyqt5,而OpenCV需要pqty4。 因此,这可能是由于Qt库的安装冲突引起的。以下命令为我修复了该问题:

sudo apt-get remove libqt5x11extras5 libqt5x11extras5-dev

答案 15 :(得分:0)

我遵循@Varun建议的解决方案,它对我有用(使用Python 3)。 但是,我没有安装生成的文件,因为我在需要cv软件包的系统上没有管理员权限。一个True,然后是cmake就足够了,然后我从make文件夹中取出了cv2.*.gnu文件,并替换了我的虚拟环境的../build/lib/python3文件夹中的文件

答案 16 :(得分:0)

openCv作者说此问题来自openCv和Linux发行版中的不同Qt版本。即:Qt4附带了openCv,但已经安装了Qt5。

答案 17 :(得分:0)

我不知道为什么,但是安装matplotlib为我解决了出现错误的问题

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

我强调我准备了安装了matplotlib的全新conda环境。 Opencv是由pip在conda env中安装的,方法如下:pip install opencv-python opencv-contrib-python

答案 18 :(得分:0)

如果您具有Ubuntu 17及更高版本,@ Mateen的答案非常有用。对于Ubuntu 16,最好从源代码中编译您的opencv python。如@Varun所述,请遵循opencv tutorial。但是,要使用python 3成功编译opencv,我必须在cmake命令中添加一些标志:

cmake -DCMAKE_BUILD_TYPE=RELEASE -DPYTHON_DEFAULT_EXECUTABLE=$(which python3) -DPYTHON_INCLUDE_DIR2=/usr/include/x86_64-linux-gnu/python3.5m/ -DPYTHON3_NUMPY_INCLUDE_DIRS=/usr/local/lib/python3.5/dist-packages/numpy/core/include/ ..

希望会有所帮助。

答案 19 :(得分:0)

如果在没有virtualenviroment的情况下运行opencv,则不会出现此问题。 我的系统: Kbuntu 18.04 LTS GTX 1050 CUDA 9.2 Tensorflow 1.9

答案 20 :(得分:0)

我尝试了上面提到的方法,并且可以使用opencv模块为我的项目工作,该项目使用python3.x解释器。

在进行了一些实验之后,我通过以下步骤使其工作:

1)使用以下命令在您的机器上安装opencv-python:

def findMatch(word: String): String => Boolean = { s =>
    Option(s) match {
      case Some(validText) => if (word.toLowerCase.r.findAllIn(validText.toLowerCase).nonEmpty) true else false
      case None            => false
    }
  }

2)在python3.x终端上找到版本:

distance

3)从official page获取相同版本的OpenCV。

4)执行opencv tutorial中提到的CMake设置。    请注意 PYTHON3_PACKAGES_PATH

中指定的位置

5)执行构建后,进入 PYTHON3_PACKAGES_PATH 中指定的安装位置。将名为 cv2.cpython - * - gnu.so 的库移动到当前的python3.x dist-packages路径:

match(n:Company)  
WHERE NOT (n)-[:refersTo]->() and n.name starts with "google" 
with n as company, apoc.text.distance('google', n.name_lower) as distance  
with company, collect(distance) as distances, avg(distance) as distAvg
unwind distances as distance
return company.name as name, distance, distAvg

6)重新加载你的python3项目,然后再试一次!