---
title: INFO911 (TP0) Installation et prise en main d'OpenCV
---
INFO911 (TP0) Installation et prise en main d'OpenCV
===
[TOC]
> [name=Jacques-Olivier Lachaud][time=Novembre 2020][color=#907bf7]
###### tags: `info911` `tp`
Retour à [INFO911 (Main) Traitement et analyse d'image](https://codimd.math.cnrs.fr/s/UE_B59gMy)
## Présentation d'OpenCV
OpenCV ([https://opencv.org](https://opencv.org)) est la bibliothèque open-source de référence pour le domaine de la vision par ordinateur. Elle dispose d'un noyau de fonctionnalités et de structures de données pratiques pour manipuler et traiter des images de dimension arbitraire. Beaucoup d'algorithmes sont déjà implémentés et il existe de nombreux modules "third-party" qui contiennent des algorithmes très pointus.
> Elle est aussi très utilisée par les entreprises (e.g. EDGYN, ex-Arjo solutions, sur Technolac, à 300m)
Elle a des atouts très intéressants:
* noyau en C++ sur les dernières versions (quelques restes de C), assez efficace, avec beaucoup d'optimisations (GPU via OpenCL ou CUDA)
* wrapper pour Python et JAVA, pratique pour prototyper ou pour des scripts
* cross-plateforme : Linux, MacOS, Windows
* plein de fonctionnalités d'acquisition d'image, de traitement, d'analyse, de reconnaissance de formes (surtout third-party), de learning
* développement rapide de prototypes
* la généricité de la bibliothèque est un peu faite main, avec peu de templates, mais du coup la programmation demande moins d'expertise C++, et ça compile plus vite.
* open-source, bien documentée (quoique un peu fouillie parfois)
* gestion de la mémoire "intelligente", bonne gestion des exceptions.
## Installation facile
* Les TPs seront à faire avec OpenCV et en C++ (supporte aussi Python et JAVA)
* Vous devez regarder le tutoriel [Installing OpenCV](https://docs.opencv.org/master/df/d65/tutorial_table_of_content_introduction.html)
### Installation d'OpenCV (MacOS avec brew)
Pour ceux qui ont [HomeBrew](https://brew.sh/index_fr), c'est (maintenant) très simple d'installer OpenCV sur MacOS:
```
brew install opencv
```
### Installation d'OpenCV (Linux)
Il y a plusieurs façons d'installer OpenCV (cf la doc OpenCV). Voilà ce que j'ai fait sous Linux et MacOS, en installant à partir des sources.
* on récupère les sources `opencv` et `opencv_contrib`
```shell
# Install minimal prerequisites (Ubuntu 18.04 as reference)
sudo apt update && sudo apt install -y cmake g++ wget unzip
# Download and unpack sources 4.6
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.6.0.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/4.6.0.zip
unzip opencv.zip
unzip opencv_contrib.zip
# Create build directory and switch into it
mkdir -p build && cd build
```
* on paramètre correctement avec `cmake` ou `ccmake`, puis on build et installe
```shell
# Configure
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.6.0/modules ../opencv-4.6.0
# Build
cmake --build .
```
## Installation complète avec interface Qt
:::warning
On peut utiliser la partie "High-level GUI" de l'interface fournie par [OpenCV](https://docs.opencv.org/master/index.html).
OpenCV **doit** alors avoir été compilé avec `WITH_QT` (donc Qt doit être installé)
:::
:::danger
Pour ceux qui n'ont pas bien vu, **Qt** **doit** **être** **installé** **au** **préalable** (et notamment les bibliothèques de développement de Qt).
:::
### Installation d'OpenCV (Linux / MacOS)
Il y a plusieurs façons d'installer OpenCV (cf la doc OpenCV). Voilà ce que j'ai fait sous Linux et MacOS, en installant à partir des sources.
* on récupère les sources `opencv` et `opencv_contrib`
```
wget -O opencv.zip https://github.com/opencv/opencv/archive/master.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/master.zip
unzip opencv.zip # on dézippe les sources
unzip opencv_contrib.zip # on dézippe les sources
mkdir build; cd build # on va dans un rép. build
```
* on paramètre correctement avec `cmake` ou `ccmake`, puis on build et installe
```shell
cmake -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-master/modules \
-DWITH_QT=ON -DCMAKE_BUILD_TYPE=Release ../opencv-master
```
* On vérifie que cmake a bien trouvé Qt. Par exemple avec l'outil `ccmake`
```
ccmake ../opencv-master
# puis naviguez vers le bas et vérifiez que l'option WITH_QT vaut YES
```
* Si c'est bon, compilez tout et installez avec
```shell
make -j 4 # on compile avec 4 threads
sudo make install # on installe dans /usr/local
```
## Test de l'installation
Le petit programme suivant doit compiler et s'exécuter (si vous avez l'image "lena.pgm" dans votre répertoire).
```cpp=
// minimum-prog.cpp
#include <opencv2/highgui.hpp>
using namespace cv;
int main()
{
int value = 128;
namedWindow( "Youpi"); // crée une fenêtre
createTrackbar( "track", "Youpi", nullptr, 255, NULL); // un slider
setTrackbarPos( "track", "Youpi", value ); // met à 128
Mat f = imread("lena.png"); // lit l'image "lena.png"
imshow( "Youpi", f ); // l'affiche dans la fenêtre
while ( waitKey(50) < 0 ) ; // attend une touche
value = getTrackbarPos( "track", "Youpi" ); // récupère la valeur
std::cout << "value=" << value << std::endl;
}
```
Pour compiler, vous pouvez suivre les instructions données sur le site. Quant à moi, j'utilise l'outil `cmake` qui génère le `Makefile`. Voilà le `CMakeLists.txt` que j'utilise
```cmake=
cmake_minimum_required(VERSION 3.5)
project( DisplayImage )
set (CMAKE_CXX_STANDARD 11)
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
SET( MAIN_EXEC
minimum-prog
# vous pouvez ajouter d'autres programmes ici
)
FOREACH(FILE ${MAIN_EXEC})
add_executable( ${FILE} ${FILE}.cpp )
target_link_libraries( ${FILE} ${OpenCV_LIBS} )
ENDFOREACH(FILE)
```
La première fois, on crée un répertoire `build` et on utilise `cmake` ainsi:
```shell=
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release .. # ou Debug
```
Puis on tape `make` pour recompiler à chaque fois que nécessaire.
## Prise en main d'OpenCV
Il s'agit de faire preuve d'autonomie ici et de découvrir OpenCV via ses premiers tutoriels, ainsi que par quelques exemples.
* [OpenCV core functionalities](https://docs.opencv.org/master/de/d7a/tutorial_table_of_content_core.html)
* Le plus important est de maîtriser la manipulation de la classe `Mat`, le tableau multidimensionnel qui représente les images, de comprendre la gestion des canaux (type entier/flottant, nombres), et de savoir parcourir une image
* [Mat - the basic image container](https://docs.opencv.org/master/d6/d6d/tutorial_mat_the_basic_image_container.html)
* [How to scan images](https://docs.opencv.org/master/db/da5/tutorial_how_to_scan_images.html)
* Ensuite, il s'agit de savoir modifier et faire des traitements élémentaires sur les images, les afficher Installation d’OpenCV sous Windows
ou les enregistrer
* [Mask operations on images](https://docs.opencv.org/master/d7/d37/tutorial_mat_mask_operations.html)
* [Operations on images, I/O](https://docs.opencv.org/master/d5/d98/tutorial_mat_operations.html)
* [Changing brightness and contrast](https://docs.opencv.org/master/d3/dc1/tutorial_basic_linear_transform.html)
Avec tout ça, vous devriez être bien armé pour attaquer la suite.
## Foire aux questions
* Avec `cmake`, n'oubliez pas de faire un répertoire `build`, puis allez dedans avant de configurer avec un `cmake .. <paramètres>`
* Si vous configurez opencv avec cmake pour l'installation, même avec WITH_QT, mais que vous n'avez pas installé Qt (dev) avant, vous ne compilerez pas toute l'IHM de opencv. Vérifiez bien avec ```ccmake ../opencv-master``` que `WITH_QT=Yes`.
* Si, lorsque vous compilez et exécutez `minimum-prog`, le programme vous fait une erreur à l'exécution du genre:`assertion failed: ... .width > 0 and ... .height > 0 ...`, c'est tout simplement que l'image `lena.png` n'est pas dans votre répertoire courant d'exécution.
* Si, lorsque vous compilez et exécutez `minimum-prog`, l'image `lena.png` s'affiche bien mais que vous ne voyez pas les boutons au-dessus (zoom, copy to clipboard, save, etc), c'est que vous n'avez pas compilé avec Qt.