因为需要学习SLAM,最近装了Ubuntu系统,想到去年在Windows系统用PyCharm编写过一个基于PyQt5的图像处理Python程序(该项目之后要申请软件著作权,申请完后来补链接),思考将其移植到Ubuntu平台上需要做什么修改,从结果来看还是遇到了很多bug。
统一环境
由于我在Windows上使用Anaconda管理环境,深知其方便所在,所以也追求移植后一致的开发环境。
我在Ubuntu20.04上安装了Anaconda,还安装了PyCharm,将这个图像处理程序的环境设置在Anaconda中,按照当时列出的requirements.txt用和当初一样的pip install命令安装一致版本的依赖:
pip install opencv-python==4.5.1.48 pip install PyQt5==5.15.4
然后就出bug了…
问题描述
在PyCharm里运行后报如下错误:
QObject::moveToThread: Current thread (0x55a85eef2e00) is not the object's thread (0x55a85edecf50). Cannot move to target thread (0x55a85eef2e00) qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "/home/mcqueen-zero/anaconda3/envs/imgproapp/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. 进程已结束,退出代码134 (interrupted by signal 6: SIGABRT)
原因分析
参考Ubuntu自身环境已经安装的Qt与OPENCV冲突,具体到我的问题可能是Ubuntu环境里的Qt和我anaconda环境里的opencv-python不知怎么产生了冲突。他给出的方法是直接删除Qt,我也忘记了我Ubuntu里的Qt是啥时候怎么装的,我感觉是装ROS的时候连带安装的,不能轻易删除。
此外,切换到该项目对应的anaconda环境后,conda list命令列出了该环境下的所有库,是正确合理的;但用pip list命令却还列出了ros相关的一系列库,而这些是当初ros装的。我已经conda activate切换到这个环境了,按理说应该不会出现这些库,我就思考这个pip方法安装的包是不是无法做到版本隔离,或者说anaconda里的pip包无法和Ubuntu里的pip包隔离。
解决方案
又查到OPENCV和ROS冲突,看来是普遍问题,为了方便采用其提到的最后一种方法,全部改为conda install方法安装,缺点就是无法做到依赖版本完全一致:
conda install opencv conda install pyqt
注意conda方法是安装opencv而非opencv-python。
然后遇到了from cv2.cv2 import xxx找不到cv2.cv2的bug,还需安装:
pip install opencv-contrib-python
之后程序可以运行,Qt的界面也可以显示了,查询主要安装的库版本为:
| Name | Version | Channel |
|---|---|---|
| opencv | 4.5.4 | |
| pyqt | 5.9.2 | |
| opencv-contrib-python | 4.5.5.64 | pypi |
| numpy | 1.22.3 | pypi |



