一.本章节介绍

本章节主要是介绍rockx+rv1126人脸识别推流项目的VI模块的初始化,这个项目的VI模块需要初始化两个,一个是用于rockx的人脸检测、人脸识别的处理。另外一个则用于显示AI处理结果。设置VI模块的代码在rkmedia_module_function.cpp里面。

二.VI模块的思维导图

上面思维导图主要是描述VI模块设置的大致流程,这里要创建两个RV1126_VI_CONFIG结构体并进行参数设置,第一个是用于rockx人脸检测、识别,第二个是用于显示AI处理结果。设置完参数之后,则需要调用rkmedia_vi_init去初始化这两个VI模块并且使能,最后把这两个VI模块的ID号存放到数组里面(vi_containers)。

三、VI模块代码的截图

3.1. rockxVI模块设置

idVI模块的id号,用于初始化和使能VI模块

pcVideoNode: 摄像头的视频节点,这里默认是rkispp_scale0

u32BufCnt缓冲区计数,默认是3

u32WidthVI模块分辨率宽度1920

u32HeightVI模块分辨率高度1080

enPixFmt图像格式默认是NV12,这里填的是IMAGE_TYPE_NV12

enBufTypeVI模块捕捉视频的类型,这里默认填写MMAP

enWorkModeVI工作模式,这里写的是VI_WORK_MODE_NORMAL

设置完上述参数后,则需要调用set_vi_container把VI的模块号放到数组里面,这里数组的索引号是0。

3.2.显示AI结果的VI模块设置

这部分的参数跟上面大部分是相同的,区别在于pcVideoNoderockx VI模块的pcVideoNode是rkispp_scale0,而显示VI模块的pcVideoNode是rkispp_scale1,下面我们来看具体的参数设置。

idVI模块的id号,用于初始化和使能VI模块

pcVideoNode: 摄像头的视频节点,这里选择的是rkispp_scale1

u32BufCnt缓冲区计数,默认是3

u32WidthVI模块分辨率宽度1920

u32HeightVI模块分辨率高度1080

enPixFmt图像格式默认是NV12,这里填的是IMAGE_TYPE_NV12

enBufTypeVI模块捕捉视频的类型,这里默认填写MMAP

enWorkModeVI工作模式,这里写的是VI_WORK_MODE_NORMAL

设置完上述参数后,则需要调用set_vi_container把VI的模块号放到数组里面,这里数组的索引号是1。

3.3. 启动两个VI模块进行视频采集

设置完两个VI模块的参数之后,就需要启动模块进行视频数据的采集,这里直接调用RK_MPI_VI_StartStream去开启摄像头的两个视频模块进行采集。

3.4. rkmedia_vi_init函数的实现

rkmedia_vi_init这个自定义函数里面,关键是对VI进行初始化和使能,它分别调用了RK_MPI_VI_SetChnAttr的API对VI模块的属性进行初始化,然后再调用RK_MPI_VI_EnableChn对其使能。

3.5. set_vi_container函数的实现

上面是set_vi_container函数的实现,这里要把VI的模块号存放到RV1126_VI_CONTAINTER结构体容器里面。

四、两个VI模块

1.VI节点

原理:一个摄像头可以分出多路视频输出,即一个摄像头,可以对应多个 rkispp_scale 节点。

一个 CMOS / Camera
        ↓
      ISP / ISPP
        ↓
  分出多路视频节点
        ↓
rkispp_scale0
rkispp_scale1
rkispp_scale2
...

这是同一个摄像头经过 ISP/ISPP 处理后分出来的多路输出

比如:

  • rkispp_scale0 -> 给 AI 算法识别用
  • rkispp_scale1 -> 给显示/预览用
  • rkispp_scale2 -> 可以给编码/录像/拍照用

它们可以是同一个画面,但是用途不同,也可以配置成不同分辨率。

2. 代码里的对应关系

#define AI_CMOS_DEVICE_NAME "rkispp_scale0"

rockx_rkmedia_vi_config.id = 0;
rockx_rkmedia_vi_config.attr.pcVideoNode = AI_CMOS_DEVICE_NAME;

这表示:VI 通道 0 -> rkispp_scale0 -> AI/算法取图

#define SHOW_CMOS_DEVICE_NAME "rkispp_scale1"

show_rkmedia_vi_config.id = 1;
show_rkmedia_vi_config.attr.pcVideoNode = SHOW_CMOS_DEVICE_NAME;

这表示:VI 通道 1 -> rkispp_scale1 -> 显示/预览

RK_MPI_VI_StartStream(0, 0);
RK_MPI_VI_StartStream(0, 1);

意思是:

启动 camera 0 的 VI 通道 0
启动 camera 0 的 VI 通道 1

同一个 Camera 0 下面的两个 VI 通道

最终关系图

Camera 0
  |
  +-- rkispp_scale0
  |       |
  |       +-- VI 通道 0
  |       |
  |       +-- AI / 算法取图
  |
  +-- rkispp_scale1
          |
          +-- VI 通道 1
          |
          +-- 显示 / 预览

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