11 days ago

最近更新图像算法,在本机测试时运行正常,代码移植到工控机后程序报错

module 'cv2.cv2' has no attribute 'xfeatures2d'

经过搜索后发现工控机系统缺少opencv-contrib模块,鉴于工控机没有联网,于是开启一系列探索之旅
现在将整个过程记录下来,便于后续使用

1.在联网的电脑上下载opencv-contrib-python安装包

pip download -d ./ opencv-contrib-python==3.4.2.17

以上代码表示:将opencv-contrib-python==3.4.2.17的安装包下载到当前文件夹,不进行安装操作

opencv-contrib的版本不要太高,否则sift = cv.xfeatures2d.SIFT_create()函数无法调用(虽然现在搞不懂什么原因)
经过实测,版本高于3.4.2.17都无法使用

2.卸载opencv

将刚刚下载好的安装包拷贝到工控机
安装opencv-contrib之前需要卸载之前安装过的opencv(当然如果你直接没装过opencv,直接忽略这一步)
根据官方文档的说法,opencv-python只包含main模块,opencv-contrib-python包含main模块和contrib模块
所以正常情况下只需要安装opencv-contrib-python就够了

pip uninstall opencv-python

程序报错,理所当然的权限不够

sudo pip uninstall opencv-python

报错:“sudo: pip:找不到命令”
解决这个问题直接放上相关技术帖:Ubuntu sudo: pip:找不到命令
然后继续执行sudo pip uninstall opencv-python

3.安装opencv-python

pip install opencv-contrib-python==3.4.2.17.whl

安装成功后,运行程序开始报错

Traceback (most recent call last):
  File "tppj.py", line 5, in <module>
    import cv2 as cv
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type

经过搜索,开始了解了关于pip install的一些真相

$ pip install
# 安装目录  /home/用户名/.local/lib/python3.5/site-packages

$ sudo pip install     
# 在python安装中全局安装包,即对所有用户安装。
# 安装目录 /usr/local/lib/python3.5/dist-packages

$ pip install --user   
#安装到本地用户目录,即 ~/.local/lib/python
# 仅仅对当前用户生效

这种情况下,要想解决问题,要么在程序第一行(import之前)加入代码

import sys
sys.path.insert(0, '/usr/local/lib/python3.5/dist-packages/')

要么索性直接 sudo pip install opencv-contrib-python==3.4.2.17.whl

问题主要在于import sys;sys.path里面的路径以及路径的顺序
具体可以出门左转见前一篇博客文章 Linux中添加python环境变量

参考资料:
module 'cv2.cv2' has no attribute 'xfeatures2d'
OpenCV3.X Python3.X: cv2.xfeatures2d 无法使用问题解决
opencv-contrib-Python编译module 'cv2.cv2' has no attribute 'xfeatures2d'
opencv官方文档
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type

← Linux中添加python环境变量