我正在研究对象分类(和检测任务)。我需要同时使用激光雷达和相机数据。我设法获得了图像平面上的3D点坐标,但是随后在计算新激光雷达图像的像素值时遇到了一些困难。我遵循文章的想法:
这是我用于生成激光雷达图像的代码:
"""
1. Color Point Cloud from RGB Image
2. Project Point Cloud into RGB Image for depth
3. Also apply to Gray Image
"""
def lidar_camera_fusion2(point_cloud, image, T_velo_cam, P_velo_image):
image_size = image.shape
point_cloud_size = point_cloud.shape[0]
X_coordinates = point_cloud[:,0]
Y_coordinates = point_cloud[:,1]
Z_coordinates = point_cloud[:,2]
Ref_values = point_cloud[:,3]
print("Creating Lidar Image...")
image_lidar = np.zeros(image_size, dtype=np.uint8)
xyz = point_cloud.copy()
xyz[:,3] = 1.0 # Assign all reflectance to 1
# project into image
velo_img = np.dot(P_velo_image, xyz.T).T #P_velo_image = P_rect[i] *R_rect_00*T_cam_velo,
# normalize homogeneous coordinates
velo_img = np.true_divide(velo_img[:,:2], velo_img[:,[-1]]) #Divide the first two columns by the third column element for each row
velo_img = np.round(velo_img).astype(np.uint16) #Arrondit à l'entier supérieur car les index des pixels doivent être des entiers
#Compute DHI channels
# compute depth
depth = 255 * (1 -np.minimum(X_coordinates/max(X_coordinates), 1))
depth = np.round(depth).astype(np.uint16)
#compute height
height = 255 * (1 -np.minimum(Z_coordinates/max(Z_coordinates), 1))
height = np.round(height).astype(np.uint16)
#compute intensity
intensity = 255 * (1 -np.minimum(Ref_values/max(Ref_values), 1))
intensity = np.round(intensity).astype(np.uint16)
for pt in range(0, velo_img.shape[0]):
row_idx = velo_img[pt][1]
col_idx = velo_img[pt][0]
if (row_idx >= 0 and row_idx < image_size[0]) and (col_idx >= 0 and col_idx < image_size[1]):
# assign point cloud to image pixel
image_lidar[row_idx][col_idx]=[height[pt],depth[pt],intensity[pt]]
return image_lidar
这是我的结果:
我认为该图片提供的信息不足以用于CNN。
使用的数据集是Kitti数据集。这是与点云关联的摄像机图像:
我尝试了另一种方法,但是我认为它对CNN也不起作用。
我的代码有什么问题?用于编码深度,高度和反射率的像素值应该是多少,或者仅将深度和反射率编码为什么像素值。我想使用深度图像(从点云生成)和“反射图像”,将其与相机图像一起使用,以通过多模式深度学习进行对象分类。
提前谢谢