Cambricon CE3226 媒体处理系统 (五):应用编程

   随着 AI 技术的不断发展,从 Sensor 采集数据,经过处理之后给 AI 模型做图像分析已经变成一个很典型的应用。因此,在嵌入式应用行业,无论是汽车,安防,手机等应用中,对 Sensor 采集的数据做图像处理变得非常重要。针对以上需求,Cambricon CE3226 内部集成了多个复杂的硬件组件,并实现了对应的中间层软件库,能够满足客户对视频处理的各种要求。
    本系列博文会对 CNMPS(Cambricon Media Process System,寒武纪媒体处理系统)各个组件功能,工作原理作详细介绍,并对中间层软件作系统分析,方便客户编写自己的应用程序。
    本文是该系列博文的第五篇,结合前面四篇所述内容,创建一个简单的应用程序。

  • APP Demo 演示

1.启动开发板:

按照图(1)所示连接好开发板并启动。
图(1)

2.加载驱动:

进入 Linux 终端,在 /mps/ko 目录下,有各个模块的 .ko 驱动文件。执行 load3226v100_drv.sh 脚本,加载所有驱动。见图(2)。

图(2)

3.修改配置文件:

如图(3),使用 vi 打开 /mps/sample/cnsampleconfig.ini 文件,修改 Senseor Type为当前所使用的Sensor 以及对应的配置,并保存退出。

图(3)
 

4.运行 Demo:

运行 /mps/sample/vio 目录下的 demo 可执行程序 cnsample_vio。如果不加参数,会打印出如图(4)所示的使用方法。比如执行 ./cnsample_vio 0 ,屏幕便会显示摄像头图像。
图(4)

 

 

  • APP Demo 代码分析

cnsample_vio demo 的源代码为 /mps/sample/vio/cnsample_vio.cpp。用户 APP 编程流程大致与此类似。

  1. 定义全局变量。
包含 VI、VO 的配置信息,以及是否启动防抖,展宽,输入分辨率,输出分辨率。如图(5)所示。
图(5)

2.获取配置信息,并填充对应的 VI、VO、VPPS、SYS 属性结构体,调用用户 APP 启动相关组件。

① 图(6)为 VO 初始化函数:
图(6)

该函数首先调用 cnsampleCommSysGetPicSize(g_enVoPicSize, &stSize),根据 g_enVoPicSize 宏定义 PIC_720P,确定 width = 1080,height = 720;然后根据已定义的全局变量,填充 g_stVoConfig 结构体成员,并将之作为输入参数传递给 cnsampleCommVoStartVo(&g_stVoConfig),启动 VO 设备。

 

② 图(7)为 VPPS 初始化函数
图(7)


cnsampleVioInitVpps() 首先定义了 VPPS 的 Layer,Channel 属性结构体,像素格式,视频格式等结构体。然后调用两次 cnsampleCommSysGetPicSize(),分别获取VI 和 VO 的图像宽度和高度,其中 VI 的宽度和高度将做为 VPPS 的 Group 组件的配置参数,VO 的宽度和高度作为 VPPS Channel 组件的配置参数。

VI VPPS VO 的绑定关系如图(8)所示:
图(8)

 

接下来分别填充 Group 属性结构体 stVppsGrpAttr,Channel 属性结构体 stVppsChnAttr,并作为输入参数传递给 cnsampleCommVppsStart(VppsGrp, abChnEnable, &stVppsGrpAttr, stVppsChnAttr),启动 VPPS。

 

③ VI 启动函数见图(9):
图(9)

cnsampleVioInitVi() 主要功能是填充 g_stviconfig 结构体。除了已经做了宏定义的参数外,其余参数通过 cnsampleCommViGetClockBySensor()和 cnsampleCommViGetWdrModeBySensor()这个两个函数,根据 Sensor Type 的不同,获取预定义好的配置。

然后将 g_stviconfig 传给 cnsampleCommViStartVi(&g_stViConfig) 函数,启动 VI。VI 启动后,根据需求,调用 cnsampleVioSetDis(),cnsampleVioSetLdc(),cnsampleVioSetSpread(),依次设置防抖、畸变矫正、展宽效果。 

 

④系统初始化:

系统初始化函数cnsampleVioInitSys() 用于申请内存,其函数主体如图(10):

图(10)

该函数申请了 3 个内存缓存池。其中pool1为 sensor raw 数据内存,8个连续的视频缓存块组成,每个缓存块大小根据 RAW12像素格式和宽度,高度,压缩模式计算得出。Pool2 和 pool3 供 VPPS、VO、VENC 模块使用,为 10 个连续的缓存块,大小为 YUV420_8BIT 的像素格式以及宽度,高度,压缩模式计算得出。最后由 cnsampleCommSysInit(&stVbConf) 函数初始化系统。

 

 

3.main 函数

Main 函数主体如图(11):
图(11)

main函数中所涉及函数大部分在之前的章节中都有提及。

cnsampleCommViGetSensorInfo(&g_stViConfig) 用于获取 Sensor 信息。如前文所述,VI、VO、VPPS的部分属性参数都必须在 Sensor Type 确定后,再去获取对应的宏预定义配置去填充相关结构体。

该函数调用 cnsampeCommGetSensorCfg(),实现在 mps\sample\common\cnsample_comm_config.cpp 中,用于解析 sensor 配置文件 cnsampleconfig.ini,内容如图(3)所示。客户如需自行配置 sensor 参数,务必参照 /mps/sample 路径下的 .ini 文件的书写格式。 cnsampleconfig.ini 为单摄头配置,Cnsampleconfig_APS.ini 为四摄像头配置。

 

 

参考资料:

寒武纪媒体处理系统开发者手册-CN-v0.8.0.PDF

Cambricon CE3226 媒体处理系统(一):概述

Cambricon CE3226 媒体处理系统(二):视频输入

Cambricon CE3226 媒体处理系统(三):视频输出

Cambricon CE3226 媒体处理系统(四):视频处理子系统

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论