=====Dépôt vers Moodle=====
Rendre votre projet avant le 13 décembre à 23h59! lien vers le cours moodle pour déposer le projet: https://moodle.iut-tlse3.fr/mod/assign/view.php?id=267430
Faire un dépôt par étudiant, donc chaque étudiant doit déposer le fichier zip du projet, qui doit contenir le nom des deux étudiants du binôme. Par exemple, pour les étudiants Pincemi et Pincemoi, rendre deux fois le fichier Pincemi_Pincemoi.zip
=====Installation des outils=====
Installation version portable à l'IUT
https://openscad.org/downloads.html
version 64bits zip: https://files.openscad.org/OpenSCAD-2021.01-x86-64.zip
notice openscad: https://files.openscad.org/documentation/manual/OpenSCAD_User_Manual.pdf
Openscad en ligne de commande: (lancer openscad avec l'option -h )
https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_OpenSCAD_in_a_command_line_environment
pour déterminer si opencv est installé sur les machine
pip show opencv-python
Location doit être en c:\Program....
protzdefaut=95;
protz=protzdefaut;
rotate([0,0,protz])
cube([1000,1000,1],center=true);
rem D:\OpenSCAD-2021.01-x86-64\openscad-2021.01\openscad.exe -h
D:\OpenSCAD-2021.01-x86-64\openscad-2021.01\openscad.exe -o image.png --imgsize=1024,768 --projection=p --camera=0,0,3000,0,0,0 scene.scad
import os
print("saevision")
for i in range(0,180,4):
#chaine="D:\OpenSCAD-2021.01-x86-64\openscad-2021.01\openscad.exe -o image\image.png -D protz=45 --imgsize=1024,768 --projection=p --camera=0,0,3000,0,0,0 scene.scad"
chaine="D:\OpenSCAD-2021.01-x86-64\openscad-2021.01\openscad.exe -o image\image"+str(i)+".png -D protz="+str(i)+" --imgsize=1024,768 --projection=p --camera=0,0,3000,0,0,0 scene.scad"
print(chaine)
os.system(chaine)
#avec génération du nom de fichier sur nombre de digits maitrisé:
import os
for i,protz in enumerate(range(0,180,10)):
numeroimage='{0:03d}'.format(i)
chaine="D:\OpenSCAD-2021.01-x86-64\openscad-2021.01\openscad.exe -o images\image"+numeroimage+".png --imgsize=1024,768 --camera=0,0,5000,0,0,0 --projection=p -D protz="+str(protz)+" scene.scad"
print(chaine)
os.system(chaine)
formatage de chaîne en python: https://docs.python.org/fr/3.5/library/string.html
import os
from pathlib import Path
print("sae vision")
for i in range (0,180,4):
'''
chaine=f"C:/Users/Maxime/Documents/openscad-2021.01/openscad.exe -o image/image{i}.png -D protz={i} --imgsize=1024,768 --projection=p --camera=0,0,3000,0,0,0 scene.scad"
chaine= str(os.path.join(Path.home(), "Documents"))
chaine=os.path.join(chaine,"openscad-2021.01")
chaine=os.path.join(chaine,"openscad.exe")
print(chaine)
'''
#si ajout d'openscad au path via SystemPropertiesAdvanced.exe
chaine=f"openscad.exe -o image/image{i}.png -D protz={i} --imgsize=1024,768 --projection=p --camera=0,0,3000,0,0,0 scene.scad"
print(chaine)
os.system(chaine)
====Ajout de Openscad au path pour vos PC personnels====
lancer SystemPropertiesAdvanced.exe et cliquer sur variable d'environnement puis 'path' et ajouter le chemin complet du fichier openscad.exe
module champ_de_vision (){
//Valeur choisie arbitrairement
color("FireBrick",0.2) hull(){
translate([400,100,250]) cube([169,169,1]);
translate([650,500,1150]) cube([5,5,0.2]);
}}
import os
import numpy as np
import cv2
import math
print("SAE Vision")
for i in range(0, 6000, 1000):
#chaine = f"C:/Users/victo/Desktop/openscad-2021.01/openscad.exe -o Image/image.png --imgsize=1024,768 -0 protz={str(i)} scene.scad"
#chaine = f'"C:/Users/victo/Desktop/openscad-2021.01/openscad.exe" -o Image/image{str(i)}.png --imgsize=1024,768 scene.scad --camera=0,0,3000,0,0,0 --projection p -D protzdefault={str(i)}'
filename=f"Image/image_Bouchon{str(i)}.png"
chaine = f'"C:/Users/victo/Desktop/openscad-2021.01/openscad.exe" -o {filename} --imgsize=1024,768 cage.scad --camera=50000,0,100000,0,0,0 --projection p -D transY={str(i)}'
print(chaine)
os.system(chaine)
img = cv2.imread(filename)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
=====Présentation SAE Vision Industrielle BUT3=====
Attention 1 séance encadrée de SAE sera en fait un examen de TP de Vision Industrielle (probablement le mardi 3 décembre 2024)
Évaluation :
- rendre via Moodle 1 fichier zip contenant le code + le rapport
- en séance, validation du fonctionnement et réponse à des questions
Explication espaces projectifs et homographies (+inverse)
https://docs.opencv.org/4.x/da/d54/group__imgproc__transform.html
Rectification d'images (exemple stéréo épipolaire + génération d'une vue fronto-parallèle)
Estimation d'homographie à partir de 4 (minimum) points 2D mis en correspondance
Mire à 4 points dans le plans
Génération d'images synthétiques avec Openscad
Modèles 3D du but2 + nouveaux modèles (mire etc)
CLI openscad syntaxe (lien)
Programme python pour générer des commandes CLI paramétriques (faire varier pose etc...)
Traitement des images synthétiques associées à vérité terrain
1 bouchon posé sur un plan P1, la face du bouchon est plane et contenue dans un plan P2 parallèle à P1
Le projet
Deux méthodes utilisant la rectification d'image: La face supérieure du bouchon = 2 disques colorés concentriques
Localisation par :
- mesure de corrélation avec un modèle synthétique (méthode 1)
- recherche de 2 cercles concentriques dans l'image de contours (méthode 2)
Une méthode utilisant l'image brute acquise par la caméra: (méthode 3) : face supérieure du bouchon = 2 ellipses obtenues par projection perspective de 2 disques colorés concentriques
Localisation par :
- détection d'ellipses dans l'image
- application de l'homographie inverse à l'ellipse pour obtenir le centre du cercle dans le plan du
Développement et tests sur les images synthétiques
Validation avec des images réelles
=====Étapes pour la méthode 1=====
Vous devrez tous réaliser au moins la méthode 1, dont les différentes étapes sont indiquées ci dessous. Vous pourrez ensuite réaliser les méthodes 2 et/ou 3 après validation de la méthode 1 par l'enseignant.
====Partie 1: Estimation de transformation rigide 2D====
Cette tache consiste à estimer 3 paramètres (2 en translation + 1 en rotation) pour une transformation rigide 2D entre 2 repères.
====Partie 2: Génération d'une image synthétique du bouchon====
Cette tache consiste à synthétiser deux images du bouchon: une image de couleur et une image de masque.
Faire une fonction **create_pattern_and_mask(width, height,d1,d2, bgr_color_center=(0, 0, 0),bgr_color_contour=(0, 0, 0)):** du programme
* width représente la largeur de l'image à générer
* height représente la hauteur de l'image à générer
* d1 correspond au diamètre du contour du bouchon à colorier en **bgr_color_contour** dans l'image **image**
* d2 correspond au diamètre de la région centrale du bouchon à colorier en **bgr_color_center** dans l'image **image**
L'image **mask** doit contenir un disque de diamètre d1 blanc, entouré de noir.
Les valeurs de couleurs sont indiquées dans un fichier à mettre dans le même dossier que le programme python:
160.0000, 119.0000, 109.0000
58.0000, 58.0000, 249.0000
exemple d'images à générer pour les paramètres par défaut du programme:
image: {{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/template_bouchon_mm.png}}
mask: {{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/template_mask_bouchon_mm.png}}
====Partie 3: Détection de la position du bouchon dans l'image rectifiée====
Cette tache consiste à rechercher la position dans l'image la plus similaire à l'image de bouchon composée de:
* l'image de couleur: {{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/template_bouchon_mm.png}}
* un masque indiquant le fond et la forme: {{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/template_mask_bouchon_mm.png}}
différentes images à traiter:
{{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/imabouchon1_rect.jpg}}
{{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/imabouchon2_rect.jpg}}
{{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/imabouchon3_rect.jpg}}
{{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/imabouchon4_rect.jpg}}
{{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/imabouchon5_rect.jpg}}
{{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/imabouchon6_rect.jpg}}
Vous devez faire la fonction **def processImage(image): ** pour rechercher la meilleure correlation entre l'image de référence du bouchon et l'image fournie dans **image** en utilisant la fonction **matchTemplate** d'openCV. La fonction **def processImage(image): ** doit retourner l'image avec le bouchon détecté en surimpression, une variable indiquant si le bouchon est détecté dans l'image, et les position x et y du centre du bouchon détécté dans l'image.
L'image suivante montre un résultat de détection du bouchon
{{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/imabouchon1_rect_trouve.jpg}}
====Partie 4: Rectification de l'image grâce à une homographie====
Cette tache consiste à générer une image rectifiée à partir de l'image fournie par la caméra. Cette image rectifiée doit avoir une résolution de 1 pixel par millimètre et occuper une surface de 169x169 millimètres. Les quatre coins de cette image doivent correspondre aux quatre coins de la mire posée sur le plan de travail du robot.
Vous devez faire la fonction **processImage(image,srcPoints):** pour calculer la transformation homographique à partir des coordonnées de points 2D mis en correspondance (avec les 4 coins de l'image à générer). La fonction doit également génerer l'image **dst** rectifiée
Exemple de fichier contenant les correspondances, à mettre dans le même dossier que le programme python pour la fonction main:
991.2868, 565.0504
655.7476, 490.5274
592.5595, 833.6786
948.9872, 903.2888
Pour calculer l'homographie vous aurez besoin d'utiliser la fonction cv2.getPerspectiveTransform(...)
exemple d'image de la mire en entrée du programme:
{{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/imamire1.jpg}}
image avec les contours en surimpression:
{{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/imamire1_contour.jpg}}
exemple d'image de la mire en sortie du programme:
{{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/imamire1_rect.jpg}}
En appliquant le même traitement à des images de bouchons sur la zone de la mire:
{{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/imabouchon1.jpg}}
est rectifiée en:
{{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/imabouchon1_rect.jpg}}