bemy1004

bemy1004

0个粉丝

2

问答

0

专栏

0

资料

bemy1004  发布于  2018-06-05 16:24:06
采纳率 0%
2个问答
3967

如何将移动侦测处理的背景图像输出?

 
本帖最后由 bemy1004 于 2018-6-5 16:55 编辑

刚接触Hi3519V101板子,想对移动侦测功能(Md)进行更多的学习。我想将背景图像输出,参考sample_ive_md.c的关系,我对输出stBaseFrmInfo重新赋值,如下:
[code]
        IVE_DST_IMAGE_S Img_bg; // backgroung image.
        s32Ret = SAMPLE_COMM_IVE_CreateImage(&Img_bg,IVE_IMAGE_TYPE_U8C1,720,576);
        if (HI_SUCCESS != s32Ret)
        {
        SAMPLE_PRT("Create bg_image failed!\n");
        SAMPLE_PRT("SAMPLE_COMM_IVE_CreateImage fail,Error(%#x)\n",s32Ret);
        return NULL;
        }
    while (HI_FALSE == s_bStopSignal)
    {       
                    SAMPLE_PRT("start MD!\n");
                s32Ret = HI_MPI_VPSS_GetChnFrame(s32VpssGrp, as32VpssChn[1], &stExtFrmInfo, s32MilliSec);
                if(HI_SUCCESS != s32Ret)
                {
                        SAMPLE_PRT("HI_MPI_VPSS_GetChnFrame failed, VPSS_GRP(%d), VPSS_CHN(%d), Error(%#x)!\n",
                                s32VpssGrp, as32VpssChn[1], s32Ret);
                        continue;
                }
               /*
                s32Ret = HI_MPI_VPSS_GetChnFrame(s32VpssGrp, as32VpssChn[0], &stBaseFrmInfo, s32MilliSec);
                SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS!=s32Ret, EXT_RELEASE,
                        "HI_MPI_VPSS_GetChnFrame failed, VPSS_GRP(%d), VPSS_CHN(%d), Error(%#x)!\n",
                        s32VpssGrp, as32VpssChn[0], s32Ret);
                */
                if (HI_TRUE != bFirstFrm)
                {               
                        s32Ret = SAMPLE_COMM_IVE_DmaImage(&stExtFrmInfo,&pstMd->astImg[s32CurIdx],bInstant);
                        SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE,
                                                        "SAMPLE_COMM_IVE_DmaImage fail,Error(%#x)\n",s32Ret);
                        //printf("Not_First_Frame!!!  %d \n",s32CurIdx);                       
                }
                else
                {               
                        s32Ret = SAMPLE_COMM_IVE_DmaImage(&stExtFrmInfo,&pstMd->astImg[1-s32CurIdx],bInstant);                        
                        SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE,
                                                        "SAMPLE_COMM_IVE_DmaImage fail,Error(%#x)\n",s32Ret);       
                        printf("First_Frame!!!  %d \n",s32CurIdx);
                        bFirstFrm = HI_FALSE;                       
                        goto CHANGE_IDX;//first frame just init reference frame
                }
                s32Ret = HI_IVS_MD_Process(MdChn,&pstMd->astImg[s32CurIdx],&pstMd->astImg[1 - s32CurIdx],&Img_sad,&pstMd->stBlob);       
                SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE,
                                                        "HI_IVS_MD_Process fail,Error(%#x)\n",s32Ret);               
                s32Ret = HI_IVS_MD_GetBg(MdChn,&Img_bg);
                if(HI_SUCCESS != s32Ret)
                {
                    SAMPLE_PRT("HI_IVS_MD_GetBg failed\n");
                    continue;
                }
                //change the VO (img_bg to video_frame_info).
                //s32Ret = SAMPLE_COMM_IVE_Image2Dma(&stBaseFrmInfo,&Img_bg,bInstant);
                //SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, EXT_RELEASE,"SAMPLE_COMM_IVE_Image2Dma fail,Error(%#x)\n",s32Ret);
                //direct transform.
                stBaseFrmInfo.stVFrame.pVirAddr[0] = Img_bg.pu8VirAddr[0];
                stBaseFrmInfo.stVFrame.u32PhyAddr[0] = Img_bg.u32PhyAddr[0];
                stBaseFrmInfo.stVFrame.u32Width = (HI_U32)Img_bg.u16Width;
                stBaseFrmInfo.stVFrame.u32Height = (HI_U32)Img_bg.u16Height;
                stBaseFrmInfo.stVFrame.u32Stride[0] = (HI_U32)Img_bg.u16Stride[0];
                /*
                //Blob2Rect.
                SAMPLE_COMM_IVE_BlobToRect((IVE_CCBLOB_S *)pstMd->stBlob.pu8VirAddr,&(pstMd->stRegion),50,8,
                        pstMdAttr->u16Width,pstMdAttr->u16Height,(HI_U16)stBaseFrmInfo.stVFrame.u32Width,(HI_U16)stBaseFrmInfo.stVFrame.u32Height);
                //Draw rect.
                s32Ret = SAMPLE_COMM_VGS_FillRect(&stBaseFrmInfo, &pstMd->stRegion, 0x00FF0000);
                SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE,"SAMPLE_COMM_VGS_FillRect fail,Error(%#x)\n",s32Ret);       
                */
                 s32Ret = HI_MPI_VO_SendFrame(voLayer,voChn,&stBaseFrmInfo,s32MilliSec);
                 SAMPLE_CHECK_EXPR_GOTO(HI_SUCCESS != s32Ret, BASE_RELEASE,
                                                                         "HI_MPI_VO_SendFrame fail,Error(%#x)\n",s32Ret);         
                CHANGE_IDX:
                        //Change reference and current frame index
                        printf("haha  %d \n",s32CurIdx);
                        s32CurIdx = 1 - s32CurIdx;
}[/code]

