polestar

polestar

0个粉丝

2

问答

0

专栏

0

资料

polestar  发布于  2016-09-18 18:38:39
采纳率 0%
2个问答
6570

【已解决】3518EV200 IVS_process输出结果不对

本帖最后由 polestar 于 2016-12-13 18:59 编辑

我用Hi3518E_SDK_V1.0.2.0中的IVS_process获取到的pstBlob信息,打印出来是一些无效的数据,请问是什么原因?我之前用Hi3516A_SDK_V1.0.6.0中IVE的GMM和bgmodel方法都能正确把矩形框结果用VGS绘制在图像上,结果一到3518EV200下,这些都不能用,只能采用IVS接口处理。参数设置和sample里的sample_ive_md.c设置一样,
HI_IVS_MD_Process(pstMd->MdChn, &pstMd->astImg[s32CurIdx], &pstMd->astImg[1 - s32CurIdx], NULL, &pstMd->stBlob);
输入图像也经拷贝保存为本地文件验证了yuv数据是正确的。
if (pstBlob->u8RegionNum > 0)
        {
                printf("\n\n[CCL][CurAreaThr]%d, [LabelStatus]%d, [RegionNum]%d\n",
                        pstBlob->u16CurAreaThr, pstBlob->s8LabelStatus, pstBlob->u8RegionNum);
                for (i = 0; i < 254; i++)
                {
                        if (pstBlob->astRegion.u32Area > 0)
                                printf("[astRegion][index]%03d, [Left]%d, [Top]%d, [Right]%d, [Bottom]%d, [Area]%d\n",
                                        i, pstBlob->astRegion.u16Left, pstBlob->astRegion.u16Top,
                                        pstBlob->astRegion.u16Right,        pstBlob->astRegion.u16Bottom,
                                        pstBlob->astRegion.u32Area);
                }

                //getchar();
        }
结果输出为:
[CCL][CurAreaThr]0, [LabelStatus]0, [RegionNum]254
[astRegion][index]003, [Left]37006, [Top]41420, [Right]641, [Bottom]32776, [Area]311445632
[astRegion][index]004, [Left]36354, [Top]49207, [Right]42273, [Bottom]768, [Area]-2123360185
[astRegion][index]008, [Left]32, [Top]4108, [Right]35588, [Bottom]2590, [Area]641214752
[astRegion][index]009, [Left]0, [Top]0, [Right]0, [Bottom]0, [Area]142606352
。。。
[astRegion][index]216, [Left]33032, [Top]33280, [Right]2322, [Bottom]10240, [Area]67108929
[astRegion][index]217, [Left]0, [Top]28672, [Right]32, [Bottom]0, [Area]2097152
[astRegion][index]219, [Left]2086, [Top]132, [Right]16384, [Bottom]528, [Area]69206028
[astRegion][index]220, [Left]0, [Top]0, [Right]0, [Bottom]2180, [Area]159383552
我来回答
回答7个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-09-19 12:33:01
认可0
HI_IVS_MD_Process()返回值是什么?

polestar

0个粉丝

2

问答

0

专栏

0

资料

polestar 2016-09-19 13:56:35
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=37952&ptid=12686]zhuangweiye 发表于 2016-9-19 12:33[/url]
HI_IVS_MD_Process()返回值是什么?[/quote]

        s32Ret = IVE_MdProc(pstMd, pstFrameInfo);
        if (HI_SUCCESS != s32Ret)
        {
                DEBUG_PRINT("IVE_MdProc fail,Error(%#x)", s32Ret);
                return TVA_FAILED;
        }

没有fail的打印。

今天我试了sample_ive_md.c里的SAMPLE_IVE_MdProc,(while循环在Proc函数里面)结果是好的,
[CCL][CurAreaThr]16, [LabelStatus]0, [RegionNum]3
[astRegion][index]000, [Left]0, [Top]0, [Right]36, [Bottom]24, [Area]288
[astRegion][index]001, [Left]36, [Top]4, [Right]48, [Bottom]28, [Area]352
[astRegion][index]002, [Left]0, [Top]28, [Right]12, [Bottom]56, [Area]368

看来是IVE_MdProc函数里面的逻辑有点问题。

