I created a GUI app using pyqt5 and opencv. The app works fine without activating the virtual env but when I activate the virtual env and run the app it shows this error:
QObject::moveToThread: Current thread (0x125b2f0) is not the object's thread (0x189e780).
Cannot move to target thread (0x125b2f0)
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/home/deepak/Desktop/SampleApp/lib/python3.9/site-packages/cv2/qt/plugins" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: xcb, eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xcomposite-egl, wayland-xcomposite-glx, webgl.
Aborted
I tried running an example pyqt5 code (without importing opencv) and another code (only using opencv) both worked fine in the virtual env.
Operating System: Parrot OS 4.11
Python Version: 3.9.2
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
The problem is that the version of Qt with which opencv was compiled is not similar to the one used by PyQt5 causing a conflict.
A possible solution is to indicate to use the Qt plugins used by PyQt5.
import os
from pathlib import Path
import PyQt5
from PyQt5.QtWidgets import QWidget # others imports
import cv2
os.environ["QT_QPA_PLATFORM_PLUGIN_PATH"] = os.fspath(
Path(PyQt5.__file__).resolve().parent / "Qt5" / "plugins"
)
# ...
For PySide2:
import os
from pathlib import Path
import PySide2
from PySide2.QtWidgets import QWidget # others imports
import cv2
os.environ["QT_QPA_PLATFORM_PLUGIN_PATH"] = os.fspath(
Path(PySide2.__file__).resolve().parent / "Qt" / "plugins"
)
# ...
Update:
A better option is to use QLibraryInfo to get the plugins folder path:
import os
from PyQt5.QtCore import QLibraryInfo
# from PySide2.QtCore import QLibraryInfo
import cv2
os.environ["QT_QPA_PLATFORM_PLUGIN_PATH"] = QLibraryInfo.location(
QLibraryInfo.PluginsPath
)
Method 2
I solved the issue by downgrading the cv2 version, simply run
python3 -m pip install opencv-contrib-python==4.1.0.25
I used to have the 4.5.3.56
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0