web-dev-qa-db-fra.com

Après l'installation de ROS Kinetic, impossible d'importer OpenCV

J'ai d'abord installé openCV à partir des sources en utilisant ce script . Lorsque j'ai testé, cela fonctionnait bien.

Après avoir installé ROS kinetic , et ouvert python3 et exécuté import cv2, j'ai le message d'erreur suivant:

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
20
Alex

Il semble que ce problème soit dû au fait que ROS a ajouté /opt/ros/kinetic/lib/python2.7/dist-packages au chemin python. Cela se produit réellement lorsque vous activez ROS avec la commande source /opt/ros/kinetic/setup.bash. Cette ligne est souvent ajoutée à la fin de votre fichier bashrc, dans /home/username/.bashrc

Une solution de contournement consiste à supprimer cette ligne du fichier bashrc. De cette façon, les packages opencv de python3 seront correctement utilisés et vous pourrez toujours exécuter source /opt/ros/kinetic/setup.bash pour utiliser ROS. Cependant, cela signifie que vous ne pouvez pas utiliser ROS et python3 à partir du même environnement.

J'espère que quelqu'un pourra trouver une meilleure réponse, mais cela devrait fonctionner jusque-là.

15
Paul

Si vous travaillez avec anaconda, activez l'environnement à partir duquel vous souhaitez travailler et supprimez le responsable de sys.path.

Pour ce faire, ouvrez une console python3 à partir de laquelle:

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

Vous verrez plusieurs chemins parmi lesquels vous devriez remarquer:

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

Puis retirez-le:

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

Testé avec python3.5 sur anaconda3 avec une compilation compilée localement. Ceci est probablement applicable à virtualenvs également.

Pour une solution permanente, supprimez le chemin '/opt/ros/kinetic/lib/python2.7/dist-packages' de ~/.bashrc comme indiqué dans la réponse de @ Paul.

10
calocedrus

Avait exactement le même problème. Le problème est que ROS crée son propre fichier cv2.so pour Python 2, puis achemine chaque demande d’importation vers ce fichier. C'est une solution assez facile:

allez dans le dossier de votre site-packages 

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

notez que si vous utilisez un environnement virtuel, vous devez être dans cet environnement et faire plutôt quelque chose comme:

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

Ensuite, forcez cette fois un nouveau lien symbolique en utilisant le drapeau -f

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

Et ça devrait arranger les choses! 

6
Javalin597

Étape 1: Trouvez le chemin où votre cv2.so est installé (si vous utilisez la molette python-cv pour installer l'opencv)

Étape 2: exportez le chemin vers votre fichier .bashrc ou .zshrc, comme ceci:

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

Merci à @ lxrd-aj

4
David Lee

J'ai essayé de Supprimer /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so.Maintenant, cela fonctionne. 

3
jeff wang

En fait, je rencontre aussi ce problème. Je viens de commenter la source: 

/opt/ros/kinetic/setup.bash

et ensuite, ouvrez le terminal, dans le chemin de l'anaconda lib j'ai exécuté:

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 est le chemin où mon python3 a été installé, et /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so était le chemin où opencv-python était installé.

Je ne sais pas encore pourquoi cette commande fonctionne, mais cela m'a permis de résoudre le problème lié au fait que je ne pouvais pas importer cv2 auparavant.

2
Shuai Li

Lors de l'installation de ROS exécutant /opt/ros/kinetic/setup.bash, le script entre autres choses ira à tous les paquetages de distribution pour python2 et python3 et sera ajouté au chemin du système python. Lorsque vous essayez d'importer cv2 à l'aide de python3, il commence par trouver la liaison cv2 pour Python2 incluse dans le chemin.

Si vous n'envisagez pas d'utiliser python2.7 pour votre projet ROS, envisagez de supprimer entièrement le paquet OpenCV python2.7 afin qu'il ne soit pas ajouté au chemin d'accès lors de l'exécution du script d'installation Ros: 

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

Une autre approche plus douce si vous envisagez d’utiliser les deux versions de Python consiste à créer deux environnements virtuels avec les liaisons correctes et à les activer l’une ou l’autre en fonction de vos besoins.

1
Veilkrand

Si aucune de ces solutions ne fonctionne pour vous (comme dans mon cas), vous pouvez toujours essayer d'inciter votre système à importer le bon logiciel.

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')

Vous pourriez peut-être envisager de remplacer le chemin d'accès python ros au bon emplacement après avoir importé cv2.

Il semble que mon python ait eu des problèmes pour importer le bon cv2 alors que le chemin était correctement défini, probablement à cause du nom étrange de la bibliothèque cv2 python3 (cv2.cpython-35m-x86_64-linux-gnu.so) par rapport au cv2. j'ai donc dans /opt/ros/kinetic/lib/python2.7/dist-packages

1
Mehdi

Problème similaire ici. Comme d'autres l'ont suggéré, /opt/ros/kinetic/setup.bash ajoute un chemin d'accès à ROS opencv dans la variable PYTHONPATH.

Si vous travaillez avec plusieurs virtualenvs et que vous avez besoin d'une solution qui fonctionnera dans la plupart des cas, vous pouvez alors placer l'extrait de code suivant dans votre .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

L'idée est donc que si vous avez un répertoire centralisé de tous vos virtualenvs (par exemple, lorsque vous utilisez virtualenvwrapper), nous pouvons rechercher ces répertoires en utilisant:

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

étant donné que tous nos virtualenvs sont sous ~/.virtualenvs. Cela devrait nous donner une liste de tous nos répertoires racine virtualenvs.

Nous parcourons ensuite le tableau des répertoires virtualenv et nous ajoutons leur chemin (par exemple, ~/.virtualenvs/testenv/lib/python2.7/site-packages) à la variable PYTHONPATH. Notez que cela devrait être fait juste après le source /opt/ros/kinetic/setup.bash.

Ce n'est pas une solution parfaite au problème car vous pouvez toujours avoir des conflits si deux environnements ont des versions différentes d'openv, mais pour le problème initial, au moins cela devrait fonctionner.

Alternativement, vous pouvez simplement faire manuellement la même astuce pour le virtualenv souhaité:

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