Cours:Classif : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
Ligne 49 : Ligne 49 :
 
* Pour le contenu de votre <code>main.cpp</code>, vous pourrez utiliser l'exemple suivant http://dlib.net/image_ex.cpp.html (en remplaçant éventuellement la ligne <code>load_image(img, argv[1]);</code> par <code>oad_image("image.png");</code> pour lire une image que vous aurez acquis avec <code>libcamera</code>).
 
* Pour le contenu de votre <code>main.cpp</code>, vous pourrez utiliser l'exemple suivant http://dlib.net/image_ex.cpp.html (en remplaçant éventuellement la ligne <code>load_image(img, argv[1]);</code> par <code>oad_image("image.png");</code> pour lire une image que vous aurez acquis avec <code>libcamera</code>).
  
==== Mise en place de la librairie Dlib ====
+
==== Mise en place de la librairie CImg ====
  
 
La librairie CImg est constituée d'un unique ficher <code>CImg.h</code>
 
La librairie CImg est constituée d'un unique ficher <code>CImg.h</code>
Ligne 72 : Ligne 72 :
 
     return 0;
 
     return 0;
 
}
 
}
 +
</source>
 +
 +
* Votre fichier <code>.pro</code> est plus simple que pour Dlib, vous n'aurez qu'à rajouter la ligne suivante :
 +
<source>
 +
LIBS += -ljpeg -lm -lX11 -lpthread -pedantic -Dcimg_use_vt100 -Dcimg_display=1
 
</source>
 
</source>
  

Version du 31 janvier 2024 à 16:55

TP Classification : détection d'objet en temps réel

Le travail de cette étape va consister à

  • analyser des images acquise en "temps réel" afin de détecter et identifier des objets
  • les objets seront
    • dans un premier temps des jetons de nain jaune
    • dans un second temps des briques lego.

Technos matérielles et logicielles

Vous utiliserez :

  • Une Rpi 4 que vous programmerez depuis vos postes linux (en cross-compilation)
  • Une camera PiCam Wide (grand angle)
  • la librairie CImg pour des traitements bas niveaux et affichages : https://cimg.eu/
  • la librairie Dlib pour des traitements simples et la reconnaissance : http://dlib.net/

Vous travaillerez dans un dossier dit "DE TRAVAIL", qui contiendra

  • les dossiers de vos projets QtCreator
  • le code des librairies Dlib et CImg téléchargées

(dans mes exemples, c'est /home/nicoli01/tests)

Prise d'images en terminal

  • Connecter (si cela n'est pas fait) la PiCam à la Rpi4
  • Tester la PiCam avec libcamera-hello (la capture doit s'afficher sur l'écran de la Rpi)
  • Tester l'acquisition d'image avec l'éxecutable libcamera-still
  • Explorer les options de cette application (libcamera-still -h), en particulier -n, --immediate, --width, --height et -o

Mise en place de la librairie Dlib

Cette fonction exploite la librairie Dlib :

  • Créer un projet dans QtCreator de type Non-Qt C++
  • Télécharger la librairie depuis http://dlib.net, la décompresser et placer son dossier au même niveau que votre dossier de projet
  • Modifier votre fichier .pro de la façon suivante :
`
QMAKE_CXXFLAGS += -DDLIB_JPEG_SUPPORT
INCLUDEPATH += /home/nicoli01/tests # A REMPLACER PAR LE CHEMIN VERS VOTRE DOSSIER DE TRAVAIL
SOURCES += \
        /home/nicoli01/tests/dlib/all/source.cpp ## A REMPLACER DANS VOTRE CAS
LIBS += -ljpeg -lm -lX11 -lpthread
Ne pas oublier les deux lignes
target.path = /root
INSTALLS = target
  • Pour le contenu de votre main.cpp, vous pourrez utiliser l'exemple suivant http://dlib.net/image_ex.cpp.html (en remplaçant éventuellement la ligne load_image(img, argv[1]); par oad_image("image.png"); pour lire une image que vous aurez acquis avec libcamera).

Mise en place de la librairie CImg

La librairie CImg est constituée d'un unique ficher CImg.h

  • Télécharger la librairie depuis https://cimg.eu/download.html, décompresser et copier le fichier CImg.h dans votre dossier de travail
  • Faire un nouveau projet non Qt, avec le main.cpp suivant
#include <iostream>

#include "/home/nicoli01/tests/testcimg/CImg.h" // A REMPLACER DANS VOTRE CAS

using namespace cimg_library;

using namespace std;

int main()
{
    cout << "Hello World!" << endl;

    CImg<unsigned char> image("/root/im.png"); // A REMPLACER DANS VOTRE CAS
    image.display("hello");
    return 0;
}
  • Votre fichier .pro est plus simple que pour Dlib, vous n'aurez qu'à rajouter la ligne suivante :
LIBS += -ljpeg -lm -lX11 -lpthread -pedantic -Dcimg_use_vt100 -Dcimg_display=1

Prise d'images en c++

Voici une fonction imcapture que vous pourrez utiliser pour réaliser une acquisition d'image en c++

array2d<rgb_pixel> imcapture() {
	array2d<rgb_pixel> image;
    int pb = system("rm im.png 2>/dev/null; libcamera-still -n 1 --immediate --width 640 --height 480 -o im.png 2> /dev/null ");
	if (pb) {
		cout << "ERROR: no image acquisition" << endl;
		exit(1);
	} else {
		image = load("im.png");
	}
	return image;		
}

Prétraitements et mesure de descripteurs

Identification par KNN

  • A coder

Identification par SVM

  • En utilisant Dlib