雷达到相机的重投影

实现条件

  1. 相机图像、内参矩阵[3×3]、形变参数[1×5]
  2. 雷达点云
  3. 二者外参[4×4], 包含旋转、平移

上代码

导入库文件

import open3d as o3d
import cv2
from PIL import Image
from pylab import *
import matplotlib.pyplot as plt

IMAGE_FILE = "/home/txz/数据集/0318_1613/1650/png/000.png"
PCD_FILE   = "/home/txz/数据集/0318_1613/1650/pcd/1679129443.995743513.pcd"
extrinsic  = "/home/txz/lidar_camera_ws/data_set/result/extrinsic.txt"

cloud = o3d.io.read_point_cloud(PCD_FILE)  # 需要准备自己的pcd文件
cloud = np.asarray(cloud.points)

# 参数提取
L2C_MAT = np.loadtxt(extrinsic, delimiter=",",dtype=np.float32)
rot_mat = L2C_MAT[:3,:3]
# 经过矩阵转置,以及罗德里格斯变换得到的旋转矩阵
rvec,_ = cv2.Rodrigues(rot_mat)
# 经过排序修改后得到的平移矩阵
tvec  = L2C_MAT[:3,3]

# 相机内参
camera_matrix = np.array([909.5165940000001, 0, 613.6350650000001, 0, 913.203517, 396.620893, 0, 0, 1]).reshape(-1,3)
# 相机形变
distCoeffs = np.array([0.08947899999999999, -0.06453299999999999, -0.002094, -0.011071, 0])

# 进行点云由3D到2D的转换
point_2d, _ = cv2.projectPoints(cloud, rvec, tvec, camera_matrix, distCoeffs)



# 重投影绘制在图像上
im = cv2.imread(IMAGE_FILE, cv2.IMREAD_COLOR)
x = []
y = []

m = -1
for point in point_2d[::]:
    m = m+1
    x_2d = point[0][0]
    y_2d = point[0][1]

    if 0 <= x_2d <= 1280 and 0 <= y_2d <= 720:
        x.append(x_2d)
        y.append(y_2d)

x = np.array(x)
y = np.array(y)
plt.scatter(x, y, s=0.1)
plt.imshow(im)
plt.show()

原始图像
在这里插入图片描述

投影结果
在这里插入图片描述

### 将激光雷达坐标系转换到相机坐标系的方法 在多传感器融合应用中,尤其是自动驾驶和机器人导航领域,将激光雷达坐标系中的点云数据转换至相机坐标系是一项关键技术。这一过程依赖于先前完成的相机内部参数校准、外部参数(即相对于激光雷达的位置姿态)校正以及两者的联合标定[^1]。 #### 1. 坐标系定义 - **激光雷达坐标系 (LiDAR Coordinate System)**: 定义了空间内的三维点位。 - **相机坐标系 (Camera Coordinate System)**: 描述了成像平面的空间位置及其方向。 - **图像坐标系 (Image Coordinate System)**: 表达像素级别的二维坐标。 #### 2. 转换流程概述 为了实现从激光雷达坐标系向相机坐标系的数据映射,通常遵循以下步骤: - 首先执行旋转和平移操作来调整原点轴的方向一致性; - 接着利用已知的内外参矩阵进行进一步变换处理; - 最终通过投影模型把3D世界坐标投射到2D图像平面上[^2]。 #### 3. 数学表达式 假设存在一个点 \( P \),其初始位于激光雷达坐标系下的表示形式为 \( P_{L}=(X_L, Y_L, Z_L)^T\) ,经过一系列线性变化后,在新的基底——也就是相机坐标系里表现为\(P_C\): \[ P_C=R*P_L+T \] 其中, - \( R \) 是描述两者间相对方位角差异性的旋转变换阵列; - \( T \) 则代表沿各维度发生的偏移量矢量[^3]。 对于具体的计算方法而言,可以通过下面的方式来进行: ```matlab % MATLAB代码示例:将激光雷达相机坐标的转换 function Pc = lidarToCam(Pc, Pl, R, t) % 输入参数解释: % Pl - N×3 的矩阵,每一行对应一个来自 LiDAR 的 3D 点 [x y z] % R - 3×3 的旋转矩阵 % t - 3×1 的平移向量 % 执行仿射变换 Pc = bsxfun(@plus,Pl*R,t'); end ``` 上述函数实现了基本的功能需求,实际项目可能还需要考虑更多细节因素,比如噪声过滤等[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酸奶可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值