基于Hi3559AV100 RFCN实现细节解析
下面随笔系列将对Hi3559AV100 RFCN实现细节进行解析,整个过程涉及到VI、VDEC、VPSS、VGS、VO、NNIE,其中涉及的内容,你们能够参考以前我写的博客:html
https://www.cnblogs.com/iFrank/p/14374658.htmlpost
基于Hi3559AV100的视频采集(VDEC-VPSS-VO)总体框图设计测试
https://www.cnblogs.com/iFrank/p/14370575.htmlspa
基于Hi3559AV100 RFCN实现细节解析-(1)VGS初介绍:线程
https://www.cnblogs.com/iFrank/p/14465306.html设计
基于Hi3559AV100的SVP(NNIE)开发总体流程 :code
https://www.cnblogs.com/iFrank/p/14377668.html视频
首先给出总体的RFCN流程图解,整个RFCN分为3个step,具体以下所示:htm
在分析RFCN数据流以前,首先了解一下基于Hi3559AV100的NNIE模型,在搭建好SDK等环境后,配置好对应的硬件,在HiLinux上进行测试,具体以下:
1 ~ # ./sample_nnie_main 2 Usage : ./sample_nnie_main <index> 3 index: 4 0) RFCN(VI->VPSS->NNIE->VGS->VO). 5 1) Segnet(Read File). 6 2) FasterRcnnAlexnet(Read File). 7 3) FasterRcnnDoubleRoiPooling(Read File). 8 4) Cnn(Read File). 9 5) SSD(Read File).10 6) Yolov1(Read File).11 7) Yolov2(Read File).12 8) Yolov3(Read File)13 9) LSTM(Read File)14 a) Pvanet(Read File).\n")
从中看能够看到RFCN的整个过程VI->VPSS->NNIE->VGS->VO,VI模块绑定了VPSS模块,VI从摄像头输入一路视频,经VPSS分解为两路,(具体见SAMPLE_SVP_NNIE_Rfcn中step 3-线程建立函数SAMPLE_SVP_NNIE_Rfcn_ViToVo),经过以下函数:
1 HI_MPI_VPSS_GetChnFrame( //用户从通道获取一帧处理完成的图像。 2 3 s32VpssGrp, 4 5 as32VpssChn[1], 6 7 &stExtFrmInfo, 8 9 s32MilliSec);10 HI_MPI_VPSS_GetChnFrame( //用户从通道获取一帧处理完成的图像。11 12 s32VpssGrp,13 14 as32VpssChn[0], 15 16 &stBaseFrmInfo, 17 18 s32MilliSec);
(设置两路VPSS通道如帧图片大小等等参数见SAMPLE_COMM_IVE_StartVpss函数)
一路stBaseFrmInfo保持原来的1080P分辨率(这个须要看MIPI接口的相机型号来,如:见SAMPLE_COMM_IVE_StartViVpssVencVo函数:
case SONY_IMX277_SLVS_2M_240FPS_12BIT:
*penSize = PIC_1080P;
);
一路stExtFrmInfo转为PIC_CIF(352x288)分辨率(追溯到最初的赋值语句:在SAMPLE_SVP_NNIE_Rfcn函数中:PIC_SIZE_E enSize = PIC_CIF;
通过以下获得VPSS通道对应的图片大小:
1 SAMPLE_COMM_IVE_StartViVpssVencVo 2 3 aenSize[1] = *penExtPicSize; 4 5 SAMPLE_COMM_IVE_VbInit(aenSize,astSize,VPSS_CHN_NUM); 6 7 SAMPLE_COMM_SYS_GetPicSize(paenSize[i], &pastSize[i]) 8 9 SAMPLE_COMM_SYS_GetPicSize10 11 {12 13 switch (enPicSize)14 15 {16 17 case PIC_CIF: /* 352 * 288 */ 18 pstSize->u32Width = 352; 19 pstSize->u32Height = 288; break;......20 21 }22 23 }
以后到SAMPLE_SVP_NNIE_Rfcn_Proc函数,具体以下:
1 s32Ret = SAMPLE_SVP_NNIE_Rfcn_Proc( 2 3 pstParam, 4 5 pstSwParam, 6 7 &stExtFrmInfo, 8 9 stBaseFrmInfo.stVFrame.u32Width,10 11 stBaseFrmInfo.stVFrame.u32Height);
随后进入加框函数:(即进入VGS视频图形子系统)
1 //Draw rect2 3 s32Ret = SAMPLE_COMM_SVP_NNIE_FillRect(4 5 &stBaseFrmInfo, //*pstFrmInfo6 7 &(pstSwParam->stRect), // *pstRect8 9 0x0000FF00); //u32color
用到了两个VGS重要参数定义:
VGS_TASK_ATTR_S stVgsTask; //定义 VGS task 的属性
VGS_ADD_COVER_S stVgsAddCover; //定义 VGS 上 COVER 的配置
下面为定义图像属性和输出图像属性:
1 memcpy( &stVgsTask.stImgIn, 2 pstFrmInfo, 3 sizeof(VIDEO_FRAME_INFO_S)); 4 5 memcpy( &stVgsTask.stImgOut, 6 pstFrmInfo, 7 sizeof(VIDEO_FRAME_INFO_S));
随后定义 VGS 上 COVER 的配置,设置COVER参数,如颜色设置为0x0000FF00(绿色,这个与以前Hi3519 RFCN运行一致,加绿色的框)
经过memcpy定义任意四边形 COVER 四个坐标点:
1 memcpy( stVgsAddCover.stQuadRangle.stPoint,2 3 pstRect->astRect[i][j].astPoint, //(pstSwParam->stRect)4 5 sizeof(pstRect->astRect[i][j].astPoint));
VGS 支持对一幅图像进行遮挡操做,遮挡区域形状能够是矩形或者任意四边形, 遮挡区域颜色为纯色,支持批量打 COVER。 而在Draw rect函数中,没有对stBaseFrmInfo数据直接操做,目前认知VGS作COVER任务提交job时,直接将COVER数据送入至VO,随后加上stBaseFrmInfo的数据:
1 //将视频图像送入指定输出通道显示。 2 3 s32Ret = HI_MPI_VO_SendFrame( 4 5 voLayer, 6 7 voChn, 8 9 &stBaseFrmInfo,10 11 s32MilliSec);
总体的数据流处理流程以下: