如何从pyBullet中的相机获取深度图像

How to get depth images from the camera in pyBullet

在 pyBullet 中,我在生成数据集时遇到了一些困难。我想要实现的是获取相机所见的照片:img = p.getCameraImage(224, 224, renderer=p.ER_BULLET_HARDWARE_OPENGL)

基本上:获取在合成相机 RGB 数据和合成相机 深度 数据(尤其是这个)中看到的图像,它们是相机 windows 你可以在下图左边看到。

        p.resetDebugVisualizerCamera(cameraDistance=0.5, cameraYaw=yaw, cameraPitch=pitch, cameraTargetPosition=[center_x, center_y, 0.785])
        img = p.getCameraImage(224, 224, renderer=p.ER_BULLET_HARDWARE_OPENGL)
        rgbBuffer = img[2]
        depthBuffer = img[3]
        list_of_rgbs.append(rgbBuffer)
        list_of_depths.append(depthBuffer)

        rgbim = Image.fromarray(rgbBuffer)
        depim = Image.fromarray(depthBuffer)

        rgbim.save('test_img/rgbtest'+str(counter)+'.jpg')
        depim.save('test_img/depth'+str(counter)+'.tiff')

       
        counter += 1

我已经运行以下了,不知道是不是跟设置有关。 p.configureDebugVisualizer(p.COV_ENABLE_DEPTH_BUFFER_PREVIEW, 1)
我尝试了几种方法,因为深度部分很复杂。我不明白是否因为像素颜色信息需要单独处理,或者我是否需要使用 project matrixesview matrixes。 我需要将其保存为 .tiff,因为我遇到了一些 cannot save F to png 错误。我试着玩了一下位信息,但一无所获。如果你问,

# depthBuffer[depthBuffer > 65535] = 65535
# im_uint16 = np.round(depthBuffer).astype(np.uint16)
# depthBuffer = im_uint16 

下面是.tiff图片的例子

最后,我想说的是这些深度图像一直在变化(查看所有这些图像,然后到 RGB 并再次传递到深度图像,无论是同一图像还是显示不同的图像。我从来没有以前见过这样的东西。

我想“我前段时间设法解决了这个问题,不妨 post 找到答案”。

必须考虑img的数据结构!

    img = p.getCameraImage(224, 224, shadow = False, renderer=p.ER_BULLET_HARDWARE_OPENGL)
    rgb_opengl = (np.reshape(img[2], (IMG_SIZE, IMG_SIZE, 4)))
    depth_buffer_opengl = np.reshape(img[3], [IMG_SIZE, IMG_SIZE])
    depth_opengl = far * near / (far - (far - near) * depth_buffer_opengl)
    seg_opengl = np.reshape(img[4], [IMG_SIZE, IMG_SIZE]) * 1. / 255.

    rgbim = Image.fromarray(rgb_opengl)
    rgbim_no_alpha = rgbim.convert('RGB')

    rgbim_no_alpha.save('dataset/'+obj_name+'/'+ obj_name +'_rgb_'+str(counter)+'.jpg')
    # plt.imshow(depth_buffer_opengl)
    plt.imsave('dataset/'+obj_name+'/'+ obj_name+'_depth_'+str(counter)+'.jpg', depth_buffer_opengl)
    # plt.show()

最终图片: