我有一系列png格式的png文件,以及相应的txt格式的深度文件,可以用np.loadtxt加载。如何使用open3d将这两个文件合并为点云
我遵循了使用open3d - python从深度numpy数组中获取点云的过程,但是结果对人类来说是不可读的。
这里列举的例子如下:


您可以从这个链接https://drive.google.com/drive/folders/1ZNumu7iqgC5JtD5_j4UKLowpBV2cPQ1S?usp=sharing获得源文件来再现我的结果。顺便说一句,深度和rgb并不是寄存器。
谢谢。
发布于 2022-09-30 22:15:12
我不得不播放一些设置和数据,并主要使用您的SO链接的答案。
import cv2
import numpy as np
import open3d as o3d
color = o3d.io.read_image("a542c.png")
depth = np.loadtxt("a542d.txt")
vertices = []
for x in range(depth.shape[0]):
for y in range(depth.shape[1]):
vertices.append((float(x), float(y), depth[x][y]))
pcd = o3d.geometry.PointCloud()
point_cloud = np.asarray(np.array(vertices))
pcd.points = o3d.utility.Vector3dVector(point_cloud)
pcd.estimate_normals()
pcd = pcd.normalize_normals()
o3d.visualization.draw_geometries([pcd])然而,如果您按照提供的代码,整个场景看起来非常奇怪和不熟悉。这是因为你的深度文件包含0到几乎2.5米之间的数据。我引入了一个500或1000毫米的截断加上删除了所有的0,如另一个答案所建议的。此外,我翻转x轴(浮点(-x),而不是浮点(X)),以像你的照片。
# ...
vertices = []
for x in range(depth.shape[0]):
for y in range(depth.shape[1]):
if 0< depth[x][y]<500:
vertices.append((float(-x), float(y), depth[x][y]))为了获得好的透视图,我不得不手动旋转图像。可能是open3d提供了自动执行的方法(我很快就从上面的SO链接中尝试了pcd.transform(),如果需要的话,它可以帮助您)。结果
500毫米切断:

和1000毫米切断:

。
发布于 2022-09-30 18:45:23
我使用laspy而不是open3d,因为我想给您的图像添加一些颜色:
import imageio
import numpy as np
# first reading the image for RGB values
image = imageio.imread(".../a542c.png")
loading the depth file
depth = np.loadtxt("/home/shaig93/Documents/internship_FWF/a542d.txt")
# creating fake x, y coordinates with meshgrid
xv, yv = np.meshgrid(np.arange(400), np.arange(640), indexing='ij')
# save_las is a function based on laspy that was provided to me by my supervisor
save_las("fn.laz", image[:400, :, 0].flatten(), np.c_[yv.flatten(), xv.flatten(), depth.flatten()], cmap = plt.cm.magma_r)结果就是这样。如你所见,物体从正面可见。

然而,从侧面看,它们并不容易区分。

这意味着我认为你的深度文件不是那么好。
另一个想法是从你的深度文件中去掉0值,这样你就可以得到点云,而不需要前面有墙的结构。但当然仍未解决深度问题。
ps。我知道这不是一个正确的答案,但我希望这有助于找出问题。
https://stackoverflow.com/questions/73891858
复制相似问题