2016-04-16 27 views
5

Für meine Anwendung analysierte ich die räumliche Auflösung der Kinect v2.Kinect v2: Räumliche Auflösung/Tiefenauflösung/Kamerakalibrierung

Um die räumliche Auflösung zu analysieren, zeichnete ich eine senkrechte und plane Ebene zu einer gegebenen Entfernung auf und wandelte die Tiefenkarte der Ebene in eine Punktwolke um. Dann vergleiche ich einen Punkt mit seinen Nachbarn, indem ich die euklidische Distanz berechne.

Berechnung der euklidischen Entfernung für diesen Fall (1 Meter zwischen Ebene und Kinect) die Auflösung ist nahe 3 mm zwischen den Punkten. Für ein Flugzeug mit 2 Metern Abstand habe ich eine Auflösung von bis zu 3 mm.

Vergleicht man dies mit der Literatur, denke ich, dass meine Ergebnisse ziemlich schlecht sind.

Zum Beispiel Yang et al. bekam für ein Flugzeug mit Abstand von 4 m bis zum kinect eines mittlere Auflösung von 4 mm (Evaluating and Improving the Depth Accuracy of Kinect for Windows v2)

Hier ist ein Beispiel für meine Punktwolke der planaren Ebene (2 Meter Entfernung zu meinem kinect):

Plane 2 meters to Kinect v2

Hat jemand eine Beobachtung bezüglich der räumlichen Auflösung der Kinect v2 gemacht oder eine Idee, warum meine Auflösung so schlecht ist?

Meiner Meinung nach ist bei der Umwandlung meines Tiefenbildes in Weltkoordinaten etwas falsch gelaufen. Deshalb hier ein Code snipped:

%normalize image points by multiply inverse of K 
u_n=(u(:)-c_x)/f_x; 
v_n=(v(:)-c_y)/f_y; 
% u,v are uv-coordinates of my depth image 

%calc radial distortion 
r=sqrt(power(u_n,2)+power(v_n,2)); 
radial_distortion =1.0 + radial2nd * power(r,2) + radial4nd * power(r,4) + radial6nd * power(r,6); 

%apply radial distortion to uv-coordinates 
u_dis=u_n(:).*radial_distortion; 
v_dis=v_n(:).*radial_distortion; 

%apply cameramatrix to get undistorted depth point 
x_depth=u_dis*f_x+c_x; 
y_depth=v_dis*f_y+c_y; 

%convert 2D to 3D 
X=((x_depth(:)-c_x).*d(:))./f_x; 
Y=((y_depth(:)-c_y).*d(:))./f_y; 
Z=d; % d is the given depth value at (u,v) 

EDIT: Bisher habe ich auch versucht, die Punkte enthalten, um direkt von coordinate mapper ohne weitere Kalibrierungsschritte.

Die Ergebnisse bezüglich der Auflösung sind immer noch gleich. Hat jemand irgendwelche Vergleichsergebnisse?

Antwort

4

@JavaNullPointer, die Art und Weise, wie Sie Ihre Daten mithilfe von Kinect v2 in 3D konvertieren, wird von der Community noch nicht sehr gut angenommen.

Auch diese Berechnungen, die Sie machen sind folgende ziemlich die Arbeit von Nicholas Burrus - http://burrus.name/index.php/Research/KinectCalibration

Für Kinect v2, gibt es nicht noch viele Informationen darüber, wie dies auch. Mit den neuen SDK-Funktionen können Sie jedoch einen Kinect Calibration-Tabellenbereich speichern.

Das Verfahren ist ganz einfach:

1- Sie diese Tabelle Informationen speichern müssen - https://msdn.microsoft.com/en-us/library/windowspreview.kinect.coordinatemapper.getdepthframetocameraspacetable.aspx

2-, sobald Sie diese Informationen speichern, können Sie dann in der Tat Ihre Tiefen Punkte umwandeln können in einer Datei (2D) in den 3D-Kameraraum.

Hier geht der Code, den Sie verwenden sollten:

// Get the depth for this pixel 
ushort depth = frameData[y * depthFrameDescription.Height + x]; 

// Get the value from the x/y table 
PointF lutValue = this.cameraSpaceTable[y * depthFrameDescription.Height + x]; 

// create the CameraSpacePoint for this pixel 
// values are in meters so convert 
CameraSpacePoint csp = new CameraSpacePoint(); 
csp.X = lutValue.X * depth * 0.001f; 
csp.Y = lutValue.Y * depth * 0.001f; 
csp.Z = depth * 0.001f; 

Auch bei viel nehmen:

https://msdn.microsoft.com/en-us/library/windowspreview.kinect.coordinatemapper.mapdepthframetocameraspace.aspx

oder

https://msdn.microsoft.com/en-us/library/windowspreview.kinect.coordinatemapper.mapdepthframetocameraspaceusingibuffer.aspx

Zusätzlich Tiefe, Infrarot, Bodyindex-Ströme sind alle al signiert (gleiche Auflösung) also du gerade das wirklich. Wenn Sie auch die Farbpunkte benötigen, sollten Sie auch diese Zuordnung speichern. All diese Informationen sind auf der Kinect MSDN 2.0 Website verfügbar.

Ich hoffe, Sie können diese Informationen speichern und dann diese räumliche Auflösung Test wiederholen.

+0

Ich dachte auch über den Ansatz Speichern der KameraSpaceTable nach! Aber ich verwerfe es, weil ich gelesen habe, dass die Werkskalibrierung von Kinect v2 nicht so gut ist. Also möchte ich meine eigene Kalibrierung machen und sie meiner Anwendung hinzufügen. Deshalb mache ich die kompliziertere Art, meine Weltkoordinaten zu berechnen! – JavaNullPointer

+1

Wo hast du es gelesen? – 16per9

+0

Titel: Erste Erfahrungen mit Kinect v2-Sensor für die 3D-Modellierung im Nahbereich. Autoren: Lachat, E .; Macher, H .; Link: http://www.int-arch-photogramm-remote-sens-spatial-inf-sci.net/XL-5-W4/93/2015/iscrsarchives-XL-5-W4-93-2015.pdf – JavaNullPointer