05-18-2022, 07:46 PM
复制:将相机放置在场景中,并将其指向30x50x10毫米的块(附)。用以下方法为其拍摄深度图像:
打开生成的pcd。使用MeshLab或pointcloud查看器选择xyz文件。
预期结果:生成的点云是一个矩形块,尺寸为30x50x10。
实际结果:生成的点云的尺寸不是30x50x10,角度也不是90度。
修复z-distortion:如果我在将img归一化到0到1之间之后插入以下一行:
然后得到的点云具有正确的尺寸。请注意,上面的变换是0到0和1到1,并将直线和平面转换为直线和平面,但扭曲了距离和角度。也许有人在某处插入了某种伽玛校正?
代码:
从robodk导入robolink
将numpy导入为np
进口操作系统
导入的时间
RDK = robolink.Robolink()
#获取深度快照
cam = RDK。项目(深度相机)
cam.setParam(“开放”)
time . sleep (0.1)
RDK.Cam2D_Snapshot(os.path.join(os.path.abspath('.'), 'tmp.grey32'), cam, 'Depth')
Grey32 = np.fromfile('tmp.grey32', dtype='>u4')
W, h = grey32[:2]
Img = np.flipud(np。(2:], (h, w)))
Img = (Img / np.iinfo(np.uint32).max) # rescale到0.0到1.0
FAR_LENGTH = 100 #无论FAR_LENGTH设置为什么
img = img * FAR_LENGTH
Img = Img .astype(np.uint16)
使用open3d保存为pointcloud
将open3d作为o3d导入
FOV = 63.91 # FOV的设置
fy = h / (2*np.tan(np.radians(FOV) / 2)) # FOV为相机视场
本征= o3d.camera.PinholeCameraIntrinsic(
宽度= w,
身高= h,
fx=fy, # fx和fy使用相同的值
=年度财政年度
Cx =w / 2,
Cy =h / 2,
)
pcd = o3d.geometry.PointCloud.create_from_depth_image(o3d.geometry.Image(img), intrinsic)
o3d.io.write_point_cloud (pcd。xyz', pcd, write_ascii=True)
预期结果:生成的点云是一个矩形块,尺寸为30x50x10。
实际结果:生成的点云的尺寸不是30x50x10,角度也不是90度。
修复z-distortion:如果我在将img归一化到0到1之间之后插入以下一行:
代码:
Img = Img / (2 - Img)