根据代码的意思:(1)输入的图像分两路:图像处理和输出(stBaseFrmInfo和stExtFrmInfo);
                            (2)将图像处理的结果(矩形坐标)叠加在输出图像上(stBaseFrmInfo);
                            (3)通过VO将stBaseFrmInfo赋值到输出通道。
我的想法是直接对输出图像用背景图像(img_bg)进行赋值,但是仍然报错。



请大神指导一下,感激!
我来回答
回答7个
时间排序
认可量排序

bemy1004

0个粉丝

2

问答

0

专栏

0

资料

bemy1004 2018-06-06 08:22:48
认可0
不能沉了,自己顶

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-06-06 11:11:17
认可0
SAMPLE_COMM_IVE_CreateImage 得到的buffer 实际上是用HI_MPI_SYS_MmzAlloc分配MMZ 内存

而SendFrame函数要求的buffer必须使video pool中分配的,所以报错

bemy1004

0个粉丝

2

问答

0

专栏

0

资料

bemy1004 2018-06-06 13:54:53
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=88586&ptid=39744]zhuangweiye 发表于 2018-6-6 11:11[/url]
SAMPLE_COMM_IVE_CreateImage 得到的buffer 实际上是用HI_MPI_SYS_MmzAlloc分配MMZ 内存

而SendFrame函 ...[/quote]

感谢庄工。

这么说的话,我需要怎么做才能把背景图像显示出来呢?请庄工指导一下:handshake

bemy1004

0个粉丝

2

问答

0

专栏

0

资料

bemy1004 2018-06-06 14:07:09
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=88586&ptid=39744]zhuangweiye 发表于 2018-6-6 11:11[/url]
SAMPLE_COMM_IVE_CreateImage 得到的buffer 实际上是用HI_MPI_SYS_MmzAlloc分配MMZ 内存

而SendFrame函 ...[/quote]

我一直以为:既然可以由VIDEO_FRAME_INFO_S 转换为IVE_DST_IMAGE_S,那么反过来也是可以的。所以写了一个相似的转换函数
但事实上反过来的话,VIDEO_FRAME_INFO_S 是空的,即便是分配了内存, HI_MPI_IVE_DMA仍然会报错。
[code]/******************************************************************************
* function : ive image to Dma frame info.
* Add by Young,2018-6-05.
******************************************************************************/
HI_S32 SAMPLE_COMM_IVE_Image2Dma(VIDEO_FRAME_INFO_S *pstFrameInfo,IVE_DST_IMAGE_S *pstDst,HI_BOOL bInstant)

