下面随笔系列将对Hi3559AV100 RFCN实现细节进行解析,整个过程涉及到VI、VDEC、VPSS、VGS、VO、NNIE,其中涉及的内容,大家可以参考之前我写的博客:

 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(352×288)分辨率(追溯到最初的赋值语句:在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_GetPicSize
10 
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 rect
2 
3 s32Ret = SAMPLE_COMM_SVP_NNIE_FillRect(
4 
5                    &stBaseFrmInfo,      //*pstFrmInfo
6 
7                    &(pstSwParam->stRect),   // *pstRect
8 
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);

   整体的数据流处理流程如下:

 

 

 

版权声明:本文为iFrank原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/iFrank/p/14473724.html