0

我有一个以 24 位编码的深度图(标记为“原始”)。使用以下代码:

carla_img = cv.imread('carla_deep.png', flags=cv.IMREAD_COLOR)
carla_img = carla_img[:, :, :3]
carla_img = carla_img[:,:,::-1]
gray_depth = ((carla_img[:,:,0] + carla_img[:,:,1] * 256.0 + carla_img[:,:,2] * 256.0 * 256.0)/((256.0 * 256.0 * 256.0) - 1))
gray_depth = gray_depth * 1000

我能够将其转换为“转换后的”图像。如此处所示:https ://carla.readthedocs.io/en/latest/ref_sensors/ 在此处输入图像描述

我怎样才能扭转这个过程(不使用任何更大的外部库并且最多使用openCV)?在 Python 中,我在 OpenCV 的帮助下创建了一个深度图。我想以 Carla(24 位)的形式保存获得的深度图。

这就是我创建深度图的方式:

imgL = cv.imread('leftImg.png',0)
imgR = cv.imread('rightImg.png',0)
stereo = cv.StereoBM_create(numDisparities=128, blockSize=17)
disparity = stereo.compute(imgL,imgR)

CameraFOV = 120
Focus_length = width /(2 * math.tan(CameraFOV * math.pi / 360))
camerasBaseline = 0.3
depthMap = (camerasBaseline * Focus_length) / disparity

如何以与标有“原始”的图片相同的形式保存获得的深度图?

4

1 回答 1

1

文档说

normalized = (R + G * 256 + B * 256 * 256) / (256 * 256 * 256 - 1)
in_meters = 1000 * normalized

因此,如果您有深度图in_meters,则可以通过重新排列方程式来执行相反的操作。

需要确保您的深度图(来自块匹配)以米为单位。假设您的相机的基线为 0.3 米,您的计算看起来很合理。

第一个变体

使用除法和模运算将计算分开。

需要各种.astype将浮点数转换为整数,将较宽的整数转换为窄整数(图片的假设)。

normalized = in_meters / 1000
BGR = (normalized * (2**24-1)).astype(np.uint32)
BG,R = np.divmod(BGR, 2**8)
B,G = np.divmod(BG, 2**8)
carla_img = np.dstack([B,G,R]).astype(np.uint8) # BGR order

第二种变体

也可以使用 a 来执行此操作view,将 uint32 数据重新解释为四个 uint8 值。这假设了一个小端系统,这是一个公平的假设,但需要注意它。

...
reinterpreted = BGR.view(np.uint8) # lowest byte first, i.e. order is RGBx
reinterpreted.shape = BGR.shape + (4,) # np.view refuses to add a dimension

carla_img = reinterpreted[:,:,(2,1,0)] # select BGR
# this may require a .copy() to get data without holes (OpenCV may want this)

免责声明

我无法测试此答案中的代码,因为您没有提供可用数据。

于 2022-01-22T18:59:53.003 回答