Stap 9: verwerking
Eerste ding om te doen in verwerking is installatie van GSVideo bibliotheek. Download en installatie-instructies zijn er: http://gsvideo.sourceforge.net/
Dus eigenlijk programma volgorde ziet er iets dergelijks, maar het is verdeeld in 2 lussen (het maken van foto's en de rest):
foto maken = > helderste pixel vinden in elke rij = > opslaan Foto van vertegenwoordiging helderste pixels = > afstand tussen het midden van de afbeelding en helderste pixel vinden in elke rij = > convert poolcoördinaten verzameld op kartesian XYZ = > ASC bestand met puntenwolk opslaan.
Uitleg kan worden gevonden in opmerkingen in de code.
Het eerste wat moet worden gedaan preety binnenkort is instelling waar Z-waarde gelijk 0 is. Z = 0 is nu ingesteld niet in het midden van het platform, maar op de eerste rij van de foto. Dit zorgt ervoor dat uitvoer puntenwolk ondersteboven is.
code: objecten kleuren variabelen scanner parameters coördinaten //================= CONFIG =================== VOID Setup {}
invoer codeanticode.gsvideo.*;
importeren van processing.serial.*;
F PFont;
GSCapture de cam;
Seriële myPort;
PrintWriter output;
kleur black=color(0);
kleur white=color(255);
int itr; iteratie
float pixBright;
zweven maxBright = 0;
int maxBrightPos = 0;
int prevMaxBrightPos;
int cntr = 1;
int rij;
int col;
zweven odl = 210; afstand tussen webcam en draaiende as, [milimeter], nog niet gebruikt
etap zweven = 120; aantal fasen profilering per omwenteling
zweven katLaser = 25 * PI/180; hoek tussen laser en camera [radiaal]
zweven katOperacji = 2 * PI/etap; hoek tussen de 2 profielen [radiaal]
float x, y, z; Cartesiaanse koorden., [milimeter]
float ro; eerste polar coördinaat, [milimeter]
float fi; tweede van polar-coördinaat, [radiaal]
float b; afstand tussen de helderste pixel en midden van foto [pixel]
zweven pxmmpoz = 5; pixels per milimeter horizontaal 1px = 0,2 mm
zweven pxmmpion = 5; pixels per milimeter verticaal 1px = 0,2 mm
grootte (800, 600);
strokeWeight(1);
Smooth();
Background(0);
lettertypen
f=createFont("Arial",16,True);
camera conf.
Tekenreeks [] avcams=GSCapture.list();
Als (avcams.length==0) {}
println ("er zijn geen camera's beschikbaar voor het vastleggen.");
textFont(f,12);
Fill(255,0,0);
tekst ("Camera niet klaar", 680, 32);
}
else {}
println ("beschikbare camera's:");
for (int i = 0; ik < avcams.length; i ++) {}
println(avcams[i]);
}
textFont(f,12);
Fill(0,255,0);
tekst ("Camera ready", 680, 32);
Cam = nieuwe GSCapture (deze, 640, 480,avcams[0]);
cam.Start();
}
Seriële (COM) conf.
println(Serial.List());
myPort = nieuwe Serial (dit, Serial.list() [0], 9600);
uitvoerbestand
output=createWriter("SKAN.asc"); plik wynikowy *.asc
}
=== HOOFDPROGRAMMA ===
VOID draw() {}
PImage zdjecie=createImage(cam.width,cam.height,RGB);
cam.Read();
delay(2000);
voor (itr = 0; itr < etap; itr ++) {}
cam.Read();
zdjecie.loadPixels();
cam.loadPixels();
voor (int n = 0; n < zdjecie.width*zdjecie.height; n ++) {}
zdjecie.pixels[n]=CAM.pixels[n];
}
zdjecie.updatePixels();
set(20,20,CAM);
NazwaPliku koord = "zdjecie-" + nf(itr+1, 3) + ".png";
zdjecie.Save(nazwaPliku);
obroc();
delay(500);
}
obroc();
licz();
noLoop();
}
ongeldig licz() {}
voor (itr = 0; itr < etap; itr ++) {}
NazwaPliku koord = "zdjecie-" + nf(itr+1, 3) + ".png";
PImage skan=loadImage(nazwaPliku);
NazwaPliku2 koord = "odzw-" + nf(itr+1, 3) + ".png";
PImage odwz = createImage (skan.width, skan.height, RGB);
skan.loadPixels();
odwz.loadPixels();
int currentPos;
fi = itr * katOperacji;
println(FI);
voor (rij = 0; rij < skan.height; rij ++) {//starting rij analyse
maxBrightPos = 0;
maxBright = 0;
voor (col = 0; col < skan.width; col ++) {}
currentPos = rij * skan.width + col;
pixBright=brightness(skan.pixels[currentPos]);
if(pixBright>maxBright) {}
maxBright = pixBright;
maxBrightPos = currentPos;
}
odwz.pixels[currentPos]=Black; alle pixels instellen zwart
}
odwz.pixels[maxBrightPos]=White; instelling helderste pixel wit
b = ((maxBrightPos+1-row*skan.width)-skan.width/2) / pxmmpoz;
ro=b/Sin(katLaser);
output.println (b + "," + prevMaxBrightPos + "," + maxBrightPos); Ik gebruikte deze voor foutopsporing
x = ro * cos(fi); polar coords omzetten in kartesian
y = ro * sin(fi);
z = rij/pxmmpion;
Als ((ro > =-30) & & (ro < = 60)) {//printing coördinaten
output.println (x + "," y + "," + z);
}
} //end van rij analyse
odwz.updatePixels();
odwz.Save(nazwaPliku2);
}
output.Flush();
output.Close();
}
VOID obroc() {//sending opdracht om te schakelen
myPort.write('S');
delay(50);
myPort.write('K');
}