Table des matières

Projet de Vision pour la robotique

Dans le cadre du confinement imposé par le gouvernement, vous devrez travailler à domicile. Profitons de cette occasion pour que vous puissiez mettre en oeuvre par vous même les concepts et utiliser les outils présentés dans le module de Vision: https://bvdp.inetdoc.net/wiki/doku.php?id=visionlpro

Vous devrez développer une application en langage Python utilisant la librairie OpenCV afin de réaliser les différents traitements d'une tâche de vision.

Lors des développements, vous pourrez communiquer avec l'enseignant par mail afin d'obtenir des informations. Les informations pertinentes seront mises en commun sur le wiki pour que tous puissent en bénéficier. Vous devrez vous assurer que la réponse à votre question n'est pas déjà présente sur le wiki avant de la poser, afin de minimiser les échanges inutiles.

La quantité de travail pour ce projet est de l'ordre de 26 heures. Il sera évalué sur la base du code produit par l'étudiant, sur les interactions que nous aurons eu (vous devrez faire preuve d'autonomie mais ne pas rester bloqué et donc solliciter de l'aide avant de perdre trop de temps) ainsi que sur le rapport que vous devrez fournir en fin de projet. Ce rapport devra comporter:

  1. Un échéancier faisant apparaître clairement le temps passé sur chaque étape.
  2. La description des étapes de traitement que vous aurez réalisé, et une justification pour chacun des choix que vous aurez fait.
  3. Une liste d'images que vous aurez traitées ainsi que les résultats de traitement attendus et obtenus.
  4. Une analyse de votre travail indiquant ce qui fonctionne (ou pas), ce qu'il faudrait faire pour améliorer (ou faire fonctionner).

Séances de visio conférences

Séance n°1: visio conférence le 20 mars de 14 à 16h :

  1. Installation des outils PyCharm, python 3.8 et librairie openCV.
  2. Documentation opencv 4.2.0: https://docs.opencv.org/4.2.0/
  3. Présentation du projet
  4. Présentation rapide des fonctions pour la rectification d'images: *getPerspectiveTransform()* et *warpPerspective()*

Séance n°2: visio conférence le 25 mars de 15 à 18h :

  1. Point sur les avancements des projets étudiants
  2. Explications sur la manipulation des matrices avec la librairie numpy
  3. Explications sur les transformations projectives et les fonctions d'openCV
  4. Présentation des fonctions pour l'interface utilisateur pour récupérer les positions de pixels des coins dans les images

Séance n°3: visio conférence le 31 mars de 10 à 12h :

  1. Point sur les avancements des projets étudiants
  2. Explications sur les fonctions d'enregistrement et de chargement des matrices avec numpy: np.genfromtxt, np.reshape(…), np.load, np.savez . https://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html
  3. Aide à la recherche de problème sur le projet de Mr Dufaux concernant l'interaction avec l'utilisateur
  4. Présentation des approches top-down et bottom-up
  5. Proposition d'une méthode bottom-up pour la détection automatique de la face du rubiks cube dans l'image

Séance n°4: visio conférence le 3 avril de 15 à 16h :

  1. Point sur les avancements des projets étudiants
  2. Aide à la recherche de problème sur le projet de Mr Dufaux concernant la mesure de distance entre deux couleurs
  3. Conseils pour le rapport

Etape 1: Installation des outils de développement et premiers test

Dans un premier temps, vous devez installer les outils et librairies nécessaires.

Système Linux Debian

Première situation, la plus simple, vous disposez d'un système d'exploitation Linux avec distribution Debian (éventuellement installé dans une machine virtuelle avec un outil comme Virtualbox). Ce système peut être installé sur une carte raspberry Pi comme en TP ou bien sur votre PC.

Pour installer les outils, copier coller une ligne après l'autre dans une console (en vérifiant qu'il n'y a pas de message d'erreur):

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install python3-opencv  libjasper-dev libqtgui4 libqt4-test libtiff5 libgstreamer1.0-0  libqtcore4  libopenexr23 libatlas3-base libsz2 build-essential cmake pkg-config libjpeg-dev libtiff5-dev libjasper-dev libpng-dev libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libxvidcore-dev libx264-dev libfontconfig1-dev libcairo2-dev libgdk-pixbuf2.0-dev libpango1.0-dev libgtk2.0-dev libgtk-3-dev libatlas-base-dev gfortran libhdf5-dev libhdf5-serial-dev libhdf5-103 libqtgui4 libqtwebkit4 libqt4-test python3-pyqt5 python3-dev nano python3-pyqt4 screen  imagemagick gitk iotop lsof geeqie idle3 python3-pip 
sudo python3 -m pip  install imutils
sudo python3 -m pip  install opencv-python
sudo python3 -m pip  install matplotlib

