gpt4 book ai didi

Kinect v2 : Spatial resolution/depth resolution/camera calibration

转载 作者:行者123 更新时间:2023-12-04 19:01:31 24 4
gpt4 key购买 nike

对于我的应用程序,我分析了 Kinect v2 的空间分辨率。

为了分析空间分辨率,我记录了一个垂直平面到给定距离的平面,并将平面的深度图转换为点云。然后我通过计算欧几里得距离将一个点与他的邻居进行比较。

计算这种情况下的欧几里得距离(平面和 kinect 之间的距离为 1 米),点之间的分辨率接近 3 毫米。对于距离为 2 米的飞机,我的分辨率高达 3 毫米。

与文献相比,我认为我的结果很糟糕。

例如杨等人。对于距离 kinect 4 米的飞机,平均分辨率为 4 毫米(Evaluating and Improving the Depth Accuracy of Kinect for Windows v2)

这是我的平面点云示例(到我的 kinect 2 米的距离):

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 中包含这些点。无需进一步的校准步骤。

关于决议的结果仍然相同。有没有人比较结果?

最佳答案

@JavaNullPointer,您使用 Kinect v2 将信息转换为 3D 的方式仍未被社区广泛接受。

此外,您所做的那些计算几乎遵循 Nicholas Burrus 的工作 - http://burrus.name/index.php/Research/KinectCalibration

对于 Kinect v2,仍然没有太多关于如何做到这一点的信息。尽管如此,新的 SDK 功能允许您节省 Kinect Calibration 表空间。

程序非常简单:

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 流都是对齐的(相同的分辨率),因此您就是这样。如果您还需要获取色点,则还应保存该映射。所有这些信息都可以在 Kinect MSDN 2.0 网站上找到。

我希望你能保存这些信息,然后重新做这个空间分辨率测试。

关于Kinect v2 : Spatial resolution/depth resolution/camera calibration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36668920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com