网上查了一下这个报错,有很多解决方案,但是都不是针对 OpenCV 触发的这种
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in " */lib/*/site-packages/cv2/qt/plugins" even though it was found.
本文的方案是牺牲 cv2.imshow,修复 plt.imshow,省流直接看 Test 3
未找到根治的解决方案,欢迎大家讨论
测试及分析
测试环境如下
Conda: Miniconda3-py313_25.3.1-1-Linux-x86_64.sh
Python: 3.10.16
OpenCV: 4.11.0
NumPy: 1.26.4
Matplotlib: 3.10.3
Test 1
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = np.random.random([100, 199])
# OpenCV Visualization
cv2.imshow("win", img)
cv2.waitKey(0)
# Matplotlib Visualization
plt.imshow(img)
plt.show()
OpenCV 的可视化窗口可以正常显示;但关闭窗口后,后续代码无法运行
或者说,cv2.waitKey 卡死了后面的程序
Test 2
在 Test 1 基础上,将 cv2.waitKey 注释
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = np.random.random([100, 199])
# OpenCV Visualization
cv2.imshow("win", img)
# cv2.waitKey(0)
# Matplotlib Visualization
plt.imshow(img)
plt.show()
cv2.imshow 仍然可以显示,但因为没有 cv2.waitKey 窗口只是闪现了一下
除去报错中的无效信息,有助于排查错误的内容如下
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in " */lib/*/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.
找到目录 */lib/*/site-packages/cv2/qt/plugins,其中确实有一个叫做 libqxcb.so 的文件
所以问题在于,Matplotlib 无法使用 OpenCV 的 libqxcb.so
Test 3
在 Test 1 基础上,将 cv2 的相关代码注释
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = np.random.random([100, 199])
# OpenCV Visualization
# cv2.imshow("win", img)
# cv2.waitKey(0)
# Matplotlib Visualization
plt.imshow(img)
plt.show()
在 /usr 目录下搜索 libqxcb.so,尝试替换 OpenCV 自带的 (即替换 */lib/*/site-packages/cv2/qt/plugins 下的 libqxcb.so),回退的话直接重装 opencv-python 即可
直到 plt.show 可以正常显示,我用的是 /usr/local/cuda-12.8/nsight-systems-2024.6.2/host-linux-x64/Plugins/platforms/libqxcb.so
如果此时重新运行 Test 1 的代码,那么 cv2.imshow 会引发以下报错
qt.qpa.plugin: Could not find the Qt platform plugin "xcb" in "*/lib/*/site-packages/cv2/qt/plugins"
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Summary
也就是说,在我的这个环境下,没有一个 libqxcb.so 可以兼容 OpenCV 和 Matplotlib
此外还需要解决的,是 cv2.waitKey 会卡死程序的问题