Utiliser OpenCV avec Python et C++ sous Raspbian


OpenCV (Open Computer Vision) est une puissante bibliothèque graphique libre, compatible avec les système d'exploitation Linux, Windows et Mac OS et utilisable avec les langages de programmation Python, C++ et Java.
OpenCV est spécialisée dans le traitement d’images et possède également de nombreuses fonctionnalités en traitement vidéo, en calcul matriciel et en intellignce artificielle. À la date d'écriture de ces lignes (novembre 2020), la dernière version d'OpenCV est la version 4.5.

Dans ce qui suit, on utilise un ordinateur Raspberry Pi4 doté de 2Go de mémoire vive et d'une SD card de 32Go. On utilise le système d'exploitation "Raspberry Pi OS with desktop and recommended software" (Raspbian - version du 20 août 2020 qui s'appuie sur le noyau Linux 5.4.51. téléchargeable depuis le site de la Fondation Raspberry Pi.

Pour tester l'installation et l'utilisation d'OpenCV sous Raspbian, on suit ici la démarche suivante :
1) On utilise une version neuve de Raspbian;
2) On installe OpenCV;
3) On utilise OpenCV avec Python;
4) On utilise OpenCV avec le compilateurg++.

1) Utiliser une version neuve de Raspbian

Lors de l'installation ou de l'utilisation d'OpenCV, divers problèmes ou conflits sont susceptibles d'etre rencontrés lorsque le système d'exploitation utilisé a déjà été abondamment modifié, de façon plus ou moins maitrisée, en laissant en place des versions incompatibles de paquets ou de fichiers de configuration.

Dans ce cas, il est préférable de repartir à zéro, avec une version "propre" de Raspbian. Pour cela, on formate une SD Card en fat32 et on installe sur cette carte une version neuve de Raspbian (Raspberry Pi OS).

Dès la première utilisation de Raspbian, on examine la liste des paquets installés, à l'aide de la commande dpkg-query -l. Avec la version de Raspbian du 20 août 2020, on obtient la liste suivante.

Fichier source : liste-01.txt

En examinant cette liste, on peut vérifier que
1) OpenCV n'est pas installé (il n'existe pas de fichiers "libopencv...");
2) Python est installé (les versions 2.7.16 et 3.7.3 de Python cohabitent);
4) GCC version 8.3 (notamment gcc et g++) est installé (ceci est également vérifiable avec les commandes gcc -v et g++ -v).

2) Installer OpenCV

Pour installer le paquet de développement OpenCV, il suffit tout simplement d'utiliser la commande sudo apt-get install libopencv-dev.
Pour installer le paquet (wrapper) permettant d'assurer les liaisons python-OpenCV, on peut utiliser l'outil pip de python ou directement la commande sudo apt-get install python3-opencv

Dans le cas présent, on réalise ces opérations en saisissant les deux commandes suivantes dans le Terminal de commandes:
sudo apt-get update
sudo apt-get install libopencv-dev python3-opencv

À l'aide de la commande dpkg-query -l, on examine la liste des paquets installés suite à ces deux commandes. On obtient la liste suivante.

Fichier source : liste-02.txt

En examinant cette liste, on peut vérifier que OpenCV 3.2.0 est désormais installé en version runtime et en version de développement (fichier libopencv-dev).

3) Utiliser OpenCV avec Python

Pour utiliser OpenCV avec Python, on ouvre l'IDE Thonny (menu "Framboise/Programmation") puis on saisit les commandes suivantes dans la partie Shell située en bas de la fenêtre de Thonny :
import cv2
cv2.__version__
La réponse '3.2.0' apparaît aussitôt en retour, indiquant la bonne prise en compte d'OpenCV

01

On enregistre, dans un fichier essai.py, le code source suivant qui affiche simplement une image dans une fenêtre. On place l'image essai.png dans le répertoire du programme essai.py.

import cv2
img = cv2.imread('essai.png',1)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Fichier source : essai.py

On clique le bouton Run et le programme s'exécute aussitôt.

02

4) utiliser OpenCV avec g++

4.1) Compiler avec l'outil cmake

