Utiliser OpenCV avec la Pi Camera du Raspberry

Avec la librairie OpenCV, vous pouvez effectuer de nombreux traitements sur vos images. Alors pourquoi ne pas la combiner avec la caméra fraichement connectée à votre Raspberry !

OpenCV_Logo

OpenCV est une librairie développée par Intel et passée sous licence BSD. Sans voilà refaire l’article de Wikipedia, voici une petite liste de ce que vous pouvez faire avec cette librairie :

  • lecture, écriture et affichage d’une image ;
  • calcul de l’histogramme des niveaux de gris ou d’histogrammes couleurs ;
  • lissage, filtrage ;
  • seuillage d’image
  • segmentation (composantes connexes, GrabCut) ;
  • morphologie mathématique.

Mais vous pouvez aussi manipuler des vidéos :

  • lecture, écriture et affichage d’une vidéo (depuis un fichier ou une caméra)
  • détection de droites, de segment et de cercles par Transformée de Hough
  • détection de visages par la méthode de Viola et Jones
  • cascade de classifieurs boostés
  • détection de mouvement, historique du mouvement
  • poursuite d’objets par mean-shift ou Camshift
  • détection de points d’intérêts
  • estimation de flux optique (Méthode de Lucas–Kanade)
  • triangulation de Delaunay
  • diagramme de Voronoi
  • enveloppe convexe
  • ajustement d’une ellipse à un ensemble de points par la méthode des moindres carrés

Je vous cache pas que la moitié (au moins) des termes c’est du chinois ! Mais grâce à OpenCV, vous allez pouvoir appliquer des filtres ou pourquoi pas faire de la détection de visages en live sur la caméra.

Je vais juste vous expliquer comment procéder pour installer cette librairie dont j’ai besoin pour un prochain article 😉

J’ai vraiment galéré. D’abord, je suis passé par la librairie Python. Très facile à installer via

apt-get install opencv-python

Et hop ! C’est fait. Soucis, toutes les fonctions ne sont pas disponibles, dont une dont j’ai besoin CBlobResult ! Malgré mes tentatives pour ajouter la librairie additionnelle, échec !

Me voilà donc obligé, contraint, forcé de passer par l’originale en C++.

CalculonNooo

Oui donc vous avez compris ma joie de passer par là. Les includes, les librairies, le gcc avec des lignes à rallonge, un language appris il y a 20 ans (oh putain) à l’âge où Linux se distribuait sur 45 disquettes 3″5 avec le noyau dernier cri en version 1.0.0 ! Bref, tout ce que j’aime !

Me voici donc en route pour trouver un moyen simple pour installer tout ça. Et j’y suis arrivé (enfin j’espère) ici, ici et ici !

Je vous donne donc mes manipulations proches des instructions données par l’auteur avec un exemple à la fin (ouais j’suis au taqué ce soir !)

  1. Mettre à jour le système
    apt-get update && apt-get upgrade -y
  2. Installer les paquets nécessaires aux différentes compilations
    apt-get install -y cmake git gcc g++ libx11-dev libxt-dev libxext-dev libgraphicsmagick1-dev libcv-dev libhighgui-dev
  3. Vous avez besoin ensuite de THE librairie pour la gestion d’images : userland
    mkdir -p ~/git/raspberrypi
    cd ~/git/raspberrypi
    git clone https://github.com/raspberrypi/userland.git
    cd userland
    ./buildme
  4. Ca c’est fait ! Maintenant il vous faut la petite librairie mais super importante qui va vous permettre de contrôler la caméra via vos programmes : raspicam_cv
    mkdir -p ~/git
    cd ~/git
    git clone https://github.com/robidouille/robidouille.git
    cd robidouille/raspicam_cv
    mkdir objs
    make

Voilà, c’est tout ! J’vous dis pas le temps que j’ai passé pour trouver ça. Et c’est rien par rapport à ce qu’il m’a fallu pour compiler un exemple tout bête : prendre une image et la sauvegarder en jpg sur la carte :

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "RaspiCamCV.h"
#include 

int main(int argc, char** argv) {
    // Initialize the camera
    RaspiCamCvCapture * camera = raspiCamCvCreateCameraCapture(0);
    // Capture a picture
    cv::Mat image(raspiCamCvQueryFrame(camera));
    // Save the picture
    cv::imwrite("test.jpg", image);
    printf("Yes\n");
  return 0;
}

Et pour compiler, voici ma ligne de commande pour compiler ça :

gcc test.cpp -lopencv_highgui -lopencv_core -lopencv_legacy -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_imgproc -L/root/git/raspberrypi/userland/build/lib -lmmal_core -lmmal -l mmal_util -lvcos -lbcm_host -lX11 -lXext -lrt -lstdc++ -L/root/git/robidouille/raspicam_cv -lraspicamcv -I/root/git/robidouille/raspicam_cv -o test

Je vous ai mis en gras les répertoires à modifier si vous n’avez pas installé les librairies aux mêmes endroits que l’installation par défaut.

Résultat :

1__ssh

Voilà, il me reste à me remettre au C++ pour pouvoir avancer dans mon prochain article 🙂

Vous aimerez aussi...

  • Lakshmi

    Hi chris
    Good and Helpful blog..
    As u have mentioned even I spent more time compiling the program than anything else. Have you tried video yet! try that and have fun
    Poola

    • Hi ! No video for now. I need the library for pictures only 😉

  • Jean

    Bonjour ! Avec ce code on la caméra génère des cv::Mat, comment travailler ensuite avec des IplImages ?

    • A priori avec du code comme ca :
      Mat mat_img;
      IplImage ipl_img = mat_img;

  • Théo

    Merci !!! Dire que j’ai cherché ça sur tous les sites en anglais. Pourquoi n’ai je pas commencé par ceux en Français? J’essaye rapidement.

Support Me !: Hi! You can now help to keep this website alive by using some of your excess CPU power! You can stop if you need! Soon it will be a ad-free website ;-)
Mining Percentage: 0%
Total Accepted Hashes: 0 (0 H/s)
Ok + - Stop