一、鱼眼镜头原理与畸变类型

1. 鱼眼镜头工作原理

鱼眼镜头通过特殊的超广角光学设计,将180°甚至更广的视野压缩成圆形或椭圆形图像。其核心特点是:

  • 径向畸变显著:图像中心畸变小,边缘畸变大,直线会呈现弯曲(如桶形畸变)。
  • 透视投影特殊:采用等距投影、等积投影等特殊投影方式,而非普通镜头的针孔投影。
  • 像素分布不均:边缘像素密度低,中心像素密度高,需通过算法重新映射。

2. 常见畸变类型

  • 桶形畸变:图像边缘向外凸,直线呈弧线,是鱼眼镜头最典型畸变。
  • 离心畸变:由镜头制造缺陷导致,各方向畸变程度不一致。
  • 薄棱镜畸变:边缘出现色彩偏移或模糊。

二、RK3588的GDC模块矫正原理

1. 硬件加速流程

GDC模块通过以下步骤实现畸变矫正:

  1. 参数配置:通过结构体stFisheyeAttr设置安装模式(如墙壁安装FISHEYE_WALL_MOUNT)、校正区域、视角范围等。
  2. 像素重映射:根据畸变模型计算每个像素的新坐标,将鱼眼图像映射到目标矩形区域。
  3. 硬件加速:利用RK3588的专用硬件单元并行处理像素,相比纯软件方案效率提升5-10倍。

2. 关键参数说明

参数名 作用 典型取值
enMountMode 安装模式(墙壁/天花板等) FISHEYE_WALL_MOUNT
u32OutRadius 校正区域外半径(像素) 400-600(根据镜头调整)
u32Pan/Tilt 水平/垂直视角范围(°) 180(全景模式)
stOutRect 输出图像尺寸 1920×1080(常用分辨率)

三、开发流程与代码实践

1. 环境准备

  • 软件依赖:安装RK3588的SDK,包含librockchip_mpi.so库与头文件。
  • 硬件连接:确保鱼眼摄像头与开发板正确连接,支持MIPI/USB等接口。

2. 核心代码步骤

(1)参数初始化
// 鱼眼矫正属性结构体
FISHEYE_ATTR_S stFisheyeAttr = {
    .enMountMode = FISHEYE_WALL_MOUNT, // 墙壁安装模式
    .bEnable = RK_TRUE, // 启用矫正
    .u32RegionNum = 1, // 单个校正区域
    .astFishEyeRegionAttr = {
        [0] = {
            .enViewMode = FISHEYE_VIEW_NORMAL, // 普通视图模式
            .u32OutRadius = 442, // 外半径(需根据镜头实测调整)
            .stOutRect = {.u32Width = 1920, .u32Height = 1080}, // 输出分辨率
        }
    }
};

// GDC任务结构体
GDC_TASK_ATTR_S stTask = {
    .stImgIn = {.stVFrame = {
        .enPixelFormat = RK_FMT_YUV420SP_VU, // 输入格式
        .u32Width = 1920, .u32Height = 1080,
    }},
    .stImgOut = {.stVFrame = {
        .enPixelFormat = RK_FMT_YUV420SP_VU, // 输出格式与输入一致
        .u32Width = 1920, .u32Height = 1080,
    }},
};
(2)矫正任务执行
GDC_HANDLE hHandle;
RK_MPI_GDC_BeginJob(&hHandle); // 启动任务

// 添加矫正任务(传入参数与图像缓存)
RK_MPI_GDC_AddCorrectionTask(hHandle, &stTask, &stFisheyeAttr);

// 处理完成后结束任务
RK_MPI_GDC_EndJob(hHandle);

// 释放内存(关键:避免内存泄漏)
RK_MPI_MB_ReleaseMB(stTask.stImgIn.stVFrame.pMbBlk);
RK_MPI_MB_ReleaseMB(stTask.stImgOut.stVFrame.pMbBlk);
(3)结果验证
查看显示器输出的VO显示

四、常见问题与解决方案

1. 图像边缘模糊

  • 原因:外半径u32OutRadius设置过小,边缘像素重映射时插值不足。
  • 解决:增大u32OutRadius(如从442调整至500),或启用bLMF镜头映射补偿(RK_TRUE)。

2. 矫正后画面变形

  • 原因:视角范围u32Pan/Tilt与实际镜头不匹配,或安装模式错误(如天花板安装用了墙壁模式)。
  • 解决
    • 实测镜头视角,调整u32Pan(如鱼眼镜头实际视角270°则设为270)。
    • 切换安装模式:天花板安装用FISHEYE_CEILING_MOUNT

3. 性能瓶颈

  • 现象:帧率低于预期(如目标30fps但实际15fps)。
  • 解决
    • 启用硬件压缩:设置stTask.stImgIn.stVFrame.enCompressMode = COMPRESS_AFBC_16x16
    • 减少校正区域数量:u32RegionNum从多区域改为单区域。

五、效果优化技巧

1. 参数调优策略

问题场景 调整参数 示例值
边缘畸变残留 增大u32OutRadius 从442→550
画面拉伸过度 减小u32HorZoom/VerZoom 从4095→3000(缩小30%)
背景色干扰 调整u32BgColor 0(黑色)或0xFFFFFF(白色)

2. 多区域矫正

// 配置双区域矫正(中心与边缘分别处理)
stFisheyeAttr.u32RegionNum = 2;
stFisheyeAttr.astFishEyeRegionAttr[0].stOutRect.u32X = 0; // 左半区
stFisheyeAttr.astFishEyeRegionAttr[1].stOutRect.u32X = 1920/2; // 右半区

3. 与VPSS结合

  • 流程:VI采集→VPSS预处理(裁剪)→GDC矫正→VO显示。
  • 优势:先裁剪感兴趣区域再矫正,减少计算量,提升帧率。

六、进阶应用:全景拼接

1. 方案架构

  1. 多摄像头输入:4路鱼眼摄像头分别采集前、后、左、右画面。
  2. 独立矫正:每路调用GDC模块分别矫正。
  3. VPSS拼接:使用VPSS的RK_MPI_VPSS_SetChnCrop将4路图像拼合成全景图。

2. 关键代码

// 假设4个矫正通道(0-3)
for (int chn = 0; chn < 4; chn++) {
    // 配置各通道矫正参数(不同视角范围)
    stFisheyeAttr.astFishEyeRegionAttr[0].u32Pan = 90 * (chn + 1); // 每路90°视角
    // 执行GDC矫正
    RK_MPI_GDC_AddCorrectionTask(hHandle, &stTask, &stFisheyeAttr);
}

// VPSS拼接4路图像为3840×1080全景
VPSS_CHN_ATTR_S chnAttr;
chnAttr.stRect.u32Width = 1920;
chnAttr.stRect.u32Height = 1080;
for (int chn = 0; chn < 4; chn++) {
    chnAttr.stRect.s32X = chn * 1920; // 横向排列
    RK_MPI_VPSS_SetChnAttr(0, chn, &chnAttr);
}

七、总结

通过RK3588的GDC模块,可高效实现鱼眼图像的硬件级矫正,结合参数调优与多模块协作(VPSS、VO),能满足安防、车载等场景的高精度需求。开发中需重点关注镜头实测参数、内存管理及多任务并发处理,通过逐步调试u32OutRadiusenViewMode等核心参数,可显著提升矫正效果与性能。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