multi_camera 示例捕获多个摄像头,并将它们合成为一个帧。在合成图像后,该示例将合成帧渲染到显示器上。
该示例使用 libargus 中的多会话功能来同时捕获多个摄像头。它按如下方式使用摄像头:
以下示意图显示了摄像头输出合成的结果。如果摄像头 1-5 不存在,则相应的窗口将不存在。
此示例需要
$ cd 13_multi_camera $ make
$ ./multi_camera [-n <number of cameras>]
下图显示了数据在示例中的流动。
下表描述了示例使用的关键 NvMedia 声明。
类和方法 | 描述 |
---|---|
NvEglRenderer | 此类包含将帧渲染到 EGL 窗口的元素和函数。 |
NvEglRenderer::render() | 将来自文件描述符的缓冲区渲染到 EGL 窗口。 |
函数 | 描述 |
---|---|
NvBufferCreateEx() | 创建一个 DMA 缓冲区。该示例使用此函数为合成图像和输入图像创建缓冲区。 |
NvBufferDestroy() | 销毁 DMA 缓冲区。 |
NvBufferComposite() | 将多个输入缓冲区合成为一个 DMA 缓冲区。 |
有关 libargus API 的指南,请参阅 Libargus 摄像头 API。
下表描述了关键示例元素。
元素 | 描述 |
---|---|
Execute | 生产者线程,用于创建输出流并提交捕获请求。 |
ConsumerThread::threadExecute | 消费者线程,用于从多个摄像头读取帧。 |
CaptureHolder | 表示单个摄像头的类。此类包含所有用于从该摄像头捕获帧的 Libargus 摄像头 API 资源。 |
CaptureHolder::initialize | 用于为单个摄像头创建和初始化 libargus 资源的方法,包括 Argus::ICaptureSession、Argus::OutputStream 和 Argus::Request(捕获请求)。 |