如何解决OSDAR23数据集点云投影至2D图像的精度问题?
点云投影到2D图像的问题(OSDAR23数据集)
我尝试将点云投影到高分辨率2D图像,但遇到了问题。目前使用cv2.projectPoints(point,R,T,camera_matrix, dist_coeffs)函数,在KITTI数据集上表现正常,但应用到OSDAR23数据集的点云数据时效果极差。我沿用了相同的数学逻辑,但结果依旧不佳,怀疑是对标定数据的理解存在问题。
以下是我的代码:
pcd = o3d.io.read_point_cloud('//15_construction_vehicle_15.1//lidar//075_1631531288.599807000.pcd') camera_matrix = np.array([[7267.95450880415, 0, 2056.049238502414], [0, 7267.95450880415, 1486.862908875167], [0, 0, 1]]) dist_coeffs = np.array([-0.0764891, -0.188057, 0, 0, 1.78279], dtype="float") T = np.array([0.0801578, -0.332862, 3.50982]) q = np.array([-0.00313306, 0.0562995, 0.00482918, 0.998397]) R = Rot.from_quat(q).as_matrix() # x,y,z -> -y,-z,x R0 = np.array([[0, 0, 1], [-1, 0, 0], [0, -1, 0]]) R = R0.dot(R2) # 此处R2未定义,疑似笔误 Re = np.linalg.inv(R) Tinv = -1 * Re.dot(T) pointcloud = np.array(pcd.points) image = cv2.imread( "//15_construction_vehicle_15.1//rgb_highres_center//075_1631531288.600000017.png",cv2.IMREAD_UNCHANGED) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) points2D_reproj = cv2.projectPoints(pointcloud, Re, Tinv, camera_matrix, dist_coeffs) points2D_reproj = points2D_reproj[0][:, 0].astype(int) pixel = points2D_reproj filter = np.where((pixel[:, 0] < 4112 ) & (pixel[:, 1] < 2504) & (pixel[:, 0] >= 0) & (pixel[:, 1] >= 0)) pixel = pixel[filter] plt.scatter(pixel[:, 0], pixel[:, 1] , s=1) plt.imshow(image) plt.show()
排查方向
- 代码笔误:代码中
R = R0.dot(R2)里的R2是未定义变量,应该是R = R0.dot(R),这会直接导致旋转矩阵计算错误,是核心问题之一。 - 坐标系映射验证:
R0定义的坐标系转换(x,y,z → -y,-z,x)是否完全匹配OSDAR23数据集的LiDAR与相机坐标系定义?不同数据集的轴朝向(比如LiDAR的前进方向是x还是z)可能不同,必须对照数据集标定文档确认。 - 外参矩阵方向:
cv2.projectPoints要求的是点云(LiDAR)坐标系到相机坐标系的转换参数,即R是相机相对于LiDAR的旋转,T是相机相对于LiDAR的平移。需要确认OSDAR23提供的标定参数是LiDAR→相机,还是相机→LiDAR的转换,避免搞反转换方向。 - 畸变参数格式:OpenCV的
dist_coeffs默认顺序是(k1, k2, p1, p2, k3),需确认OSDAR23提供的畸变参数顺序是否完全一致,顺序错误会导致投影畸变。 - 时间同步:LiDAR点云与图像的时间戳存在微小差异,若采集时车辆运动剧烈,可能导致投影偏移,需确认数据集是否提供时间同步后的配对数据。
内容的提问来源于stack exchange,提问作者Juergen
相关产品推荐
相关产品推荐