Système Windows

Cette seconde situation est moins simple, et votre enseignant n'a pas une aussi bonne maîtrise. Vous privilégierez donc la première si possible.

Télécharger et installer Python 3.8.2 depuis: https://www.python.org/ftp/python/3.8.2/python-3.8.2-amd64.exe Lors de l'installation, cocher Add Python 3.8 to PATH.

Installation de pyCharm (choisir la version Community): https://www.jetbrains.com/fr-fr/pycharm/

Lancer pycharm

Faire “New Project”

cocher “Existing interpreter”, puis “…” puis choisir “System Interpreter”, puis “Ok”

Cliquer sur “Create”

File→“Settings”

Ouvrir petite flêche à gauche de “Project: untitled”

“Project Interpreter”

cocher le signe + à droite de “Latest Version”

taper opencv dans la zone de texte recherche, choisir le paquet opencv-pythoon , vérifier qu'il est bien en version 4.2.0.32, puis cliquer en bas sur “Install Package”. Ceci installe openCV et sa dépendance numpy.

Pour créer un fichier python dans le projet, clic droit sur Project→New→Python File puis saisir ne nom du fichier, par exemple test1.py

saisir dans le fichier python le code suivant:

test1.py
import cv2
im=cv2.imread('riz.jpg')
cv2.imshow('image1',im)
cv2.waitKey(0)
cv2.destroyAllWindows()

Télécharger le fichier bvdp.inetdoc.net_files_iut_tp_lpro_vision_riz.jpg et le sauver dans le dossier du fichier test1.py sous le nom riz.jpg . Ensuite lancer votre programme en cliquant sur Run→Run test1 (ou Maj+F10).

Installation pour les possesseurs de windows 10 Pro N

A l'exécution, on obtient le message d'erreur suivant: import cv2 File “C:\Users\B\AppData\Local\Programs\Python\Python38\lib\site-packages\cv2\init.py”, line 3, in <module> from .cv2 import * ImportError: DLL load failed while importing cv2: Le module spécifié est introuvable.

D'après https://stackoverflow.com/questions/52349669/dll-load-failed-when-import-cv2-opencv:

This can happen if you are using windows 10 N distribution, the N distributions does not come preinstalled with windows media feature pack, which is required after OpenCV version 3.4 and onwards.
The preferred solution is to install the feature pack at : 

https://www.microsoft.com/en-us/software-download/mediafeaturepack

En cas de problème lors de l'exécution de l'installeur: https://pcsecurise.fr/demander/comment-corriger-le-code-derreur-windows-update-0x8008000005/

Pour résoudre le problème:

  1. Appuyez sur les touches Windows + I pour ouvrir les Paramètres.
  2. Ouvrez maintenant la rubrique Mises à jour & Sécurité dans le volet de gauche.
  3. Cliquez sur Dépannage.
  4. Cliquez sur Windows Update et sélectionnez Lancer le Dépanneur.

Ressources externes pour l'installation

Ci dessous des liens vers des tutos d'installation, pas nécessaires si la procédure d'installation précédente s'est déroulée correctement.

La page suivante détaille l'installation de python3 et openCV sous windows: https://solarianprogrammer.com/2016/09/17/install-opencv-3-with-python-3-on-windows/

Vous pouvez ensuite installer l'environnement de développement idle3 comme en TP, en suivant les instructions de: http://maths.spip.ac-rouen.fr/IMG/pdf/idle-windows.pdf

Premiers tests

Vous devriez maintenant pouvoir exécuter les programmes que nous avons développé ensemble et qui sont sur la page: https://bvdp.inetdoc.net/wiki/doku.php?id=visionlpro

Etape 2: Projet RubiksCube

Dans un premier temps, vous devrez re développer l'application réalisant la lecture d'une face du rubikscube. Cette application a été décrite dans les modules de vision industrielle et de robotique de manipulation Kuka. Les étapes du traitement sont rappelées ici:

L'image de test à traiter est:

Image 0: bvdp.inetdoc.net_files_iut_tp_lpro_vision_rubiks.jpg

