J'ai remarqué que l'installation d'OpenCV en passant par l'utilitaire PIP de Python ne fonctionnait pas très bien avec une Raspberry Pi. Voici comment compiler OpenCV pour notre Raspberry Pi 4.
Nous allons configurer une Raspberry Pi 4 pour pouvoir compiler OpenCV 4.1.1, puis nous lancerons la compilation.
Finalement nous testerons que la bibliothèque OpenCV est bien installée pour Python3
Il se peut que l'EEPROM ne soit pas à jour juste après une installation de Raspbian sur une Raspberry Pi 4. Pour le vérifier, dans un terminal de commande, taper :
sudo rpi-eeprom-update -a
Si une mise à jour est nécessaire, elle se fera automatiquement.
Ne pas oublier de rebooter la Raspberry après la mise à jour.
sudo raspi-config
Et choisir :6 (Advanced options) > A1 (Expand Filesystem)
sudo apt-get update && sudo apt-get upgrade
Outils pour la compilation :
sudo apt-get install -y cmake gfortran libjpeg-dev libtiff-dev libgif-dev libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install -y libgtk2.0-dev libcanberra-gtk* libxvidcore-dev libx264-dev libgtk-3-dev libtbb2 libtbb-dev libdc1394-22-dev libv4l-dev libopenblas-dev libatlas-base-dev libblas-dev libjasper-dev liblapack-dev libhdf5-dev protobuf-compiler
Afin d'installer OpenCV, nous avons besoin de OpenCV et de opencv-contrib. Pour récupérer les version 4.5.0 de chacun à partir de leur dépôt officiel, taper les commandes :
cd ~
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.5.0.zip
unzip opencv.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.5.0.zip
unzip opencv_contrib.zip
mv opencv-4.5.0 opencv
mv opencv_contrib-4.5.0 opencv_contrib
rm opencv.zip opencv_contrib.zip
Vérification de la version de Python, la commande ...
python3 --version
... doit renvoyer quelque chose comme : Python 3.7.3
Nous pouvons ajouter le chemin de l'exécutable de python3.7 dans une variable d'environnement stockée dans le profil de l'utilisateur "pi" avec la commande :
echo "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3.7" >> ~/.bashrc
Rechargement du profile :
source ~/.bashrc
Installation de l'environnement virtuel :
sudo pip3 install virtualenv virtualenvwrapper
Création de l'environnement virtuel :
echo "export WORKON_HOME=$HOME/.virtualenvs" >> ~/.bashrc
echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrcsource ~/.bashrc
mkvirtualenv cv450
Installation de Numpy (processeur numérique) dans l'environnement virtuel (bien faire attention de na pas faire l'installation en sudo):
pip3 install numpy
Pour sortir de l'environnement virtuel, il faut faire :
deactivate
Afin de faciliter la compilation, nous allons augmenter la taille du fichier de swap utilisé par le système. Pour cela :
sudo vi /etc/dphys-swapfile
# set size to absolute value, leaving empty (default) then uses computed value
# you most likely don't want this, unless you have an special disk situation
# CONF_SWAPSIZE=100
CONF_SWAPSIZE=1024
Mise à jour du fichier de swap :
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start
Attention ! il faudra remettre le fichier de swap dans son état initial après la compilation d'OpenCV car un trop grand fichier de swap peut détruire rapidement les cartes SD.
Préparation de la compilation :
cd ~/opencv/
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \
-D ENABLE_NEON=ON \ -D ENABLE_VFPV3=ON \
-D WITH_OPENMP=ON \ -D BUILD_TIFF=ON \
-D WITH_FFMPEG=ON \ -D WITH_TBB=ON \
-D BUILD_TBB=ON \ -D BUILD_TESTS=OFF \
-D WITH_EIGEN=OFF \
-D WITH_V4L=ON \ -D WITH_LIBV4L=ON \
-D WITH_VTK=OFF \ -D WITH_QT=OFF \
-D OPENCV_ENABLE_NONFREE=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D INSTALL_PYTHON_EXAMPLES=OFF \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D BUILD_opencv_python3=TRUE \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D BUILD_EXAMPLES=OFF ..
Compilation (C'est TRES long, il faut compter environ 1h40 sur une Raspberry Pi 4 (1500 MHz - 2 MB) ):
make -j4
Installation d'OpenCV :
sudo make install
sudo ldconfig
sudo apt-get update
On remet le fichier de swap comme avant la compilation :
sudo vi /etc/dphys-swapfile
# set size to absolute value, leaving empty (default) then uses computed value
# you most likely don't want this, unless you have an special disk situation
CONF_SWAPSIZE=100
Mise à jour du fichier de swap :
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start
Vérification de l'installation de OpenCV avec la commande :
ls -l /usr/local/lib/python3.7/dist-packages/
... doit afficher un message du style :
-rw-r--r-- 1 root staff 1895772 Mar 20 20:00 cv2.so
Comme nous allons utiliser OpenCV dans un environnements virtuel Python (nommé cv450) , il nous faut construire un lien symbolique de la librairie OpenCV dans notre environnement :
cd ~/.virtualenvs/cv450/lib/python3.7/site-packages
ln -s /usr/local/lib/python3.7/dist-packages/cv2/python-3.7/cv2.cpython-37m-arm-linux-gnueabihf.so
On se met dans l'environnement virtuel prévu précédemment :
cd ~
mkvirtualenv cv450
Lancement de Python3 :
(cv450) pi@RPI-Camera:~ $ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44)[GCC 8.3.0] on linuxType "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'4.5.0'
>>> exit()
On a bien la version 4.5.0 installée pour python3 dans notre environnement virtuel cv2 !
Tout les fichiers ayant servi à la compilation ne sont plus nécessaire pour l'utilisation de OpenCV, on peut maintenant les supprimer.
Pour cela faire :
cd ~
sudo rm -rf ~/opencv
sudo rm -rf ~/opencv_contrib