从 3d 点创建深度图

Posted

技术标签:

【中文标题】从 3d 点创建深度图【英文标题】:Create depth map from 3d points 【发布时间】:2014-06-19 12:49:46 【问题描述】:

我已经给出了场景的 3d 点或这些点的子集,这些点构成了场景的一个对象。我想从这些点创建一个深度图像,即图像中的像素值编码了相应的 3d 点到相机的距离。

我发现了以下类似的问题

http://www.mathworks.in/matlabcentral/newsreader/view_thread/319097

但是那里的答案对我没有帮助,因为我想使用 MATLAB。获取图像值并不困难(例如,只需计算每个 3d 点到相机原点的距离),但是我不知道如何找出 2d 图像中的相应位置。

我只能想象你将所有 3d 点投影到一个平面上,并将它们在平面上的位置分箱为平面上的离散矩形。然后你可以平均每个 bin 的深度值。 然而,我可以想象这样一个过程的结果将是一个非常像素化的图像,不是很平滑。 你会如何解决这个问题?

【问题讨论】:

你能提供一个小例子来展示你的 3D 数据的格式吗?它们是否在 n×3 矩阵中(即 XYZ 坐标列表)?不过,您的程序听起来不错,如果您希望它的像素化程度较低,您可以考虑插值(您可以在投影后进行)。此外,如果您的数据是我认为的那样,那么投影只是忽略 Z 值的问题。 是的,数据只是一个 n×3 矩阵(XYZ 坐标)。好的,在我的坐标系中,y 轴是指向远离相机的轴。所以在我的情况下,我会忽略 y 值。 y 值本身就是与 XZ 平面的距离,可以用作深度。由于相机可能会倾斜,我认为也可以使用与地面正交的平面进行相同的程序。 如果相机倾斜,我建议先乘以旋转矩阵,使 Y 值等于您正在寻找的深度。 【参考方案1】:

假设您已经校正了相机倾斜(如果您知道角度,则进行简单的矩阵乘法),您可能只需关注this example

X = data(:,1);
Y = data(:,1);
Z = data(:,1);

%// This bit requires you to make some choices like the start X and Z, end X and Z and resolution (X and Z) of your desired depth map
[Xi, Zi] = meshgrid(X_start:X_res:X_end, Z_start:Z_res:Z_end);

depth_map = griddata(X,Z,Y,Xi,Zi)

【讨论】:

嗨!感谢您的回答。然而,我确实感觉 griddata 不会达到预期的结果。插值几乎看起来像一个多边形,您无法再识别对象的实际形状。如果您告诉我如何向您发送 mat 文件,我很乐意举一个对象的点云示例。我相信人们需要其他形式的插值 您可以使用 Dropbox 或 Google Drive 之类的东西链接到该文件。我能提出的唯一建议是 (a) 尝试更高的分辨率(即 X_resZ_res 的值非常低),否则如果失败,请尝试 (b) 使用相当低的分辨率来获得常规分数网格(在不牺牲点的情况下可以达到的最低分辨率),然后尝试interp2 使用不同的插值方法,例如样条曲线和再次高分辨率

以上是关于从 3d 点创建深度图的主要内容,如果未能解决你的问题,请参考以下文章

如何从点云创建深度图像

从 realsense API 或 Open3D 库可视化点云

从三个 1D 数组创建 3D 曲面图

基于Python深度图生成3D点云

使用 opencv 从 3d 点创建全景图像

Unity 3D 使用高度图创建地形|| Unity 3D 使用笔刷绘制地形