安装ROS Kinetic后,无法导入OpenCV

时间:2017-03-25 17:59:24

标签: python-3.x opencv ros

我首先使用此script从源代码安装openCV。 当我测试时它运行良好。

安装ROS kinetic后,打开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

12 个答案:

答案 0 :(得分:15)

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

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

希望有人可以提出更好的答案,但这应该会有效。

答案 1 :(得分:12)

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

为此,打开一个python3控制台,其中包含:

>>> import sys
>>> print(sys.path)

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

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

然后删除它:

>>> sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')

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

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

答案 2 :(得分:7)

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

转到您的site-packages文件夹

cd /usr/local/lib/python3.5/site-packages/

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

cd ~/.virtualenvs/cv/lib/python3.5/site-packages/

然后,这次使用-f标志强制一个新的sym-link

ln -sf /usr/local/lib/python3.5/site-packages/cv2.so cv2.so

那应该解决问题!

答案 3 :(得分:5)

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

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

export PYTHONPATH="/home/userx/anaconda3/lib/python3.5/site-package‌​s:$PYTHONPATH"

感谢@lxrd-aj

答案 4 :(得分:4)

我试过 删除/opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so. 现在它正在运作。

答案 5 :(得分:2)

实际上,我也遇到过这个问题。我刚刚评论了消息来源:

/opt/ros/kinetic/setup.bash

然后,打开终端,在我执行的anaconda lib路径中:

  

sudo ln -sf /home/apg/miniconda3/lib/python3.6/site-packages/cv2.so   /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so

/home/apg/miniconda3是我安装python3的路径,/opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so是安装opencv-python的路径。

我不知道为什么这个命令有效,但它确实对我解决了以前我无法导入cv2的问题。

答案 6 :(得分:2)

如果这些解决方案都不适合您(如我的情况),您仍然可以尝试诱使系统导入正确的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')

也许您可能会考虑在导入cv2之后在正确的位置替换ros python路径。

即使路径设置正确,似乎我的python还是无法导入正确的cv2,这可能是因为python3 cv2库(cv2.cpython-35m-x86_64-linux-gnu.so)的命名很奇怪我在/opt/ros/kinetic/lib/python2.7/dist-packages中找到了cv2.so

答案 7 :(得分:1)

在运行/opt/ros/kinetic/setup.bash的ROS设置期间,其他脚本之间的脚本将进入python2和python3的每个分发包,并将其添加到python系统路径中。当您尝试使用python3导入cv2时,它将首先找到该路径中包含的Python2的cv2绑定。

如果您根本不打算为ROS项目使用python2.7,请考虑完全删除python2.7 OpenCV软件包,因此在运行ros设置脚本时不会将其添加到路径中:

$ rm /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so

如果打算同时使用两个Python版本,则另一种更为温和的方法是使用正确的绑定创建两个虚拟环境,然后根据需要激活一个或另一个。

答案 8 :(得分:0)

这里有类似的问题。正如其他人建议的那样,/opt/ros/kinetic/setup.bash在变量PYTHONPATH中向ROS opencv附加了路径。

如果您要使用多个virtualenv,并且需要在大多数情况下都可以使用的解决方案,则可以将以下代码段放入.bashrc中:

source /opt/ros/kinetic/setup.bash
array=( $(find ~/.virtualenvs/ -mindepth 1 -maxdepth 1 -type d) )

for i in "${array[@]}"
do
  export PYTHONPATH="$i/lib/python2.7/site-packages:$PYTHONPATH"
done

因此,我们的想法是,如果您拥有所有virtualenv的集中目录(例如,当您使用virtualenvwrapper时),我们可以使用以下方法搜索这些目录:

$(find ~/.virtualenvs/ -mindepth 1 -maxdepth 1 -type d)

假设我们所有的virtualenv都在~/.virtualenvs下。这应该给我们所有virtualenv根目录的列表。

然后,我们遍历virtualenv目录数组,并将其路径(例如~/.virtualenvs/testenv/lib/python2.7/site-packages)附加到PYTHONPATH。请注意,应该在source /opt/ros/kinetic/setup.bash之后之后完成该操作。

这不是完美的解决方案,因为如果两个环境具有不同的opencv版本,您仍然会发生冲突,但是对于最初的问题,至少它应该可以工作。

或者,您可以手动对所需的virtualenv执行相同的技巧:

export PYTHONPATH=~/.virtualenvs/testenv/lib/python2.7/site-packages:$PYTHONPATH

答案 9 :(得分:0)

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

> echo $PYTHONPATH
/opt/ros/kinetic/lib/python2.7/dist-packages

在我的情况下,由于我为Python 3项目使用了virtualenv,因此我在启用virtualenv的同时运行了以下命令来清除PYTHONPATH变量。

unset PYTHONPATH

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

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'

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

...
# unset irrelevant variables
deactivate nondestructive

unset PYTHONPATH

VIRTUAL_ENV="/home/kaiyuzh/pyenv/py3"
export VIRTUAL_ENV
...

答案 10 :(得分:0)

我以前在Ubuntu 16.04上安装了ROS和catkin_tools,突然遇到了同样的问题。 对其进行修复如下:

  1. 导航到主目录
  2. 在编辑器中打开.bashrc(通常默认情况下隐藏此文件;如果是这样,请按ctrl + h将其显示)
  3. 注释掉或删除source /opt/ros/kinetic/setup.bashsource ~/catkin_ws/devel/setup.bash两行。通过将#放在相应两行的前面来注释掉作品。
  4. 保存文件
  5. 重新启动PC

完成。

答案 11 :(得分:0)

您可以暂时删除 ROS PATHimport cv2

这是我处理该问题的解决方案:

import sys

try:
    import cv2
except ImportError:
    ros_path = '/opt/ros/kinetic/lib/python2.7/dist-packages'
    sys.path.remove(ros_path)
    import cv2
    sys.path.append(ros_path)