大伙儿应该都用过PyQT这个玩意吧,基本上来说,是用pytho写前端最方便,做多见的一个库函数了。但是呢,今天我就遇到了一个问题,Could not load the Qt platform plugin ''xcb" in “/xxxxx/envs/SAM2/lib/python3.12/site-packages/cv2/qt/plugins” even though it was found. ,这个地方j加粗的xxx是你自己的python环境。仔细一看,这个错还挺搞笑的啊,就是告诉你找到了,但是我就是load不了他。。。
而且,更加诡异的是,这个错居然还是opencv里面报出来的,你说这不是胡闹吗。。。。anyway,根据我一顿摸爬滚打的探索,终于找到了一个最方便的解决这个问题的方法。
Could not load the Qt platform plugin ''xcb" in "/xxxxx/envs/SAM2/lib/python3.12/site-packages/cv2/qt/plugins" even though it was found.
这个报错通常与 Qt 库的配置或依赖项的问题有关,尤其是在使用 OpenCV 和 PyQt 时。如果你在一个虚拟环境中运行代码,或者使用了不同版本的依赖库,可能会导致 Qt 平台插件加载失败。
首先呢,这里给出思绪无限的解决方法。这个帖子里面总结了一些常见的解决方法,基本可以解决绝大部分的问题。
但是嘞,在我的这篇帖子里面,我给出一个更加无痛的方法,是啥呢,其实很简单,说白了这个opencv告诉你自己的QT导入不了,那咱就不伺候了呗,咱们自己直接下载一个完整版的QT,不用opencv自带的这个QT就可以了。接下来,咱们看看具体应该怎么做哈:
首先,你需要找到系统中 Qt 插件的位置。在大多数 Linux 发行版中,Qt 插件通常位于 /usr/lib/x86_64-linux-gnu/qt5/plugins 或类似的目录。你可以使用 find 命令来查找 Qt 插件目录:
find /usr -type d -name "qt5"
一旦你确定了系统的 Qt 插件路径,你需要将这个路径告知 Python 应用,以便它可以正确加载这些插件。在你的终端中运行以下命令:
export QT_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/qt5/plugins
如果你的 Qt 插件路径不同,请将上述路径替换为正确的路径。这条命令设置了一个环境变量 QT_PLUGIN_PATH,它告诉 Qt 从哪里加载插件。在使用 OpenCV 时,程序将忽略 OpenCV 自带的 Qt 库,转而使用系统的 Qt 插件。
如果你希望每次启动脚本时都自动设置 QT_PLUGIN_PATH,可以在脚本的开头添加以下代码:
import os
# 指定系统中 Qt 插件的路径
os.environ['QT_PLUGIN_PATH'] = '/usr/lib/x86_64-linux-gnu/qt5/plugins'
这样,每次运行脚本时,都会自动使用系统的 Qt 插件路径。
如果你想确认你的程序确实使用了系统的 Qt 插件,你可以在脚本中插入以下代码来检查:
import PyQt5.QtCore
print(PyQt5.QtCore.QLibraryInfo.location(PyQt5.QtCore.QLibraryInfo.PluginsPath))
这将打印出当前正在使用的 Qt 插件路径,确认是否使用了你设置的路径。
注意,如果你发现你已经设置了路径,但是你发现还是在程序还是在报一样的错,也就是说他还在去找那个倒霉opencv里面的QT,这是咋回事儿呢。。。?这个问题可能是由于多个原因引起的,尤其是在使用虚拟环境时。尽管你已经指定了 QT_PLUGIN_PATH,但由于 OpenCV 自带的 Qt 插件路径依然在系统中存在并且优先级较高,程序可能仍会尝试加载错误的插件路径。
那么,针对这个问题,可以试试以下的解决方法。
一种直接的解决方案是删除或重命名 OpenCV 自带的 Qt 插件目录,这样程序就不会尝试加载错误的插件。假设你已经定位到了 OpenCV 自带的 Qt 插件目录(错误信息中提到的路径为/xxxxx/envs/SAM2/lib/python3.12/site-packages/cv2/qt/plugins),你可以尝试通过以下命令重命名这个目录:
mv /xxxxx/envs/SAM2/lib/python3.12/site-packages/cv2/qt/plugins /xxxxx/envs/SAM2/lib/python3.12/site-packages/cv2/qt/plugins_backup
通过这种方式,程序将无法加载 OpenCV 自带的插件路径,而是只能使用你在 QT_PLUGIN_PATH 中指定的系统路径。
有时,其他 Qt 相关的环境变量可能会影响插件加载行为。你可以尝试清除或修改以下环境变量:
unset QT_QPA_PLATFORM_PLUGIN_PATH
unset QT_PLUGIN_PATH
unset QT_QPA_PLATFORM
然后在脚本中明确设置 QT_PLUGIN_PATH 为系统的插件路径。
OK,解决啦