本文聚焦于FPGA VR相机的第二个迭代版本。相较于初代设计,新版摄像机性能大幅提升:它能够以30fps的帧率实时拍摄4K分辨率(3840 x 1920)的立体360度视频,并在设备端完成拼接与编码。除最终的H.264视频编码由NVIDIA Jetson TX2负责外,所有核心图像处理任务均直接在FPGA上高效执行。
第一版VR相机的外观与基础架构可参考其项目页面:https://hackaday.io/project/26974-vr-camera-fpga-stereoscopic-3d-360-camera。本文将深入解析第二版的硬件组成、数据处理流程与实现原理。
硬件组成
系统核心硬件清单如下:
- 友晶DE10-Nano开发板
- 8个Aptina AR0330摄像头模块(配备12毫米镜头卡口)
- 2块四摄像头接口PCB
- 1块NVIDIA Jetson TX2模块
相机的主要数据流遵循特定路径:多个摄像头捕获的图像首先通过摄像头接口PCB,传输至DE10-Nano开发板进行实时畸变校正、去马赛克以及初步图像拼接处理。处理后的彩色图像与用于深度计算的灰度图像,经由Parallel-to-CSI转换器,最终送入NVIDIA Jetson TX2完成立体拼接并编码为H.264格式视频流。
已实现功能模块
项目目前已成功开发并验证以下关键功能模块:
- 相机I2C控制
- 去马赛克模块
- 相机图像畸变矫正模块
- 摄像头接口PCB驱动与数据处理
- 灰度图像到单位像素的转换
- 基于3D图像的拼接、块匹配与光流算法
立体视觉拼接原理
如何从多个平面图像中构建出具有深度感的立体360度视频?系统采用了一种巧妙的图像分区与匹配策略。
首先,将每个摄像头捕获的灰度图像在水平方向上划分为三个垂直部分:左、中、右。每个部分恰好对应360度全景中的45度水平视场角。由于8个摄像头是均匀环形分布的,相邻摄像头间的视角差正好是45度。
假设我们按顺序观察三个相邻的摄像头A、B、C。那么,摄像头A所捕获图像的右三分之一区域、摄像头B图像的中心区域,以及摄像头C图像的左三分之一区域,在物理空间上指向的是完全相同的方向。如果拍摄的是无限远处的景物,这三个图像切片理应完全相同。
然而,为了在最终的VR视频中呈现立体深度,系统需要为左右眼提供有视差的图像。具体而言,当观看者面向该方向时,系统会使用摄像头C的左三分之一图像作为其右眼视图,同时使用摄像头A的右三分之一图像作为其左眼视图。当观看者头部向左转动时,其右眼看到的图像会从摄像头C的左三分之一,平滑过渡到摄像头B的左三分之一,从而创造出连贯且具有深度的沉浸式视觉体验。
本项目的全部设计文件、源码与文档均已公开,可通过以下链接获取:
https://github.com/colinpate
https://github.com/colinpate/fpga-vr-remap
项目的机械结构CAD设计文件托管在Onshape平台:
https://cad.onshape.com/documents/e230395963de661bfa5c14c7/w/05d75a95b60ee2972e714205/e/a708f4a0d0e872dd361e0a75
该项目完整展示了利用FPGA进行低延迟、高吞吐量图像处理与实时视频拼接的硬核能力,为构建高性能360度立体视频采集系统提供了一套可参考的开源硬件方案。对嵌入式视觉、实时处理感兴趣开发者,可以关注云栈社区以获取更多深入的技术解析与实践资源。
|