2016-04-16 226 views
5

對於我的應用,我分析了Kinect v2的空間分辨率。Kinect v2:空間分辨率/深度分辨率/相機校準

爲了分析空間分辨率,我記錄了一個垂直和平面的平面到給定的距離,並將平面的深度圖轉換爲點雲。然後我通過計算歐幾里德距離來比較一個點與他的鄰居。

計算這種情況下的歐幾里德距離(平面與kinect之間的距離爲1米),點之間的分辨率接近3 mm。對於2米距離的飛機,我得到了高達3毫米的分辨率。

比較這與文獻,我認爲我的結果是相當糟糕的。

例如Yang等人得到了同爲4米距離Kinect的一個一個平面平均厚4毫米(Evaluating and Improving the Depth Accuracy of Kinect for Windows v2

這裏平面平面(2米的距離我的Kinect)我的點雲實例解析:

Plane 2 meters to Kinect v2

任何人都對Kinect v2的空間分辨率或者爲什麼我的分辨率不好的想法做了一些觀察?

在我看來,我認爲在將我的深度圖像轉換爲世界座標時發生了錯誤。因此,這裏的代碼剪斷:

%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) 

編輯:到目前爲止,我也試圖去直接從coordinate mapper包括點,無需校準步驟。

有關分辨率的結果仍然相同。有沒有人有任何比較結果?

回答

4

@JavaNullPointer,使用Kinect v2將信息轉換爲3D的方式尚未被社區所接受。

而且那些你正在計算是非常以下尼古拉斯·伯勒斯的工作 - http://burrus.name/index.php/Research/KinectCalibration

對於Kinect的V2,沒有仍對如何這個問題,以及很多信息。不過,新的SDK功能允許您保存Kinect校準表格空間。

的過程很簡單:

1 - 您需要保存該表信息 - 一旦你將這些信息保存到文件https://msdn.microsoft.com/en-us/library/windowspreview.kinect.coordinatemapper.getdepthframetocameraspacetable.aspx

2-,那麼你的確可以將您深度點(2D)進入3D相機空間。

這裏去的代碼,你應該使用:

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

同時,採取了很多的:

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

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

此外,深度,紅外線,bodyindex流都是al簽署(相同的決議),因此你真的這個。如果您還需要獲取色彩點,則還應保存該映射。所有這些信息都可以在Kinect MSDN 2.0網站上找到。

我希望你能保存這些信息,然後重新做這個空間分辨率測試。

+0

我也想過保存cameraSpaceTable的方法!但我放棄了它,因爲我已經讀過Kinect v2的出廠校準不太好。所以我想做我自己的校準並將其添加到我的應用程序中。這就是爲什麼我用更復雜的方式來計算我的世界座標! – JavaNullPointer

+1

你是從哪裏讀的? – 16per9

+0

標題:使用Kinect v2傳感器進行近距離三維建模的第一次體驗。作者:Lachat,E. Macher,H .;鏈接:http://www.int-arch-photogramm-remote-sens-spatial-inf-sci.net/XL-5-W4/93/2015/isprsarchives-XL-5-W4-93-2015.pdf – JavaNullPointer