902 views
--- 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.