Linux_54:RV1126的VI模块讲解
一.本章节介绍
本章节主要是介绍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. rockx的VI模块设置

id:VI模块的id号,用于初始化和使能VI模块
pcVideoNode: 摄像头的视频节点,这里默认是rkispp_scale0
u32BufCnt:缓冲区计数,默认是3
u32Width:VI模块分辨率宽度1920
u32Height:VI模块分辨率高度1080
enPixFmt:图像格式默认是NV12,这里填的是IMAGE_TYPE_NV12
enBufType:VI模块捕捉视频的类型,这里默认填写MMAP
enWorkMode:VI工作模式,这里写的是VI_WORK_MODE_NORMAL
设置完上述参数后,则需要调用set_vi_container把VI的模块号放到数组里面,这里数组的索引号是0。
3.2.显示AI结果的VI模块设置

这部分的参数跟上面大部分是相同的,区别在于pcVideoNode。rockx VI模块的pcVideoNode是rkispp_scale0,而显示VI模块的pcVideoNode是rkispp_scale1,下面我们来看具体的参数设置。
id:VI模块的id号,用于初始化和使能VI模块
pcVideoNode: 摄像头的视频节点,这里选择的是rkispp_scale1
u32BufCnt:缓冲区计数,默认是3
u32Width:VI模块分辨率宽度1920
u32Height:VI模块分辨率高度1080
enPixFmt:图像格式默认是NV12,这里填的是IMAGE_TYPE_NV12
enBufType:VI模块捕捉视频的类型,这里默认填写MMAP
enWorkMode:VI工作模式,这里写的是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
|
+-- 显示 / 预览
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)