merz

merz

1个粉丝

5

问答

10

专栏

0

资料

merz  发布于  2019-12-12 14:01:37
采纳率 0%
5个问答
2976

如何加快IVE_Image 转Mat格式的速度?

 
本帖最后由 merz 于 2019-12-12 16:21 编辑

我参考海思提供的LKOpticalFlow.cpp的IveImage2Mat函数已经完成IveImage转成Mat格式的操作
海思提供的LKOpticalFlow.cpp的IveImage2Mat函数代码如下
[code]HI_VOID IveImage2Mat(IVE_SRC_IMAGE_S *pstSrc, Mat *dst)
{
        if(dst->cols != pstSrc->u32Width || dst->rows != pstSrc->u32Height)
        {
                printf("width or height didn't equal,line:%d\n",__LINE__);
                return;
        }

        for(HI_U32 r=0; ru32Height; r++)
        {
                HI_U8 *ptm = dst->ptr(r);
                HI_U8 *pti = (HI_U8*)(pstSrc->au64VirAddr[0] + r * pstSrc->au32Stride[0]);
                {
                        for(HI_U32 c=0; cu32Width; c++)
                        {
                                ptm[c] = pti[c];
                        }
                }
        }
}[/code]
在3519A上对1280x720像素的图片操作一次为0.12秒,我又试着改动了代码。将按位赋值改为memcpy
我的代码如下
[code]
static HI_VOID IveImage2Mat(IVE_SRC_IMAGE_S *pstSrc, Mat *dst)
{
    HI_U32 u32Size;
    HI_U8 *pti = NULL;
    HI_U8 *ptm = NULL;
   
    if(dst->cols != pstSrc->u32Width || dst->rows != pstSrc->u32Height)
    {   
        printf("width or height didn't equal,line:%d\n",__LINE__);
        return;
    }   

    IVE_IMAGE_TYPE_E ImgType = pstSrc->enType;

    if(IVE_IMAGE_TYPE_U8C1 == ImgType)
    {   
        u32Size = (pstSrc->au32Stride[0]) * (pstSrc->u32Height);
    }   
   
    if(IVE_IMAGE_TYPE_U8C3_PACKAGE == ImgType)
    {   
        u32Size = (pstSrc->au32Stride[0]) * (pstSrc->u32Height) * 3;
    }   

    pti = (HI_U8*)(HI_UL)pstSrc->au64VirAddr[0];
    ptm = dst->ptr(0);
    memcpy(ptm, pti, u32Size);
//  ptm = pti;
}     [/code]
改动后对720p的图像单次处理速度为5ms,对BGR格式图像单次处理速度为15ms。我又试着将memcpy改成直接把地址赋值过去,即 ptm = pti; 虽然可以编译成功,但是处理后的图像是全黑的。我想问一下大家,应该怎么样把mat的图像数据指针指向Ive_Image的地址,使2者共享同一内存。
【更新】
我尝试将mat 1的ptr直接用等号赋值给mat 2的ptr,将mat 2保存下来,图像依旧是全黑的。那么Mat b = a; 这种操作是怎么实现共享内存的呢
我来回答
回答6个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2019-12-12 14:21:41
认可0
如果源图像和目的图像都在MMZ上, 可以用IVE的DMA

图像拷贝以及格式转换能不做就不做, 非常耗费性能

merz

1个粉丝

5

问答

10

专栏

0

资料

merz 2019-12-12 14:46:47
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=151068&ptid=76897]zhuangweiye 发表于 2019-12-12 14:21[/url]
如果源图像和目的图像都在MMZ上, 可以用IVE的DMA

图像拷贝以及格式转换能不做就不做, 非常耗费性能[/quote]

您好,IVE的DMA要求输入输出格式都是IVE_DATE_S格式,如何和Mat对应上呢?

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2019-12-12 15:11:43
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=151071&ptid=76897]merz 发表于 2019-12-12 14:46[/url]
您好,IVE的DMA要求输入输出格式都是IVE_DATE_S格式,如何和Mat对应上呢?[/quote]

IVE_IMAGE_TYPE_E 有那么多种格式

最简单可以用 IVE_IMAGE_TYPE_U8C1



merz

1个粉丝

5

问答

10

专栏

0

资料

merz 2019-12-12 16:12:45
认可0
本帖最后由 merz 于 2019-12-12 16:14 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=151072&ptid=76897]zhuangweiye 发表于 2019-12-12 15:11[/url]
IVE_IMAGE_TYPE_E 有那么多种格式

最简单可以用 IVE_IMAGE_TYPE_U8C1[/quote]

是我问题没有表述清楚:'(,我现在想做的操作是将mat的数据指针指向Ive_Image的地址,使2者共享同一内存,类似于cv的浅拷贝操作这样

merz

1个粉丝

5

问答

10

专栏

0

资料

merz 2019-12-14 10:35:19
认可1
问题解决了,使用Img.data就可以直接操作了

qn1512721599

0个粉丝

1

问答

0

专栏

0

资料

qn1512721599 2020-01-02 15:35:58
认可1
可以先创建 IVE_IMAGE_S 的对象,Mat的data指向ive得虚拟地址,这样就共享同一段内存了
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区