一、 简介
在“i.MAX RT 系列相机应用开发(上)”中,我们以 RT1050 为例介绍了如何分析系统结构、创建基本工程以及通过 CSI 捕获视频的过程。本文主要讲解如何在 LCD 上显示帧、如何在 SD 卡中压缩和存储 JPEG 格式的图片以及软件的结构。
二、 如何在 LCD 上显示帧
从“i.MAX RT 系列相机应用开发(上)”中,我们知道 CSI 是如何通过两个寄存器向 4 个帧缓冲区填充的,也知道 4 个帧缓冲区内的数据会被排空。那么,这 4 个帧缓冲区的数据是如何被排空的呢?在这我们引入两个 SDK 驱动程序函数 CSI_TransferSubmitEmptyBuffer() 和 CSI_TransferGetFullBuffer() ,顶层应用程序可以连续消耗 CSI 帧缓冲区的内容,如下图所示。
图 1 CSI 帧缓冲区排空方式
需要注意的一点是,两个缓冲区的指针被设计为交替指向四个帧缓冲区。这样做的目的是允许连续且同时进行帧缓冲区的填充和排空。
由于 LCD 的显示分辨率与摄像机的输出分辨率不同,因此需要额外的 LCD 缓冲区,并且 PXP 模块负责缓冲区分辨率的缩放。经缩放后,继续访问 LCD 帧缓冲区,如下图所示。
图 2 LCD 帧缓冲区访问方式
在这引入了两个 LCD 帧缓冲区和两个缓冲区指针。 PXP 通过两个指针填充两个缓冲区,而 eLCDIF 也通过两个指针耗尽两个缓冲区。同样,利用两个指针还可以使缓冲区同时且连续地进行填充和排空。
帧缓冲区的操作流程(包括对CSI 缓冲区和 LCD 缓冲区的操作)如图 3 所示。在这里,我们可以看到如何让缓冲区指针实现填充和排出操作是连续、同时和独立的。
图 3 CSI/LCD 帧缓存操作流程图
三、如何在 SD 卡中压缩和存储 JPEG
对于 RT1050 demo 的应用程序,当用户触摸 LCD 面板时,当前视频的帧将被压缩为 JPEG 格式并存储在 microSD 卡中。获取用于 JPEG 压缩的 CSI 帧的方法与获取用于 LCD 显示器帧的方法类似,在这我便不多赘述。
实际上,用于获得压缩和显示帧的代码是混合在一起。当收到一个 CSI 帧并由csiFrameBufPtr2 处理时,如图 3 所示,触摸事件将被轮询。如果检测到触摸事件,就会启动 JPEG 压缩。
四、软件结构
应用程序的整体软件结构如下图所示。
图 4 整体程序和数据流程图
在初始化过程中,程序会先初始化各种组件,例如系统时钟,引脚的多路复用器,摄像头设备, CSI , eLCDIF ,触摸面板和 SD 卡等。 然后,相机和 LCD 开始启动运行。
在工作会话中,CSI 会捕捉被填充进 CSI 缓冲区的帧。一方面,CSI 帧通过 PXP 缩放为 LCD 帧的大小,并通过 eLCDIF 传输到 LCD 面板。另一方面, CSI 帧可以选择被压缩为 JPEG 格式并存储到 microSD 卡中,可结合如下图看。
图 5 帧数据流程图
五、小结
本应用笔记介绍了使用基于 MCUXpresso SDK 的 i.MX RT1050 处理器开发相机应用程序的步骤,从创建一个空白项目到完成该应用程序。 SDK 提供的外围设备驱动程序和各种中间件使整个开发过程变得很容易,也可在此基础上自行开发相机应用程序。
【参考文献】
- Developing a Camera Application with i.MX RT Series
- MT9M114 Data Sheet, Rev. 12
- MT9M114 Register and Variable Reference, Rev. E
- IMXRT1060RM
评论