=====SAE Vision Industrielle pour les étudiants Formation Initiale=====
====Manip Robotique RubiksCube====
https://www.youtube.com/embed/mFfiV3QRtU8
trouvé sur le net:
https://www.youtube.com/watch?v=WJRhB39BxWQ
https://medium.com/@diegomesamarrero/rubiks-cube-in-python-using-numpy-and-opencv-a8abfa2d8216
https://www.academia.edu/83769592/Solving_Rubiks_Cube_Using_Open_CV
====Partie vision Projet Rubik's Cube====
Dans un premier temps, vous devrez développer l'application réalisant la lecture d'une face du rubik's cube.
Les étapes du traitement sont données ici:
L'image de test à traiter est:
Image 0: {{https://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: {{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/rubiksrect_contour.png}}
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 31x31 pixels:
Image 2: {{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/rubiksrect0.png?320}}
31 pixels= 3*9 + 1+1+1+1
ou
31 pixels= 3*7 + 2+3+3+2
pix_deb=2+10*i
pix_fin=8+10*i
Vous devez ensuite déterminer pour chacun des pixels de l'image quelle est la couleur (parmi les 6 couleurs apprises) la plus proche et sinon utiliser un autre indice pour indiquer que le pixel n'est d'aucune des 6 couleurs connues:
Image 3: {{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/rubiksrect0bis_label.png?320}}
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 3x3 pixels:
Image 4: {{https://bvdp.inetdoc.net/files/iut/tp_lpro_vision/rubiksrect_3X3_0_label_upsize320.png?320}}
=====Images synthétiques=====
====Fichier pour générer les facettes du cube====
import os
import cv2
import numpy as np
#tabcolors_python= [[0,2,6,5,5,1,3,2,1],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0] ]
tabcolors_python= [[5,2,2,4,1,1,6,5,6],[5,2,2,4,1,1,6,5,6],[3,4,4,2,3,5,6,5,6],[5,2,2,4,1,1,6,5,6],[5,2,2,4,1,1,6,5,6],[5,2,2,4,1,1,6,5,6] ]
def create_tab_colors():
with open('tab_colors.scad', 'w') as f:
f.write('// fichier de définition du cube, a inclure avec:\n')
f.write('// include \n')
f.write('// Definition des couleurs\n')
f.write('color_black = [0, 0, 0]; // indice 0 \n')
f.write('color_white = [1, 1, 1]; // indice 1\n')
f.write('color_red = [1, 0, 0]; // indice 2\n')
f.write('color_green = [0, 1, 0]; // indice 3\n')
f.write('color_orange = [1, 0.5, 0]; // indice 4\n')
f.write('color_yellow = [1, 1, 0]; // indice 5\n')
f.write('color_blue = [0, 0, 1]; // indice 6\n')
f.write('tab_indices_color=[color_black,color_white,color_red,color_green,color_orange,color_yellow,color_blue];\n')
f.write('tabcolors= [')
for nface in range(6):
f.write('[')
for ncarre in range(9):
#f.write(str(nface))
f.write(str(tabcolors_python[nface][ncarre]))
if ncarre!=8:
f.write(',')
else:
f.write(']')
if nface!=5:
f.write(',')
f.write('];')
f.close()
create_tab_colors()
====Fichier modèle 3D du cube====
include
// Dimensions du Rubik's Cube
cube_size = 26;
interieur = 90;
interstice = 3;
// Fonction pour créer un carré
module colored_square(color) {
color(color) {
square([cube_size, cube_size], true);
}
}
// Fonction pour créer une face du Rubik's cube
module face(colors) {
for (r = [0:2]) {
for (c = [0:2]) {
translate([r * (cube_size + interstice), c * (cube_size + interstice), 0]) {
colored_square(colors[r][c]);
}
// Ajout de l'interstice
translate([r * (cube_size + interstice) + interstice, c * (cube_size + interstice) + interstice, 0]) {
}
}
}
}
// Assemblage du Rubik's Cube
module rubiks_cube() {
translate([-28, -28, 1]) face([[
tab_indices_color[tabcolors [0][0]], tab_indices_color[tabcolors [0][1]], tab_indices_color[tabcolors [0][2]]], [tab_indices_color[tabcolors [0][3]], tab_indices_color[tabcolors [0][4]], tab_indices_color[tabcolors [0][5]]], [tab_indices_color[tabcolors [0][6]], tab_indices_color[tabcolors [0][7]], tab_indices_color[tabcolors [0][8]]]]);
////////////////////////////////////////////////////
//pas bon
translate([-28, 46, 17]) rotate([90,0,0]) face( [[tab_indices_color[tabcolors [1][0]], tab_indices_color[tabcolors [1][1]], tab_indices_color[tabcolors [1][2]]], [tab_indices_color[tabcolors [1][3]], tab_indices_color[tabcolors [1][4]], tab_indices_color[tabcolors [1][5]]], [tab_indices_color[tabcolors [1][6]], tab_indices_color[tabcolors [1][7]], tab_indices_color[tabcolors [1][8]]]]);
////////////////////////////////////////////////////
//pas bon
translate([46, -28, 17])rotate([0,-90,0])face([[tab_indices_color[tabcolors [2][0]], tab_indices_color[tabcolors [2][1]], tab_indices_color[tabcolors [2][2]]], [tab_indices_color[tabcolors [2][3]], tab_indices_color[tabcolors [2][4]], tab_indices_color[tabcolors [2][5]]], [tab_indices_color[tabcolors [2][6]], tab_indices_color[tabcolors [2][7]], tab_indices_color[tabcolors [2][8]]]]);
////////////////////////////////////////////////////
translate([-28, -44, 17]) rotate([90,0,0]) face([[tab_indices_color[tabcolors [3][0]], tab_indices_color[tabcolors [3][1]], tab_indices_color[tabcolors [3][2]]], [tab_indices_color[tabcolors [3][3]], tab_indices_color[tabcolors [3][4]], tab_indices_color[tabcolors [3][5]]], [tab_indices_color[tabcolors [3][6]], tab_indices_color[tabcolors [3][7]], tab_indices_color[tabcolors [3][8]]]]);
////////////////////////////////////////////////////
translate([-44, -28, 17])rotate([0,-90,0]) face([[tab_indices_color[tabcolors [4][0]], tab_indices_color[tabcolors [4][1]], tab_indices_color[tabcolors [4][2]]], [tab_indices_color[tabcolors [4][3]], tab_indices_color[tabcolors [4][4]], tab_indices_color[tabcolors [4][5]]], [tab_indices_color[tabcolors [4][6]], tab_indices_color[tabcolors [4][7]], tab_indices_color[tabcolors [4][8]]]]);
////////////////////////////////////////////////////
//pas bon
translate([-28, -28,91]) face( [[tab_indices_color[tabcolors [5][0]], tab_indices_color[tabcolors [5][1]], tab_indices_color[tabcolors [5][2]]], [tab_indices_color[tabcolors [5][3]], tab_indices_color[tabcolors [5][4]], tab_indices_color[tabcolors [5][5]]], [tab_indices_color[tabcolors [5][6]], tab_indices_color[tabcolors [5][7]], tab_indices_color[tabcolors [5][8]]]]);
////////////////////////////////////////////////////
}
module black_cube(color) {
color([0, 0, 0]) {
translate([1,1,46]) cube([interieur, interieur, interieur],center = true);
}
}
// Appel de la fonction pour générer le cube noir
black_cube();
rubiks_cube();
====Fichier pour générer une image====
import os
import cv2
import numpy as np
filename_img="img"
#executable_openscad="openscad"
executable_openscad="D:\openscad-2021.01\openscad.exe"
chaine=f'{executable_openscad} -o {filename_img}.png --imgsize=1024,768 --camera=230,340,500,0,0,0 --projection=p rubiks.scad'
os.system(chaine)
=====Images Réelles=====
{{https://bvdp.inetdoc.net/files/iut/vision_BUT3/vue_rubiks.png}}
Pleins d'images à utiliser: https://bvdp.inetdoc.net/files/iut/vision_BUT3/
Archive zip des images: https://bvdp.inetdoc.net/files/iut/vision_BUT3/images_rubiks.zip