{
        HI_S32 s32Ret;
        IVE_HANDLE hIveHandle;
        IVE_DST_DATA_S stDstData;
        IVE_SRC_DATA_S stSrcData;
        IVE_DMA_CTRL_S stCtrl = {IVE_DMA_MODE_DIRECT_COPY,0};
        HI_BOOL bFinish = HI_FALSE;
        HI_BOOL bBlock = HI_TRUE;

        //fill dst

        stDstData.pu8VirAddr = (HI_U8*)pstFrameInfo->stVFrame.pVirAddr[0];
        stDstData.u32PhyAddr = pstFrameInfo->stVFrame.u32PhyAddr[0];
        stDstData.u16Width   = 720;  //(HI_U16)pstFrameInfo->stVFrame.u32Width;
        stDstData.u16Height  = 576;  //(HI_U16)pstFrameInfo->stVFrame.u32Height;
        stDstData.u16Stride  = (HI_U16)pstFrameInfo->stVFrame.u32Stride[0];

        //fill src
        stSrcData.pu8VirAddr = pstDst->pu8VirAddr[0];
        stSrcData.u32PhyAddr = pstDst->u32PhyAddr[0];
        stSrcData.u16Width   = pstDst->u16Width;
        stSrcData.u16Height  = pstDst->u16Height;
        stSrcData.u16Stride  = pstDst->u16Stride[0];

        s32Ret = HI_MPI_IVE_DMA(&hIveHandle,&stSrcData,&stDstData,&stCtrl,bInstant);            
        if (HI_SUCCESS != s32Ret)
        {
       SAMPLE_PRT("HI_MPI_IVE_DMA fail,Error(%#x)\n",s32Ret);
       return s32Ret;
    }
        if (HI_TRUE == bInstant)
        {
                s32Ret = HI_MPI_IVE_Query(hIveHandle,&bFinish,bBlock);                       
                while(HI_ERR_IVE_QUERY_TIMEOUT == s32Ret)
                {
                        usleep(100);                                       
                        s32Ret = HI_MPI_IVE_Query(hIveHandle,&bFinish,bBlock);       
                }
                if (HI_SUCCESS != s32Ret)
                {
                        SAMPLE_PRT("HI_MPI_IVE_Query fail,Error(%#x)\n",s32Ret);
                   return s32Ret;
                }
        }
        return HI_SUCCESS;
}
[/code]

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-06-06 14:22:10
认可0
本帖最后由 zhuangweiye 于 2018-6-6 14:23 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=88594&ptid=39744]bemy1004 发表于 2018-6-6 14:07[/url]
我一直以为:既然可以由VIDEO_FRAME_INFO_S 转换为IVE_DST_IMAGE_S,那么反过来也是可以的。所以写了一个 ...[/quote]

一般来说用户数据sendframe的流程

   while( 1 )
    {
                //1. 取VB
                do
                {
                        hBlock = HI_MPI_VB_GetBlock(VB_INVALID_POOLID, u32BlkSize,NULL);
                }
                while (VB_INVALID_HANDLE == hBlock);

                // 2. 得到VB物理地址和虚拟地址
        u32PhyAddr = HI_MPI_VB_Handle2PhysAddr(hBlock);
        pVirAddr = (HI_U8 *) HI_MPI_SYS_Mmap(u32PhyAddr, u32BlkSize);
        u32PoolId = HI_MPI_VB_Handle2PoolId(hBlock); // 这个是非常重要的参数,要添写在stFrmInfo中
   
                // 3. 填写VIDEO_FRAME_INFO_S结构
        memset(&stFrmInfo.stVFrame, 0, sizeof(VIDEO_FRAME_S));
                ...
               
                // 4. 读文件, 填图像数据
                ...
        
                // 5. 发送去XXX模块
        s32Ret = HI_MPI_XXX_SendFrame(XXX, &stFrmInfo);

                // 6. 释放虚拟地址和 VB
        HI_MPI_SYS_Munmap(pVirAddr, u32BlkSize);
        HI_MPI_VB_ReleaseBlock(hBlock);
    }

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2018-06-06 14:25:54
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=88594&ptid=39744]bemy1004 发表于 2018-6-6 14:07[/url]
我一直以为:既然可以由VIDEO_FRAME_INFO_S 转换为IVE_DST_IMAGE_S,那么反过来也是可以的。所以写了一个 ...[/quote]

VIDEO_FRAME_INFO_S 可以参考上面的流程来分配试试

bemy1004

0个粉丝

2

问答

0

专栏

0

资料

bemy1004 2018-06-06 16:02:11
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=88601&ptid=39744]zhuangweiye 发表于 2018-6-6 14:22[/url]
一般来说用户数据sendframe的流程

   while( 1 )
[/quote]

感谢庄工指导,我先研究研究再和您交流。:handshake
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区