FPGA探索者
哈,你们这想法挺硬核的,直接上 FPGA 干摄像头数据。延迟压到 10ms 内,重点就一句话:别等整帧!
从 RAW 到中线参数,每一步都设计成流水线,而且是最短可能的流水线。举个例子,摄像头通常逐行输出,那就设计成行处理流水线。色彩空间转换、二值化、边缘检测,都可以在收到一行数据后立刻开始,不需要等帧结束。
存储架构上,最吃资源的是图像缓冲。完全没必要存全帧。边缘提取通常只需要上下几行,所以用几个行缓冲(FIFO 或 Shift Register)存最近几行就够了。这样,延迟就从“一帧时间+处理时间”缩短到“几行时间+处理时间”。按 120fps 算,一帧都 8ms 多了,等不起。用行缓冲,延迟可能就零点几毫秒。
并行性要充分利用。比如二值化,阈值比较可以同时对一行里的所有像素做。边缘检测的算子(比如 Sobel)计算,也可以设计成并行计算多个像素的梯度。但要注意平衡,并行度太高消耗资源多,可能影响时序。
中线拟合这块,如果用的是扫描线找边缘点再拟合,可以在检测到边缘点后就实时进行拟合计算,比如用递推最小二乘法,来一个点更新一次参数,不要等所有点都收集齐。这样输出中线参数几乎是连续的,延迟极低。
最后提个醒,选 FPGA 时注意片上 Block RAM 的大小和速度,确保够放行缓冲和中间数据。还有,摄像头接口(比如 DVP 或 MIPI)的数据接收部分也要优化好,别在那卡住了。整个流水线用状态机好好控制,保证数据源源不断。
