RGB 图像转换到 BEV 视角的设计说明
1. 背景
BEV(Bird's Eye View,俯视图)是一种将相机采集到的透视图像转换到地面俯视视角的表达方式。它的优势在于:
-
空间尺度统一,便于直接进行距离测量
-
多相机结果更容易拼接到同一平面
-
更适合做地面目标检测、占用分析、区域分割和路径规划
本项目的目标,是将一个或多个相机的 RGB 图像转换为统一的 BEV 图像输出。整体方法属于基于地面平面的 IPM(Inverse Perspective Mapping,逆透视映射)方案。
这里的核心假设是:
-
感兴趣区域主要位于地面或近地平面
-
车辆与相机的外参是已知的
-
相机内参和投影矩阵已知
-
场景可以近似为"单一平面投影问题"
在这个假设下,可以把 RGB 图像中的地面区域展开成俯视图。
2. 目标与输入输出
2.1 目标
系统需要完成以下任务:
-
接收一组相机 RGB 图像
-
根据相机内外参,将可见地面区域映射到统一的 BEV 平面
-
将多路相机结果融合成一张 BEV 图
-
输出可供后续模块使用的俯视图像
2.2 输入
系统运行所需输入主要包括四类。
1. RGB 图像流
每路相机持续输入 RGB 图像,作为颜色来源。
2. 相机内参
每个相机需要提供:
-
图像宽度与高度
-
相机内参矩阵
-
畸变参数
-
投影矩阵
这些参数决定三维点如何投影到像素平面。
3. 相机外参
系统需要知道相机相对于车辆坐标系的位姿,包括:
-
平移
-
旋转
在实现上,外参不是直接固定写死,而是通过 TF 链动态组合得到。
4. BEV 配置参数
主要包括:
-
BEV 的物理宽度
-
BEV 的物理高度
-
BEV 分辨率
-
车辆参考原点到地面的高度
-
IPM 平面的高度
2.3 输出
输出是一张 BEV 图像,特点如下:
-
每个像素对应固定物理尺寸
-
坐标关系统一
-
颜色来自原始 RGB 图像采样
-
多路相机结果在同一平面上融合
它可以作为后续感知模块的输入,例如:
-
地面区域分割
-
目标定位
-
可通行区域提取
-
轨迹规划辅助
3. 系统总体思路
整个系统采用"先建映射,再按映射取色"的方式,而不是每帧重新做完整几何变换。
其总体流程为:
-
读取 BEV 参数
-
读取相机内参
-
获取车辆到相机的外参
-
建立每个相机到 BEV 的映射关系
-
接收图像
-
根据映射关系从 RGB 图中取色
-
填充并融合为一张 BEV 图
-
输出最终结果
这个设计的关键点在于:
-
几何计算集中在初始化阶段
-
运行阶段以查表为主
-
有利于降低每帧计算量
4. 坐标系与变换关系
系统涉及四个主要空间。
4.1 BEV 像素坐标系
这是输出图像的二维像素网格,表示最终俯视图上的位置。
记为:
- `(u_bev, v_bev)`
4.2 BEV 平面物理坐标系
这是将 BEV 像素换算成物理长度后的平面坐标系。
记为:
- `(x_bev, y_bev, z_bev)`
其中:
-
`z_bev = 0`
-
表示该点位于定义好的 IPM 平面上
4.3 车辆坐标系
这是整个系统的统一参考坐标系,BEV 平面中的点需要先转到这里,才能和相机外参建立关系。
记为:
- `(x_vehicle, y_vehicle, z_vehicle)`
4.4 相机坐标系
这是每个相机自己的三维坐标系,只有把点变换到相机系后,才能进行透视投影。
记为:
- `(X_cam, Y_cam, Z_cam)`
4.5 坐标变换链路图
```text
BEV 像素坐标
(u_bev, v_bev)
|
| 依据分辨率和图像中心换算
v
BEV 平面物理点
(x_bev, y_bev, 0)
|
| 加入 BEV 平面与车辆参考原点的高度差
v
车辆坐标系点
(x_vehicle, y_vehicle, z_vehicle)
|
| 通过相机外参逆变换
v
相机坐标系点
(X_cam, Y_cam, Z_cam)
|
| 通过投影矩阵做透视投影
v
图像平面齐次坐标
(u', v', w')
|
| 归一化
v
RGB 图像像素
(u_img, v_img)
|
| 读取颜色值
v
填充到对应的 BEV 像素
```
5. 核心数学流程
5.1 从 BEV 像素到 BEV 平面点
设:
-
BEV 图宽为 `W`
-
BEV 图高为 `H`
-
分辨率为 `r`
则某个 BEV 像素 `(u_bev, v_bev)` 对应的物理点为:
\[
x_{bev} = (0.5H - v_{bev}) \cdot r
\]
\[
y_{bev} = (0.5W - u_{bev}) \cdot r
\]
\[
z_{bev} = 0
\]
这一步的含义是:
-
把规则像素网格还原成实际地面上的米制坐标
-
输出图中的每个像素都对应一个地面采样点
5.2 从 BEV 平面到车辆坐标系
系统定义了两个高度:
-
车辆参考原点离地高度
-
IPM 平面高度
设高度差为:
\[
\Delta h = h_{vehicle} - h_{ipm}
\]
则车辆坐标系下的点为:
\[
x_{vehicle} = x_{bev}
\]
\[
y_{vehicle} = y_{bev}
\]
\[
z_{vehicle} = z_{bev} - \Delta h
\]
由于 `z_bev = 0`,因此所有点最终都落在:
\[
z_{vehicle} = -\Delta h
\]
这说明整个 BEV 是建立在一个固定高度平面上的。
5.3 从车辆坐标系到相机坐标系
设相机外参矩阵为:
\[
T_{vehicle \leftarrow cam}
=
\begin{bmatrix}
R & t \\
0 & 1
\end{bmatrix}
\]
其中:
-
`R` 为旋转矩阵
-
`t` 为平移向量
它描述"相机坐标系中的点如何变到车辆坐标系"。
因此若已知车辆系点,要变换到相机系,应使用逆变换:
\[
P_{cam} = T_{vehicle \leftarrow cam}^{-1} P_{vehicle}
\]
若结果满足:
\[
Z_{cam} \le 0
\]
则说明该点在相机后方,不能用于有效成像,应舍弃。
5.4 从相机坐标系到图像坐标
设投影矩阵为:
\[
P =
\begin{bmatrix}
p_{11} & p_{12} & p_{13} & p_{14} \\
p_{21} & p_{22} & p_{23} & p_{24} \\
p_{31} & p_{32} & p_{33} & p_{34}
\end{bmatrix}
\]
则:
\[
\begin{bmatrix}
u' \\
v' \\
w'
\end{bmatrix}
=
P
\begin{bmatrix}
X_{cam} \\
Y_{cam} \\
Z_{cam} \\
1
\end{bmatrix}
\]
归一化得到图像像素:
\[
u_{img} = \frac{u'}{w'}
\]
\[
v_{img} = \frac{v'}{w'}
\]
如果满足:
\[
0 \le u_{img} < image\_width
\]
\[
0 \le v_{img} < image\_height
\]
则该投影有效。
6. 映射表机制
本项目不是运行时逐像素动态求解,而是提前建立映射表。
映射表的本质是:
```text
相机图像像素 <-> BEV 图像像素
```
更准确地说,是针对每个相机保存一批映射项:
```text
(u_img, v_img) -> (u_bev, v_bev)
```
这样做有三个直接好处:
-
初始化后几何关系固定
-
运行时只需查表和拷贝像素
-
多相机融合更容易统一处理
7. 运行时图像生成过程
当一组图像到来时,系统执行如下步骤:
-
从各相机缓存中取出待处理图像
-
初始化一张空白 BEV 图
-
对每路相机遍历其映射表
-
根据映射表从 RGB 图像中读取像素颜色
-
将颜色写入 BEV 对应像素
-
如有重叠区域,则做简单融合
-
输出完整 BEV 图
8. 具体数值推导示例
下面用一组具体参数,展示一个 BEV 像素如何落到 RGB 图像中的某个像素。
8.1 已知参数
BEV 参数
-
BEV 宽度:`3.0 m`
-
BEV 高度:`3.0 m`
-
分辨率:`0.01 m/px`
-
输出图大小:`300 x 300`
-
车辆参考原点离地:`0.09 m`
-
IPM 平面高度:`0.00 m`
因此:
\[
\Delta h = 0.09 m
\]
相机投影矩阵
\[
P =
\begin{bmatrix}
301.50098 & 0 & 312.48437 & 0 \\
0 & 305.20645 & 236.11535 & 0 \\
0 & 0 & 1 & 0
\end{bmatrix}
\]
相机相对车辆的位姿
平移向量近似为:
\[
t =
\begin{bmatrix}
0.511815 \\
0 \\
0.056
\end{bmatrix}
\]
旋转矩阵近似为:
\[
R \approx
\begin{bmatrix}
-0.0079 & -0.2731 & 0.9619 \\
-0.9996 & 0.0273 & -0.0005 \\
-0.0261 & -0.9616 & -0.2732
\end{bmatrix}
\]
8.2 选择一个 BEV 像素
选择:
\[
(u_{bev}, v_{bev}) = (150, 0)
\]
这表示 BEV 图顶边中间附近的一个点。
8.3 转成地面物理点
由公式:
\[
x_{bev} = (150 - 0)\cdot0.01 = 1.5
\]
\[
y_{bev} = (150 - 150)\cdot0.01 = 0
\]
\[
z_{bev} = 0
\]
所以:
\[
P_{bev} =
\begin{bmatrix}
1.5 \\
0 \\
0 \\
1
\end{bmatrix}
\]
8.4 转到车辆坐标系
考虑高度差后:
\[
P_{vehicle} =
\begin{bmatrix}
1.5 \\
0 \\
-0.09 \\
1
\end{bmatrix}
\]
8.5 转到相机坐标系
先减平移:
\[
P_{vehicle} - t =
\begin{bmatrix}
0.988185 \\
0 \\
-0.146
\end{bmatrix}
\]
再乘旋转逆矩阵,得到:
\[
P_{cam} \approx
\begin{bmatrix}
-0.0040 \\
-0.1295 \\
0.9905
\end{bmatrix}
\]
因为:
\[
Z_{cam} = 0.9905 > 0
\]
所以这是一个相机可见点。
8.6 投影到图像平面
计算:
\[
\begin{bmatrix}
u' \\
v' \\
w'
\end{bmatrix}
=
P
\begin{bmatrix}
-0.0040 \\
-0.1295 \\
0.9905 \\
1
\end{bmatrix}
\approx
\begin{bmatrix}
308.30 \\
194.34 \\
0.9905
\end{bmatrix}
\]
归一化后:
\[
u_{img} = \frac{308.30}{0.9905} \approx 311.26
\]
\[
v_{img} = \frac{194.34}{0.9905} \approx 196.21
\]
因此最终图像像素约为:
\[
(u_{img}, v_{img}) \approx (311.26,\ 196.21)
\]
离散到整数像素后可近似取为:
\[
(311,\ 196)
\]
所以整个链路可以写成:
```text
BEV 像素 (150, 0)
-> 地面点 (1.5, 0, 0)
-> 车辆系点 (1.5, 0, -0.09)
-> 相机系点 (-0.0040, -0.1295, 0.9905)
-> 图像像素 (311.26, 196.21)
-> 取 RGB 颜色
-> 写回 BEV 像素 (150, 0)
```
9. 误差来源分析
该方案虽然结构清晰,但会受到以下误差影响。
9.1 地面平面假设误差
这是最主要误差来源。
因为系统默认所有点都落在同一个平面上,所以:
-
地面起伏
-
台阶
-
坡面
-
凸起障碍物
-
目标顶部区域
都会被错误压到同一个平面上,导致 BEV 中的位置偏移或形状拉伸。
9.2 外参误差
如果相机相对车辆的平移或旋转有偏差,BEV 结果会直接发生整体错位。
典型表现为:
-
多相机拼接边界不对齐
-
地面线条断裂
-
同一物体在不同相机投影位置不一致
9.3 内参和投影矩阵误差
相机焦距、主点或投影矩阵不准确时,会导致:
-
BEV 尺度错误
-
图像边缘区域偏差较大
-
投影位置系统性漂移
9.4 畸变未充分补偿
系统虽然读取了畸变参数,但当前核心映射中没有显式做去畸变处理,因此:
-
广角镜头边缘会有更明显误差
-
BEV 周边区域几何失真更大
9.5 时间同步误差
如果多相机帧之间存在时间差,而车辆或目标在运动,则会出现:
-
拼接接缝错位
-
动态目标撕裂
-
不同相机区域无法精确重合
10. 当前融合方式及其影响
当前重叠区域采用简单平均值融合。
这种方式优点是:
-
实现简单
-
开销低
-
能避免完全覆盖造成的硬切换
但缺点也明显:
-
接缝区域可能发糊
-
曝光差异会导致颜色不一致
-
没有考虑哪个相机视角更优
-
没有考虑遮挡关系
11. 可优化方向
11.1 去畸变预处理
在建立映射或取色前,先对原图做去畸变,可以显著减小边缘投影误差。
11.2 更合理的相机融合策略
可以将简单平均升级为:
-
按视角夹角加权
-
按距离加权
-
按清晰度加权
-
羽化融合
-
接缝优化
这样可以改善重叠区域质量。
11.3 更严格的时间同步
对于多相机场景,建议使用基于时间戳的同步策略,而不是简单取最新帧,以减少动态场景中的拼接误差。
11.4 只对有效区域建图
可以为每个相机限定有效地面区域,只在可信范围内投影,减少边缘误投和无效填充。
11.5 由单平面扩展到分层或高程模型
如果场景不再满足单一平面假设,可以考虑:
-
多平面建模
-
稀疏高程补偿
-
深度辅助投影
-
语义分层投影
这样能更准确处理障碍物和地形起伏。
12. 总结
本项目的 RGB 转 BEV 实现,可以概括为以下一句话:
**先把 BEV 图中的每个像素解释成地面上的一个物理点,再通过相机内外参把这个物理点投影到 RGB 图中取颜色,最后把所有颜色回填成一张俯视图。**
其工程特点是:
-
结构直接
-
初始化和运行时职责清晰
-
易于多相机扩展
-
适合平坦地面场景
其主要局限是:
-
强依赖地面平面假设
-
受标定精度影响大
-
当前融合和同步策略较基础