Cours:Classif : Différence entre versions
Ligne 105 : | Ligne 105 : | ||
# Binarisation (cf <code>threshold_image</code> dans Dlib) | # Binarisation (cf <code>threshold_image</code> dans Dlib) | ||
# (si plusieurs objets) Segmentation (cf <code>segment_image()</code> dans Dlib) | # (si plusieurs objets) Segmentation (cf <code>segment_image()</code> dans Dlib) | ||
+ | |||
+ | * En ne plaçant qu'un seul objet dans le champ de la camera, calculer et afficher ses descripteurs de forme : longueur/largeur de l'objet, cf https://raphael.candelier.fr/?blog=Image%20Moments | ||
Si besoin, conversion d'une image Dlib en une image CImg : | Si besoin, conversion d'une image Dlib en une image CImg : | ||
Ligne 113 : | Ligne 115 : | ||
} | } | ||
</source> | </source> | ||
− | |||
− | |||
==== Identification par KNN ==== | ==== Identification par KNN ==== |
Version du 1 février 2024 à 12:03
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.
Sommaire
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
Attention, l'affichage des images avec Dlib et CImg sera déporté sur votre PC en X11 forwarding (option "Forward to local display" dans QtCreator ou "ssh -X" pour la connection depuis un terminal)
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
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 ligneload_image(img, argv[1]);
paroad_image("image.png");
pour lire une image que vous aurez acquis aveclibcamera
).
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
, qui renvoit une image RGB Dlib, 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;
}
- Utiliser cette fonction
imcapture
pour écrire un programme qui capture une image et l'affiche.
Prétraitements et mesure de descripteurs
- Conversion en image niv. de gris (cf
assign_image()
dans Dlib) - Binarisation (cf
threshold_image
dans Dlib) - (si plusieurs objets) Segmentation (cf
segment_image()
dans Dlib)
- En ne plaçant qu'un seul objet dans le champ de la camera, calculer et afficher ses descripteurs de forme : longueur/largeur de l'objet, cf https://raphael.candelier.fr/?blog=Image%20Moments
Si besoin, conversion d'une image Dlib en une image CImg :
CImg<unsigned char> image(img_gray.nc(), img_gray.nr());
cimg_forXY(image,x,y) {
image(x,y) = 255-(unsigned char)bin_img[y][x];
}
Identification par KNN
- A coder
Identification par SVM
- En utilisant Dlib