Étape 9: traitement
Première chose à faire dans le traitement est l’installation de la bibliothèque de GSVideo. Sont a-t-il des instructions d’installation et de téléchargement : http://gsvideo.sourceforge.net/
Donc en gros ordre ressemble à quelque chose comme ça, mais il est divisé en 2 boucles (faire les photos et le reste) :
faire des photos = > trouver des pixel plus brillante à tous les rangs = > enregistrer l’image de pixels plus brillantes représentation = > trouver la distance entre le milieu de la photo et pixel plus brillante dans tous les rangs = > convert se sont réunis les coordonnées polaires pour kartesian XYZ = > enregistrer le fichier ASC avec nuage de points.
On trouvera des explications en commentaires dans le code.
Première chose doit être fait preety est bientôt réglage où la valeur Z est égal 0. Maintenant, Z = 0 est définie non pas sur le centre de la plate-forme, mais sur la première ligne de la photo. Cela entraîne que le nuage de points de sortie est inversée.
Code : objets couleurs variables paramètres du scanner coordonnées //================= CONFIG =================== void setup() {}
import codeanticode.gsvideo.* ;
Import processing.serial.* ;
PFont f ;
Cam GSCapture ;
Serial myPort ;
PrintWriter sortie ;
couleur black=color(0) ;
couleur white=color(255) ;
int RIR ; itération
float pixBright ;
flotteur maxBright = 0 ;
int maxBrightPos = 0 ;
int prevMaxBrightPos ;
int cntr = 1 ;
int rang ;
int col ;
flotteur odl = 210 ; distance entre la webcam et l’axe de rotation, [mm], ne pas encore utilisé
flotteur etap = 120 ; nombre de phases de profilage par révolution
float katLaser = 25 * PI/180 ; angle entre laser et caméra [radian]
float katOperacji = 2 * PI/etap ; angle entre 2 profils [radian]
float x, y, z ; cartésien cordons, [milimeter].
flotteur ro ; premier des coordonnées polaires, [mm]
flotteur fi ; deuxième des coordonnées polaires, [radian]
flotteur b ; distance entre les pixels les plus brillants et milieu de photo [pixel]
float pxmmpoz = 5 ; pixels par mm horizontalement de 1px = 0,2 mm
float pxmmpion = 5 ; pixels par mm verticalement de 1px = 0,2 mm
taille (800, 600) ;
strokeWeight(1) ;
Smooth() ;
Background(0) ;
fontes
f=createFont("Arial",16,true) ;
caméra CONF.
String [] avcams=GSCapture.list() ;
Si {(avcams.length==0)
println ("il n’y a pas de caméras disponibles pour la capture.") ;
textFont(f,12) ;
Fill(255,0,0) ;
texte (« Caméra n’est pas prêt », 680, 32) ;
}
else {}
println ("caméras disponibles:") ;
pour (int i = 0; i < avcams.length; i ++) {}
println(avcams[i]) ;
}
textFont(f,12) ;
Fill(0,255,0) ;
texte ("Camera ready, 680, 32) ;
Cam = new GSCapture (this, 640, 480,avcams[0]) ;
Cam.Start() ;
}
Série (COM) CONF.
println(Serial.List()) ;
myPort = nouvelle série (ce, Serial.list() [0], 9600) ;
fichier de sortie
Output=createWriter("Skan.asc") ; plik wynikowy *.asc
}
=== PROGRAMME PRINCIPAL ===
{} void draw()
Zdjecie=createImage(cam.width,cam.height,RGB) Byte ;
Cam.Read() ;
Delay(2000) ;
pour (itr = 0; itr < etap ; RIR ++) {}
Cam.Read() ;
zdjecie.loadPixels() ;
cam.loadPixels() ;
pour (int n = 0; n < zdjecie.width*zdjecie.height; n ++) {}
Zdjecie.pixels[n]=CAM.pixels[n] ;
}
zdjecie.updatePixels() ;
Set(20,20,CAM) ;
String nazwaPliku = « zdjecie-» + nf(itr+1, 3) + ".png" ;
Zdjecie.Save(nazwaPliku) ;
obroc() ;
Delay(500) ;
}
obroc() ;
LICZ() ;
noLoop() ;
}
void licz() {}
pour (itr = 0; itr < etap ; RIR ++) {}
String nazwaPliku = « zdjecie-» + nf(itr+1, 3) + ".png" ;
Skan=loadImage(nazwaPliku) Byte ;
String nazwaPliku2 = « odzw-» + nf(itr+1, 3) + ".png" ;
Odwz Byte = createImage (skan.width, skan.height, RVB) ;
skan.loadPixels() ;
odwz.loadPixels() ;
int currentPos ;
fi = RIR * katOperacji ;
println(FI) ;
pour (rang = 0; ligne < skan.height ; ligne ++) {//starting analyse de ligne
maxBrightPos = 0 ;
maxBright = 0 ;
pour (col = 0; col < skan.width ; col ++) {}
currentPos = ligne * skan.width + col ;
pixBright=brightness(skan.pixels[currentPos]) ;
if(pixBright>maxBright) {}
maxBright = pixBright ;
maxBrightPos = currentPos ;
}
oDwz.pixels[currentPos]=Black ; définition de tous les pixels noirs
}
oDwz.pixels[maxBrightPos]=White ; pixel plus brillants de cadre blanc
b = ((maxBrightPos+1-row*skan.width)-skan.width/2) / pxmmpoz ;
RO=b/Sin(katLaser) ;
output.println (b + «, » + prevMaxBrightPos + «, » + maxBrightPos) ; J’ai utilisé cela pour le débogage
x = ro * cos(fi) ; changement de coordonnées polaires à kartesian
y = ro * sin(fi) ;
z = ligne/pxmmpion ;
Si ((ro > =-30) & & (ro < = 60)) {//printing coordonnées
output.println (x + «, » + y + «, » + z) ;
}
} //end d’analyse de ligne
odwz.updatePixels() ;
oDwz.Save(nazwaPliku2) ;
}
output.Flush() ;
output.Close() ;
}
void obroc() {//sending commande pour activer
myPort.write('S') ;
Delay(50) ;
myPort.write('K') ;
}