Une solution classique, pour compiler avec GCC-g++ en prenant en compte la librairie opencv, consiste à utiliser l'outil cmake.
cmake est un outil qui permet de créer plus facilement un exécutable lorqu'on a un projet plus ou moins complexe, comprenant divers fichiers et dépendances (notamment des librairies) dont les emplacements (voir les existences) exacts ne sont pas toujours vérifiés ou connus.

On commence par examiner la liste des paquets installés (cf liste-02.txt ci-dessus). En examinant cette liste, on peut vérifier que cmake n'est pas installé.

Pour installer cmake, on saisit les commandes suivantes dans le terminal de commande:
sudo apt-get update
sudo apt-get -y install cmake

Remarque:
L'option -y n'est pas obligatoire. Cette option indique que l'on souhaite que la commande s'exécute sans interruption. Ainsi, on saute automatiquement la demande de confirmation de l'installation (O/N) lorsqu'on installe un package.

À l'aide de la commande dpkg-query -l, on examine la liste des paquets installés suite de ces deux commandes. On obtient la liste suivante:

Fichier source : liste-03.txt

On constate que l'outil cmake version 3.13.4 est désormais installé.

On crée le fichier essai.cpp suivant qui se contente d'afficher dans une fenêtre l'image essai.png contenue dans le répertoire du programme.
/* essai.cpp */
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat image;
image = imread( "essai.png", 1 );
if ( !image.data )
{
printf("fichier image non trouvé ! \n");
return -1;
}
namedWindow("essai", WINDOW_AUTOSIZE );
imshow("essai", image);
waitKey(0);
return 0;
}

Fichier source : essai.cpp

On crée le fichier CMakeLists.txt suivant

cmake_minimum_required(VERSION 2.8)
project( essai )
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
add_executable( essai essai.cpp )
target_link_libraries( essai ${OpenCV_LIBS} )

Fichier source : CMakeLists.txt

Depuis le terminal, ouvert dans le répertoire du fichier essai.cpp, on saisit les commandes suivantes:
cmake .
make
./essai

La commande cmake . crée le fichier make;
La commande make crée l'exécutable essai;
La commande ./essai exécute le programme.

03

4.2) Compiler sans l'outil cmake

Pour compiler un projet simple, il n'est pas nécessaire d'utiliser cmake. Il suffit d'utiliser le compilateur g++ de GCC à l'aide de la commande suivante.
g++ essai.cpp -o essai `pkg-config --cflags --libs opencv`
./essai

04

Remarque 1
Dans la commande de compilation, il faut obligatoirement utiliser des apostrophes inversées ` et non pas des apostrophes droites '. En effet la commande g++ essai.cpp -o essai 'pkg-config --cflags --libs opencv' avec des apostrophes droites entraine l'erreur "g++: error: pkg-config --cflags --libs opencv: Aucun fichier ou dossier de ce type"

Remarque 2
OpenCV fonctionne avec le langage C++ (fichiers .cpp et .hpp) et non pas avec le langage C (fichiers .c et .h).
Une tentative de compilation d'un fichier source C (et non pas C++) avec le compilateur gcc (au lieu de g++) de GCC entraine les messages d"erreurs suivants :
gcc ess.c -o ess `pkg-config --cflags --libs opencv`

pi@raspberrypi:~/Documents $ gcc ess.c -o ess `pkg-config --cflags --libs opencv`
In file included from /usr/include/opencv2/opencv.hpp:52,
from ess.c:3:
/usr/include/opencv2/core.hpp:49:4: error: #error core.hpp header must be compiled as C++
# error core.hpp header must be compiled as C++
^~~~~
In file included from /usr/include/opencv2/core.hpp:54,
from /usr/include/opencv2/opencv.hpp:52,
from ess.c:3:
/usr/include/opencv2/core/base.hpp:49:4: error: #error base.hpp header must be compiled as C++
# error base.hpp header must be compiled as C++
^~~~~
In file included from /usr/include/opencv2/core.hpp:54,
from /usr/include/opencv2/opencv.hpp:52,
from ess.c:3:
/usr/include/opencv2/core/base.hpp:54:10: fatal error: climits: Aucun fichier ou dossier de ce type
#include <climits>
^~~~~~~~~
compilation terminated.
pi@raspberrypi:~/Documents $