I have first installed openCV from source using this script. When I tested it was working well.
After I installed ROS kinetic, and open python3 and run import cv2, got the following 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_Type
It looks like this problem is caused by ROS adding /opt/ros/kinetic/lib/python2.7/dist-packages to the python path. This actually happens when you activate ROS with the command source /opt/ros/kinetic/setup.bash. This line is often added at the end of your bashrc file, in /home/username/.bashrc.
A workaround is to remove this line from the bashrc file. This way the python3 opencv packages will be correctly used, and you can still run source /opt/ros/kinetic/setup.bash to use ROS. However, this does mean you cannot use ROS and python3 from the same environment.
Hopefully someone can come up with a better answer, but this should work until then.
If you are working with anaconda, activate the environment you want to work from, and remove the culprit from sys.path.
To do so, open a python3 console, from which:
>>> import sys
>>> print(sys.path)
You will see several path, among which you should notice:
'/opt/ros/kinetic/lib/python2.7/dist-packages'
Then remove it:
>>> sys.path.remove('/opt/ros/kinetic/lib/python2.7/dist-packages')
Tested with python3.5 on anaconda3 with locally compiled opencv. This is likely applicable to virtualenvs as well.
For a permanent solution, remove the path '/opt/ros/kinetic/lib/python2.7/dist-packages' from ~/.bashrc as mentioned in @Paul's answer.
As pointed out, the source /opt/ros/kinetic/setup.bash command in your .bashrc modifies the PYTHONPATH to be:
> echo $PYTHONPATH
/opt/ros/kinetic/lib/python2.7/dist-packages
In my case, since I am using a virtualenv for my Python 3 projects, I just ran the following command to clear the PYTHONPATH variable, while the virtualenv is activated.
unset PYTHONPATH
Now, importing cv2 in Python 3 virtualenv works cleanly. I verified the path of 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'
To avoid having to run this command every time I activate that virtualenv, I added it to the /bin/activate file in the virtualenv directory, as follows:
...
# unset irrelevant variables
deactivate nondestructive
unset PYTHONPATH
VIRTUAL_ENV="/home/kaiyuzh/pyenv/py3"
export VIRTUAL_ENV
...