安装ROS Kinetic后,无法导入OpenCV

Ale*_*lex 32 opencv python-3.x ros

我首先使用此脚本从源代码安装openCV .当我测试它运行良好.

安装ROS动能后,打开python3并运行import cv2,出现以下错误:

Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so: undefined symbol: PyCObject_Type
Run Code Online (Sandbox Code Playgroud)

Pau*_*aul 23

看起来这个问题是由ROS添加/opt/ros/kinetic/lib/python2.7/dist-packages到python路径引起的.当您使用命令激活ROS时,实际上会发生这种情况source /opt/ros/kinetic/setup.bash.这行通常会添加到bashrc文件的末尾/home/username/.bashrc.

解决方法是从bashrc文件中删除此行.这样就可以正确使用python3 opencv包,你仍然可以运行source /opt/ros/kinetic/setup.bash使用ROS.但是,这确实意味着您无法在同一环境中使用ROS和python3.

希望有人可以提出更好的答案,但这应该适用于此.

  • 我的解决方法是不删除ROS添加的python路径,而是将anaconda附加到它上面,例如`export PYTHONPATH ="/ home/userx/anaconda3/lib/python3.5/site-packages:$ PYTHONPATH"` (3认同)
  • 你好。我已经评论了我的 bashrc 文件中的行,并在我的代码中添加了 `sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages/')`。当我打印路径时它没有出现,但在我导入 cv2 时仍然会引起问题。你能帮我吗? (2认同)

cal*_*rus 15

如果您正在使用anaconda,请激活您想要使用的环境,并从中删除罪魁祸首sys.path.

为此,打开一个python3控制台,从中控制:

>>> import sys
>>> print(sys.path)
Run Code Online (Sandbox Code Playgroud)

您将看到几条路径,其中您应该注意到:

'/opt/ros/kinetic/lib/python2.7/dist-packages'
Run Code Online (Sandbox Code Playgroud)

然后删除它:

>>> sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
Run Code Online (Sandbox Code Playgroud)

使用本地编译的opencv在anaconda3上使用python3.5进行测试.这也可能适用virtualenvs.

要获得永久性解决方案,请'/opt/ros/kinetic/lib/python2.7/dist-packages'~/.bashrc@Paul的答案中删除路径.


zky*_*ony 13

正如所指出的,source /opt/ros/kinetic/setup.bash您中的命令将.bashrc修改PYTHONPATH为:

> echo $PYTHONPATH
/opt/ros/kinetic/lib/python2.7/dist-packages
Run Code Online (Sandbox Code Playgroud)

就我而言,由于我在 Python 3 项目中使用了 virtualenv,因此我只运行以下命令来清除PYTHONPATH变量,同时激活 virtualenv。

unset PYTHONPATH
Run Code Online (Sandbox Code Playgroud)

现在,cv2在 Python 3 virtualenv 中导入可以正常工作。我验证了以下路径cv2

unset PYTHONPATH
Run Code Online (Sandbox Code Playgroud)

为避免每次激活该 virtualenv 时都必须运行此命令,我将其添加到/bin/activatevirtualenv 目录中的文件中,如下所示:

In [1]: import cv2
In [2]: cv2.__file__
Out[2]: '<path_to_virtualenv>/lib/python3.5/site-packages/cv2/cv2.cpython-35m-x86_64-linux-gnu.so'
Run Code Online (Sandbox Code Playgroud)


小智 7

有完全相同的问题.问题是ROS为python 2创建了自己的cv2.so文件,然后将每个导入请求路由到该文件.这是一个非常简单的修复:

转到您的site-packages文件夹

cd /usr/local/lib/python3.5/site-packages/
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用的是虚拟环境,则必须使用虚拟环境,而应该执行以下操作:

cd ~/.virtualenvs/cv/lib/python3.5/site-packages/
Run Code Online (Sandbox Code Playgroud)

然后,使用-f标志强制新的sym-link

ln -sf /usr/local/lib/python3.5/site-packages/cv2.so cv2.so
Run Code Online (Sandbox Code Playgroud)

这应该解决问题!


Meh*_*hdi 6

如果这些解决方案都不适合您(如我的情况),您仍然可以尝试欺骗您的系统导入正确的 opencv

ros_path = '/opt/ros/kinetic/lib/python2.7/dist-packages'

if ros_path in sys.path:

    sys.path.remove()

import cv2

sys.path.append('/opt/ros/kinetic/lib/python2.7/dist-packages')
Run Code Online (Sandbox Code Playgroud)

也许你可以考虑在导入 cv2 后在正确的位置替换 ros python 路径。

即使路径设置正确,我的python似乎在导入正确的cv2时遇到问题,可能是因为与cv2相比python3 cv2库(cv2.cpython-35m-x86_64-linux-gnu.so)的奇怪命名。所以我在 /opt/ros/kinetic/lib/python2.7/dist-packages


小智 5

步骤1:找到您的cv2.so的安装路径(如果您使用python-cv wheel安装opencv)

步骤2:将路径导出到.bashrc或.zshrc文件,如下所示:

export PYTHONPATH="/home/userx/anaconda3/lib/python3.5/site-package??s:$PYTHONPATH"
Run Code Online (Sandbox Code Playgroud)

感谢@ lxrd-aj