Paso 9: procesamiento
Lo primero que debemos hacer en el proceso es instalación de librería GSVideo. Existen instrucciones de descarga e instalación: http://gsvideo.sourceforge.net/
Así que básicamente secuencia del programa se ve algo como eso, pero se divide en 2 circuitos (hacer fotos y el resto):
hacer foto = > encontrar píxeles más brillantes en cada fila = > guardar imagen de píxeles brillantes de representación = > encontrar distancia entre centro de imagen y los píxeles más brillantes en cada fila = > convertir reunieron coordenadas polares para kartesian XYZ = > guardar el archivo ASC con nube de puntos.
Explicación puede encontrarse en los comentarios en el código.
Lo primero que debe hacerse bonito pronto es que valor de Z es igual 0. Ahora Z = 0 se encuentra no en el centro de la plataforma, pero en la primera fila de la foto. Esto provoca que la nube de puntos de salida es invertida.
Código: objetos colores variables parámetros de escáner coordenadas //================= CONFIG =================== void setup() {}
import codeanticode.gsvideo.*;
Import processing.serial.*;
PFont f;
GSCapture cam;
Serie myPort;
PrintWriter salida;
color black=color(0);
color white=color(255);
int itr; iteración
Float pixBright;
flotador maxBright = 0;
int maxBrightPos = 0;
int prevMaxBrightPos;
cntr int = 1;
int fila;
int col;
flotador de odl = 210; distancia entre webcam y eje de giro, [milímetro], no utilizados aún
etap de flotador = 120; número de fases perfilado por la revolución
Float katLaser = 25 * PI/180; ángulo entre el láser y cámara [radianes]
Float katOperacji = 2 * PI/etap; ángulo entre 2 perfiles [radianes]
Float x, y, z; cartesianas cuerdas., [milímetro]
ro de flotador; primera de las coordenadas polares, [milímetro]
fi de flotador; segundo de coordenadas polares, [radianes]
Float b; distancia entre el píxel más brillante y centro de la foto [pixel]
Float pxmmpoz = 5; píxeles por milímetro horizontal 1px = 0.2 mm
Float pxmmpion = 5; píxeles por milímetro verticalmente 1px = 0.2 mm
tamaño (800, 600);
strokeWeight(1);
Smooth();
Background(0);
fuentes
f=createFont("Arial",16,true);
cámara conf.
String [] avcams=GSCapture.list();
Si (avcams.length==0) {}
println ("hay no hay cámaras disponibles para capturar.");
textFont(f,12);
Fill(255,0,0);
texto ("La cámara no está lista", 680, 32);
}
Else {}
println ("cámaras disponibles:");
para (int i = 0; i < avcams.length; i ++) {}
println(avcams[i]);
}
textFont(f,12);
Fill(0,255,0);
texto ("cámara ready", 680, 32);
Cam = new GSCapture (este, 640, 480,avcams[0]);
Cam.Start();
}
Serie (COM) conf.
println(serial.List());
myPort = serie nueva (este, Serial.list() [0], 9600);
archivo de salida
OUTPUT=createWriter("Skan.ASC"); plik wynikowy *.asc
}
=== PROGRAMA PRINCIPAL ===
void draw() {}
PImage zdjecie=createImage(cam.width,cam.height,RGB);
Cam.Read();
Delay(2000);
para (itr = 0; itr < etap; itr ++) {}
Cam.Read();
zdjecie.loadPixels();
cam.loadPixels();
para (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() {}
para (itr = 0; itr < etap; itr ++) {}
String nazwaPliku = "zdjecie-" + nf(itr+1, 3) + ".png";
PImage skan=loadImage(nazwaPliku);
String nazwaPliku2 = "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);
para (fila = 0; fila < skan.height; fila ++) {análisis de fila //starting
maxBrightPos = 0;
maxBright = 0;
para (col = 0; col < skan.width; col ++) {}
currentPos = fila * skan.width + col;
pixBright=brightness(skan.pixels[currentPos]);
if(pixBright>maxBright) {}
maxBright = pixBright;
maxBrightPos = currentPos;
}
odwz.pixels[currentPos]=Black; ajuste todos los píxeles negros
}
odwz.pixels[maxBrightPos]=White; píxeles más brillantes del entorno blanco
b = ((maxBrightPos+1-row*skan.width)-skan.width/2) / pxmmpoz;
ro=b/sin(katLaser);
output.println (b + "," + prevMaxBrightPos + "," + maxBrightPos); Yo utiliza esto para la depuración
x = ro * cos(fi); cambio de coordenadas polares a kartesian
y = ro * sin(fi);
z = fila/pxmmpion;
Si ((ro > = 30) & & (ro < = 60)) {//printing de coordenadas
output.println (x + "," + y + "," + z);
}
} //end de análisis de la fila
odwz.updatePixels();
odwz.Save(nazwaPliku2);
}
output.Flush();
output.Close();
}
void obroc() {//sending comando para girar a la
myPort.write('S');
Delay(50);
myPort.write('K');
}