RGB 图像转换到 BEV 视角的设计说明

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. 系统总体思路

整个系统采用"先建映射,再按映射取色"的方式,而不是每帧重新做完整几何变换。

其总体流程为:

  1. 读取 BEV 参数

  2. 读取相机内参

  3. 获取车辆到相机的外参

  4. 建立每个相机到 BEV 的映射关系

  5. 接收图像

  6. 根据映射关系从 RGB 图中取色

  7. 填充并融合为一张 BEV 图

  8. 输出最终结果

这个设计的关键点在于:

  • 几何计算集中在初始化阶段

  • 运行阶段以查表为主

  • 有利于降低每帧计算量

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. 运行时图像生成过程

当一组图像到来时,系统执行如下步骤:

  1. 从各相机缓存中取出待处理图像

  2. 初始化一张空白 BEV 图

  3. 对每路相机遍历其映射表

  4. 根据映射表从 RGB 图像中读取像素颜色

  5. 将颜色写入 BEV 对应像素

  6. 如有重叠区域,则做简单融合

  7. 输出完整 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 图中取颜色,最后把所有颜色回填成一张俯视图。**

其工程特点是:

  • 结构直接

  • 初始化和运行时职责清晰

  • 易于多相机扩展

  • 适合平坦地面场景

其主要局限是:

  • 强依赖地面平面假设

  • 受标定精度影响大

  • 当前融合和同步策略较基础