本项目是一个为智能车设计的嵌入式C语言项目,其核心功能是实现摄像头的逆透视变换(Inverse Perspective Mapping, IPM)。该功能能够将摄像头在前挡风玻璃处采集到的、带有透视畸变的赛道图像,实时转换为无畸变的俯视图(鸟瞰图)。
这种俯视图对于后续的路径规划、车道线识别、障碍物检测等高级自动驾驶算法至关重要,是智能车视觉处理的“第一步”。
本项目代码基于英飞凌(Infineon)TC26B系列微控制器,并使用了特定于该平台的硬件驱动。
本项目的主要实现代码均在 code/perspective.c 文件中。
-
逆透视矩阵计算:
- 实现了基于四点对应关系的单应性矩阵(Homography Matrix)求解算法。
- 通过选取透视图像中的四个点(如赛道边线的四个角点)和它们在俯视图中对应的目标点,可以精确计算出3x3的逆透视变换矩阵。
- 算法包含了点集归一化(DLT算法)和高斯消元法解线性方程组,以提高计算的稳定性和精度。
-
图像变换:
Image_Transformed函数利用计算出的逆透视矩阵,通过反向插值的方式,逐点将原始图像转换为俯视图像。- 能够处理实时摄像头采集的每一帧图像。
-
自动化标定流程:
- 提供了一套通过物理按键触发的自动化标定流程 (
Get_inverse_matrix函数)。 - 按键1: 触发四点自动检测 (
Get_Four_Points)。程序会自动从图像中寻找赛道边线的远、近四个角点,并进行初步的逆透视变换,将结果显示在屏幕上。 - 按键2: 对变换结果进行微调并保存。该功能会自动分析变换后图像的有效区域,智能调整俯视图的“视距”(
up_distance),然后将最终计算出的逆透视矩阵永久写入到单片机的Flash中。
- 提供了一套通过物理按键触发的自动化标定流程 (
-
标定参数持久化:
Write_Matrix和Read_Matrix函数实现了将标定好的3x3逆透视矩阵写入Flash和从Flash读出的功能。- 这意味着标定工作只需进行一次,之后每次设备重启都能自动加载之前的标定参数,无需重复标定。
根据代码中的函数调用和变量类型推断,本项目依赖以下硬件:
- 主控MCU: Infineon TC26B
- 摄像头: MT9V03X 灰度图像传感器
- 显示屏: IPS200 LCD 显示屏 (用于显示原始图像和变换后的俯视图)
- 物理按键: 至少两个按键,用于触发标定流程。
- 非易失性存储: MCU片上Flash,用于存储标定矩阵。
要获得最佳的逆透视效果,请遵循以下标定步骤:
-
准备环境: 将智能车放置在光线良好、具有清晰直车道边界线的标准赛道上。确保摄像头视角正对赛道。
-
触发初始标定 (按键1):
- 按下
按键1。 - 程序将自动采集一帧图像,并运行
Get_Four_Points函数寻找赛道边线的四个角点。 - 接着,程序会计算出初始的逆透视矩阵,并调用
Perspective_Transform将原始图像转换为俯视图。 - 此时,您应该可以在显示屏上看到变换后的俯视图效果。
- 按下
-
微调并保存 (按键2):
- 按下
按键2。 - 程序会自动分析上一步生成的俯视图,并对
up_distance参数进行微调,以优化视野。 - 调整后,程序会重新计算并应用新的逆透视矩阵。
- 最关键的是,最终的逆透视矩阵将被调用
Write_Matrix函数保存到Flash中。 - 同时,程序会调用
ImagePerspective_Init函数,使新的矩阵立即生效。
- 按下
标定完成后,系统每次启动都会自动从Flash加载该矩阵,后续的视觉算法将直接使用这个精确的俯视图进行处理。