HI_S32 IVE_MdProc(SAMPLE_IVE_MD_S *pstMd, VIDEO_FRAME_INFO_S* pstFrameInfo)
{
        HI_S32 s32Ret = HI_SUCCESS;
        HI_S32 s32CurIdx = pstMd->s32CurIdx;

        HI_BOOL bInstant = HI_TRUE;

        if (HI_TRUE != pstMd->bFirstFrm)
        {               
                s32Ret = COMM_IVE_DmaImage(pstFrameInfo, &pstMd->astImg[s32CurIdx], bInstant);
                if (HI_SUCCESS != s32Ret)
                {
                        DEBUG_PRINT("COMM_IVE_DmaImage fail,Error(%#x)\n",s32Ret);
                        return s32Ret;
                }
        }
        else
        {               
                s32Ret = COMM_IVE_DmaImage(pstFrameInfo, &pstMd->astImg[1 - s32CurIdx], bInstant);                       
                if (HI_SUCCESS != s32Ret)
                {
                        DEBUG_PRINT("COMM_IVE_DmaImage fail,Error(%#x)\n",s32Ret);
                        return s32Ret;
                }       
               
                pstMd->bFirstFrm = HI_FALSE;                       
                goto CHANGE_IDX;//first frame just init reference frame

        }
       
        s32Ret = HI_IVS_MD_Process(pstMd->MdChn, &pstMd->astImg[s32CurIdx], &pstMd->astImg[1 - s32CurIdx], NULL, &pstMd->stBlob);               
        if (HI_SUCCESS != s32Ret)
        {
                DEBUG_PRINT("HI_IVS_MD_Process fail,Error(%#x)\n",s32Ret);
                return s32Ret;
        }                                               

        //HI_IVS_MD_GetBg(pstMd->MdChn, &(pstMd->stBg));
        SAMPLE_COMM_IVE_BlobToRect1((IVE_CCBLOB_S *)pstMd->stBlob.pu8VirAddr,&(pstMd->stRegion),50,8,
                        pstMd->stMdAttr.u16Width,pstMd->stMdAttr.u16Height,1920, 1080);
               
        CHANGE_IDX:
        {
                //Change reference and current frame index
                s32CurIdx =        1 - s32CurIdx;
                pstMd->s32CurIdx = s32CurIdx;

        }
       
        return HI_SUCCESS;
}

我的IVE_MdProc就是把while循环提到外面去了,在while循环里面取帧,调用IVE_MdProc,释放帧。
typedef struct hiSAMPLE_IVE_MD_S
{
        MD_CHN MdChn;
        //IVE_DST_IMAGE_S stSad;
        HI_S32 s32CurIdx;
        HI_BOOL bFirstFrm;

        IVE_DST_IMAGE_S stFg;        // no API support
        IVE_DST_IMAGE_S stBg;

        IVE_SRC_IMAGE_S astImg[SAMPLE_IVE_MD_IMAGE_NUM];       
        IVE_DST_MEM_INFO_S stBlob;
        MD_ATTR_S stMdAttr;               
        SAMPLE_RECT_ARRAY_S stRegion;

}SAMPLE_IVE_MD_S;

s32CurIdx, bFirstFrm放到结构体里面去了。

应该是pstMd->astImg[s32CurIdx]或者pstMd->s32CurIdx这里有点问题。

polestar

0个粉丝

2

问答

0

专栏

0

资料

polestar 2016-09-19 14:00:48
认可0
咦,两次的结果对比,之前的是[CurAreaThr]0,正确的应该是[CurAreaThr]16。莫非是越界了?

hanfei69882

2个粉丝

26

问答

0

专栏

2

资料

hanfei69882 2016-11-09 16:35:41
认可0
本帖最后由 hanfei69882 于 2016-11-9 16:38 编辑

楼主你好,你的代码添加后有打印,分析了一下功能类似sample_ive_md.c里面的SAMPLE_COMM_IVE_BlobToRect函数,区别是SAMPLE_COMM_IVE_BlobToRect函数对数据做了阈值处理,并将处理结果放入结构体pstMd->stRegion,stRegin结构体定义如下
[code]typedef struct hiSAMPLE_RECT_ARRAY_S
{
    HI_U16 u16Num;
    SAMPLE_IVE_RECT_S astRect[50];
}SAMPLE_RECT_ARRAY_S;[/code]

问题是:这些数据有了之后是否可以判定为有移动发生?还是需要其他判断,比如说SAD值
开了帖子:[url=http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=13261&extra=][hi3518] 关于移动侦测sample理解[/url]
卡了几天了,还请指点一下:handshake

polestar

0个粉丝

2

问答

0

专栏

0

资料

polestar 2016-12-13 18:58:22
认可0
找到问题了,是我自己其他的函数对pstBlob进行了篡改,0 == pstBlob->u8RegionNum的边界条件没有考虑周到。而pstBlob->astRegion.u32Area > u16Thr确实是满足条件的,因为都是无符号的比较。
2016-9-20 13:50

polestar

0个粉丝

2

问答

0

专栏

0

资料

polestar 2016-12-13 19:05:43
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41031&ptid=12686]hanfei69882 发表于 2016-11-9 16:35[/url]
楼主你好,你的代码添加后有打印,分析了一下功能类似sample_ive_md.c里面的SAMPLE_COMM_IVE_BlobToRect函 ...[/quote]

嗯,后来又全部推倒重新使用海思SAMPLE里的函数进行处理,屏蔽掉自己的代码,发现是正常的。
有blob信息就说明有移动发生吧,或者可能直接使用SAD信息统计值是否大于阈值去做判断应该也是可以的。
我是需要用到blob信息,即包围盒来做后续的处理。
ipc稍微晃动一下,也会有很多的blob出来,还不太好进行排除是否为真实运动目标。

hanfei69882

2个粉丝

26

问答

0

专栏

2

资料

hanfei69882 2016-12-13 19:46:57
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=42833&ptid=12686]polestar 发表于 2016-12-13 19:05[/url]
嗯,后来又全部推倒重新使用海思SAMPLE里的函数进行处理,屏蔽掉自己的代码,发现是正常的。
有blob信息 ...[/quote]

后来发帖子搞明白了,可以参考[url=http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=13261&extra=][hi3518] 【已解决】关于移动侦测sample理解[/url]
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区