2016-04-16 16 views
5

Per la mia applicazione, ho analizzato la risoluzione spaziale di Kinect v2.Kinect v2: risoluzione spaziale/risoluzione profondità/calibrazione camera

Per analizzare la risoluzione spaziale, ho registrato un piano perpendicolare e planare a una data distanza e ho convertito la mappa di profondità del piano in una nuvola di punti. Poi paragono un punto ai suoi vicini calcolando la distanza euclidea.

Calcolando la distanza euclidea per questo caso (1 metro tra piano e cinto) la risoluzione è vicina a 3 mm tra i punti. Per un aereo con una distanza di 2 metri ho ottenuto una risoluzione fino a 3 mm.

Paragonandolo alla letteratura, penso che i miei risultati siano piuttosto negativi.

Ad esempio Yang et al. ottenuto per un aereo con distanza di 4 metri al kinect una media risoluzione di 4 mm (Evaluating and Improving the Depth Accuracy of Kinect for Windows v2)

qui un esempio per il punto di intorbidamento del piano planare (Distance 2 misuratore mio kinect):

Plane 2 meters to Kinect v2

Qualcuno ha fatto qualche osservazione riguardo alla risoluzione spaziale del Kinect v2 o un'idea del perché la mia risoluzione è cattiva come quella?

A mio parere penso che ci sia qualcosa di sbagliato quando si converte la mia immagine di profondità in coordinate mondiali. Quindi qui un codice 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: Finora ho anche cercato di includere i punti direttamente da coordinate mapper senza ulteriori fasi di calibrazione.

I risultati relativi alla risoluzione sono rimasti gli stessi. Qualcuno ha qualche risultato di confronto?

risposta

4

@JavaNullPointer, il modo in cui si convertono le informazioni in 3D utilizzando Kinect v2 non è ancora accettato molto bene dalla comunità.

anche quei calcoli che si stanno facendo sono più o meno in seguito ai lavori di Nicola Burrus - http://burrus.name/index.php/Research/KinectCalibration

per Kinect v2, non c'è ancora molte informazioni su come questo. Tuttavia, le nuove funzionalità dell'SDK consentono di salvare uno spazio tabella di calibrazione Kinect.

La procedura è molto semplice:

1- è necessario per salvare queste informazioni tavolo - https://msdn.microsoft.com/en-us/library/windowspreview.kinect.coordinatemapper.getdepthframetocameraspacetable.aspx

2 una volta che si salva queste informazioni in un file, è possibile infatti convertire i punti di profondità (2D) nello spazio della fotocamera 3D.

Qui va il codice che dovrebbe usare:

// 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; 

Inoltre, prendere un sacco a:

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

o

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

Inoltre, la profondità, a infrarossi, i flussi di bodyindex sono tutti al igned (stessa risoluzione) quindi è proprio questo. Se è necessario ottenere anche i punti colore, è necessario salvare anche tale mappatura. Tutte queste informazioni sono disponibili nel sito Web Kinect MSDN 2.0.

Spero che tu sia in grado di salvare queste informazioni e quindi ripetere questo test di risoluzione spaziale.

+0

Ho anche pensato all'approccio che salva cameraSpaceTable! Ma lo scartano perché ho letto che la calibrazione di fabbrica di Kinect v2 non è buona. Quindi voglio fare la mia calibrazione e aggiungerla alla mia applicazione. Ecco perché faccio il modo abbastanza più complicato di calcolare le coordinate del mio mondo! – JavaNullPointer

+1

Dove l'hai letto? – 16per9

+0

Titolo: Prime esperienze con il sensore Kinect v2 per modellazione 3d a breve distanza. Autori: Lachat, E .; Macher, H .; Link: http://www.int-arch-photogramm-remote-sens-spatial-inf-sci.net/XL-5-W4/93/2015/isprsarchives-XL-5-W4-93-2015.pdf – JavaNullPointer