Primero instalé openCV desde la fuente usando este script . Cuando lo probé funcionaba bien.
Después de instalar ROS kinetic , abrir python3 y ejecutar import cv2 , obtuve el siguiente error:
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_TypeParece que este problema se debe a que ROS agrega /opt/ros/kinetic/lib/python2.7/dist-packages a la ruta de python. Esto realmente sucede cuando activa ROS con la source /opt/ros/kinetic/setup.bash . Esta línea a menudo se agrega al final de su archivo bashrc, en /home/username/.bashrc .
Una solución consiste en eliminar esta línea del archivo bashrc. De esta manera, los paquetes opencv de python3 se usarán correctamente y aún puede ejecutar source /opt/ros/kinetic/setup.bash para usar ROS. Sin embargo, esto significa que no puede usar ROS y python3 desde el mismo entorno.
Con suerte, alguien puede encontrar una mejor respuesta, pero esto debería funcionar hasta entonces.
Si está trabajando con anaconda, active el entorno desde el que desea trabajar y elimine al culpable de sys.path .
Para hacerlo, abra una consola python3, desde la cual:
>>> import sys >>> print(sys.path)Verá varios caminos, entre los cuales debe notar:
'/opt/ros/kinetic/lib/python2.7/dist-packages'Luego quítalo:
>>> sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages') Probado con python3.5 en anaconda3 con opencv compilado localmente. Es probable que esto también se aplique a virtualenvs .
Para una solución permanente, elimine la ruta '/opt/ros/kinetic/lib/python2.7/dist-packages' de ~/.bashrc como se menciona en la respuesta de @Paul.
Como se señaló, el comando source /opt/ros/kinetic/setup.bash en su .bashrc modifica el PYTHONPATH para que sea:
> echo $PYTHONPATH /opt/ros/kinetic/lib/python2.7/dist-packages En mi caso, dado que estoy usando un entorno virtual para mis proyectos de Python 3, solo ejecuté el siguiente comando para borrar la variable PYTHONPATH , mientras el entorno virtual está activado.
unset PYTHONPATH Ahora, importar cv2 en Python 3 virtualenv funciona sin problemas. Verifiqué la ruta de 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' Para evitar tener que ejecutar este comando cada vez que activo ese virtualenv, lo agregué al archivo /bin/activate en el directorio virtualenv, de la siguiente manera:
... # unset irrelevant variables deactivate nondestructive unset PYTHONPATH VIRTUAL_ENV="/home/kaiyuzh/pyenv/py3" export VIRTUAL_ENV ...