Vous devez spécifier manuellement les coordonnées des 4 coins de la face à traiter:

Image 1:

Vous devez ensuite générer une image rectifiée (par application de l'homographie) de la face du cube avec une résolution de 31×31 pixels:

Image 2:

Vous devez ensuite déterminer pour chacun des pixels de l'image quelle est la couleur (parmi les 6 couleurs apprises) la plus proche:

Image 3:

Vous devez finalement effectuer un vote pour chacune des cases du rubiks cube en utilisant les différentes valeurs calculées précédemment, et générer une image de 3×3 pixels:

Image 4:

Fichier d'exemple sur l'utilisation de numpy pour manipuler les matrices et utilisation des fonctions de calcul et d'application d'homographie:

hom.py
import cv2
import numpy as np
rouge=np.array([  0,   0, 255])
print(str(rouge))
mat= np.zeros((4, 2), dtype="float32")
print(mat)
imagette_couleur=np.zeros((4, 2,3), dtype="uint8")
 
imagette_couleur[0][0]=rouge
imagette_couleur[3][0]=rouge
imagette_couleur[3][1]=rouge
cv2.imwrite('imagette.png',imagette_couleur)
 
 
 
 
src= np.zeros((4, 2), dtype="float32")
dst= np.zeros((4, 2), dtype="float32")
retval=cv2.getPerspectiveTransform(src,dst) #solveMethod= DECOMP_LU 
 
''' matrice obtenue	
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 1.]]
'''
 
xi=20
yi=30
Pi= np.zeros((3, 1), dtype="float32")
Pi[0]=xi
Pi[1]=yi
Pi[2]=1
 
print(Pi)
 
np.matmul(retval,Pi)
 
 
maxWidth=2
maxHeight=2
dst = np.array([        [0, 0],        [maxWidth - 1, 0],        [maxWidth - 1, maxHeight - 1],        [0, maxHeight - 1]], dtype="float32")
src = np.array([        [0, 0],        [maxWidth - 1, 0],        [maxWidth - 1, maxHeight - 1],        [0, maxHeight - 1]], dtype="float32")
print(src)
print(dst)
retval=cv2.getPerspectiveTransform(src,dst)
print(retval)
#on obtient identité à la précision numérique près
 
#
tx=100
dst = np.array([        [0+tx, 0],        [maxWidth - 1+tx, 0],        [maxWidth - 1+tx, maxHeight - 1],        [0+tx, maxHeight - 1]], dtype="float32")
src = np.array([        [0, 0],        [maxWidth - 1, 0],        [maxWidth - 1, maxHeight - 1],        [0, maxHeight - 1]], dtype="float32")
retval=cv2.getPerspectiveTransform(src,dst)
print(retval)
 
img = cv2.imread('rubiks.jpg')
[haut,larg,nbcomposantes]=img.shape
print(haut)
print(larg)
dst=cv2.warpPerspective(img, retval, (haut,larg))
 
#affichage
cv2.imshow('image1',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

Fonctions utilisables

interaction utilisateur: https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_table_of_contents_gui/py_table_of_contents_gui.html#py-table-of-content-gui

Etape 3: Projets Bonus individualisés

Après que l'enseignant ait validé des résultats sur le premier projet, il pourra vous affecter l'un des projets individuels suivants:

Traitement d'images individuelles

Détecter des carrés et rectangles dans l'image et mesurer longueur/largeur/surface/position et orientation

Détecter des disques (pièces de monnaie) et mesurer position et orientation (par template matching)

Détecter des clous et mesurer leur longueur/position

Apprentissage et classification par réseau de neurones CNN: https://www.pyimagesearch.com/2018/11/19/mask-r-cnn-with-opencv/

Comptage du nombre d'anneaux concentriques (dans un premier temps intégralement vus dans l'image puis partiellement)

Traitement d'image de profondeur acquise avec la caméra RGB-D realsense

traitement d'image avec projecteurs lasers

Détecter des lignes pour robot mobile

Estimation de pose 3D avec tag 2D aruco pour la réalité augmentée: https://www.uco.es/investiga/grupos/ava/node/26

Détections de défauts sur objet manufacturé: motifs périodiques sur un tissus

Détecter différentes postures de main

Traitement d'images en séquence

Traitement d'une paire d'images acquises successivement pour la mesure de vitesse d'un objet sur un tapis