ljh4371

ljh4371

0个粉丝

3

问答

0

专栏

0

资料

ljh4371  发布于  2016-07-15 09:25:17
采纳率 0%
3个问答
13808

hi3518e + ov9712 直接获取yuv数据,速度提升方法

 
之前尝试通过API——HI_MPI_VI_GetFrame获取一帧YUV数据,已实现。
现在存在的问题是,速度太慢,影响使用,请教各位大神,有没有更节约时间的做法?
有没有使用SDK节约时间的实现方法,或者不使用SDK直接从CMOS获取数据的方法?
请各位大侠不吝赐教!拜谢!
我来回答
回答26个
时间排序
认可量排序

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-17 00:23:51
认可0
本帖最后由 ngswfx 于 2016-7-17 02:03 编辑

我怀疑HI_MPI_VI_GetFrame就是在搞YUV数据拷贝(因为他有2个接口:HI_MPI_VI_GetFrame以及HI_MPI_VI_ReleaseFrame )。而且是在利用剩下的DDR带宽资源以及cpu资源在干,所以它的底层设计肯定不是优先满足的,应该是类似于:资源够了了才出来一帧,如果资源紧张,就是等很久才出来一帧。表面看来,我们top,看系统资源没怎么使用,其实只要驱动装载好,VI开启,VPSS,VENC,VO开启,显卡部分的资源其实已经被消耗的差不多了,估计超过70%了,我们搞编解码其实用的就是芯片里面集成的那个mail-400这种类型的显卡芯片,这个时候,再把YUV送出来,还要实时30个每秒的话,估计有些难度。

//////////海斯的SDK在处理时,应该使用了另外一个cpu核心在处理这些原始数据,而且内部它也没大量拷贝YUV,只是在处理内存地址,你调用HI_MPI_VI_GetFrame后,它的底层大量工作还是在处理那些常规动作,例如VI,VPSS,VO,有空了,给外部抛一帧出来。

YUV就是这样的,最好几秒钟取一帧,别想着每秒钟取很多帧。

//这个东西最好硬件来处理。

YUV数据内存拷贝很占用资源,如果再让cpu处理一下,更费劲。1920*1080*1.5*30*8=3M*240=720Mbps //////一路1080P 30帧YUV420数据就要占用720Mbps(这个数据其实很大哦,千兆网卡就累死了:lol ),内存拷贝估计2倍占用,读出来,还要写回去。

//海思底层有特殊的权衡,很多都和硬件相关了。咱们在上层,尽量别想着用海思接口得到的某些YUV源来搞实时的东西。

//抽取几帧作处理或者分析还是可以的。最好用海思提供的接口做事情,那些原始数据放到内存里面,基本就没动过几回,每动一次基本都有硬件参与,例如VPSS搞得缩放,底层肯定用了显卡的缩放硬件,并非由cpu在干苦力。


///////////如果非要自己来弄这种原始的YUV,折腾缩放编解吗,估计要把海思的模块停掉,然后完全自己来处理(难度太大,没一群人折腾几年搞不定)。

另外,不清楚HI_MPI_VI_GetFrame是不是阻塞的(看SDK文档,处理部分可以是阻塞的,数据部分估计是独立的),如果是,建议弄一个线程,得到数据立刻拷贝走,别等处理完再释放,否则你后续的YUV处理动作(通常这里的动作很难在33ms内完成),可能会影响到海思底层,引起恶性循环,它的VPSS以及编码会不能及时得到数据。
//我估计海斯为了避免这种影响底层的发生,都会拷贝一次YUV数据(对于数据来说,不是阻塞的)。如果HI_MPI_VI_GetFrame设计成就是和底层完全一个地址,那就没必要每次都释放了,直接把VI的地址告诉应用层,使用就可以了,每次地址完全按相同,不用释放的,顶多做个接口,通知上层,新的一帧数据已经准备好了,可以读取使用了。从海斯的文档看,这个接口就是设计成偶尔取一次VI数据的。


//////我估计,HI_MPI_VI_GetFrame撑死了做到一路实时,类似的接口还有VO里面获取YUV的那几个接口,例如wbc GetScreenFrame。


////////////////建议:
1、海思对外提供的YUV类接口,不要想着弄实时处理,尤其尺寸大了以后,D1还好说,720P以上就非常费劲,例如送去编码,想编码出实时视频。
2、减少YUV处理的尺寸,尽量减少带宽占用。例如得到YUV数据后,首先利用VGS缩放,弄小一些。再后续处理。
3、如果海思提供了某些YUV处理类接口,例如缩放,拷贝,一定要用海思的接口,因为底层可能是硬件级别实现的。否则一路1080P的 实时YUV转RGB动作让cpu来算,估计CPU就差不多了。
4、能不拷贝,尽量别拷贝,传递地址过去,对同一个YUV buff进行各种处理。每一次拷贝都是惊天动地的大事。:lol

总之:YUV数据是显卡的强项,cpu不行,搞不动(咱们通过c++库对这类数据的处理“软”方法,是效率非常低下的,只有充分利用不同内核(如:armv7)的不同指令,才能稍微提升效率,但相比gpu这类,还是会差的很远,gpu里面那一堆流水线,可不是白设计的)。

ljh4371

0个粉丝

3

问答

0

专栏

0

资料

ljh4371 2016-07-18 09:44:02
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34117&ptid=11958]ngswfx 发表于 2016-7-17 00:23[/url]
我怀疑HI_MPI_VI_GetFrame就是在搞YUV数据拷贝(因为他有2个接口:HI_MPI_VI_GetFrame以及HI_MPI_VI_Rel ...[/quote]

请问,您知道如何减少YUV处理的尺寸嘛?海思提供了哪些YUV处理类接口?看文档,实在是没看到合适的……

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-18 10:19:15
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34141&ptid=11958]ljh4371 发表于 2016-7-18 09:44[/url]
请问,您知道如何减少YUV处理的尺寸嘛?海思提供了哪些YUV处理类接口?看文档,实在是没看到合适的 ...[/quote]

VGS里面有一个缩放的,你可以试试,我没试过。

ljh4371

0个粉丝

3

问答

0

专栏

0

资料

ljh4371 2016-07-18 10:29:15
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34147&ptid=11958]ngswfx 发表于 2016-7-18 10:19[/url]
VGS里面有一个缩放的,你可以试试,我没试过。[/quote]

弱弱的问一句,hi3518的VGS对应那一部分?只看到了SYS,VI,VO,VPSS,VENC,VDA...

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-18 10:31:08
认可0
本帖最后由 ngswfx 于 2016-7-18 10:35 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=34150&ptid=11958]ljh4371 发表于 2016-7-18 10:29[/url]
弱弱的问一句,hi3518的VGS对应那一部分?只看到了SYS,VI,VO,VPSS,VENC,VDA...[/quote]

VGS 是视频图形子系统,全称为 Video Graphics Sub-System。支持对一幅输入图像进
行处理,如进行缩放、格式转换、解压、打 Cover/OSD 等处理。

/////////////独立的demo没见到,但是MPP 2.0文档里面有介绍。第10章节。

文档:HiMPP IPC V2.0 媒体处理软件开发参考.pdf


VGS 支持的输入输出图像格式包括 Semiplanar420、Semiplanar422 和单分量
(Y)。支持 Semiplanar420 与 Semiplanar422 之间的格式转换,Hi3518EV200 还支
持 Semiplanar420、Semiplanar422 到单分量(Y)格式的转换。
Hi3516A/Hi3518EV200 只支持 LINEAR 格式的图像输入和输出


缩放
VGS 支持对一幅图像进行缩放,其中放大的能力是 16 倍,缩小的能力是 15 倍。
Hi3516A/Hi3518EV200 上 VGS 支持单分量(Y)缩放。

UV缩放估计有些困难了。Y肯定没问题。


/////////////////////////////////////////////////////你是准备弄YUV干什么呀?

ljh4371

0个粉丝

3

问答

0

专栏

0

资料

ljh4371 2016-07-18 10:35:18
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34151&ptid=11958]ngswfx 发表于 2016-7-18 10:31[/url]
VGS 是视频图形子系统,全称为 Video Graphics Sub-System。支持对一幅输入图像进
行处理,如进行缩放、 ...[/quote]

用的是HI3518EV100 :(

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-18 10:36:51
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34153&ptid=11958]ljh4371 发表于 2016-7-18 10:35[/url]
用的是HI3518EV100 :([/quote]

那你着重看V100对应的文档,看有没有VGS,要是没有就用不成了。

ljh4371

0个粉丝

3

问答

0

专栏

0

资料

ljh4371 2016-07-18 10:38:45
认可0
准备用来扫码,现在获取到了yuv,但是速度太慢,而且图像大了,有些浪费,现在获取到的是1280*720,实际需要500*500就够了

ljh4371

0个粉丝

3

问答

0

专栏

0

资料

ljh4371 2016-07-18 10:39:50
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34154&ptid=11958]ngswfx 发表于 2016-7-18 10:36[/url]
那你着重看V100对应的文档,看有没有VGS,要是没有就用不成了。[/quote]

看了,没有VGS

ljh4371

0个粉丝

3

问答

0

专栏

0

资料

ljh4371 2016-07-18 10:41:05
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34154&ptid=11958]ngswfx 发表于 2016-7-18 10:36[/url]
那你着重看V100对应的文档,看有没有VGS,要是没有就用不成了。[/quote]

有没有办法直接从CMOS获取图像?不用SDK?

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-18 10:44:20
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34157&ptid=11958]ljh4371 发表于 2016-7-18 10:41[/url]
有没有办法直接从CMOS获取图像?不用SDK?[/quote]

估计难度更大,可能还不如这么弄呢

ljh4371

0个粉丝

3

问答

0

专栏

0

资料

ljh4371 2016-07-18 10:48:38
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34158&ptid=11958]ngswfx 发表于 2016-7-18 10:44[/url]
估计难度更大,可能还不如这么弄呢[/quote]

确实,跨过海思直接和底层硬件交互,需要了解硬件配置……难度肯定不小!
但是现在项目卡在这里,问题得不到改善,没什么别的招哦……郁闷!!!
您有什么建议?

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-18 10:48:55
认可0
本帖最后由 ngswfx 于 2016-7-18 10:52 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=34155&ptid=11958]ljh4371 发表于 2016-7-18 10:38[/url]
准备用来扫码,现在获取到了yuv,但是速度太慢,而且图像大了,有些浪费,现在获取到的是1280*720,实际需 ...[/quote]

你这个很简单,我给你说怎么弄,缩放千万别搞不成比例的,超级费资源。

按照你的需求,你可以把UV扔掉,然后,只处理Y部分,原始缓冲大小是1280*720*3/2字节(YUV420),估计是分成了3片Y(1280*720) U(1280*720/4) V(1280*720/4),你只需要管前面的1280*720字节即可。

然后:
    for(int nY=0;nY<720;nY+=2){
       for(int nX=0;nX<1280;nX+=2){
        
      }
}

//最后得到的有效YUV是640*360的尺寸,基本够用了。这个拷贝过程,cpu用不了多少。然后再拿这个640*360的数据去处理。千万别想这弄出500*500这种分辨率,这种缩放超级费资源。


//也就是水平隔一个像素取一个值,垂直就隔行。

ljh4371

0个粉丝

3

问答

0

专栏

0

资料

ljh4371 2016-07-18 10:51:43
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34160&ptid=11958]ngswfx 发表于 2016-7-18 10:48[/url]
你这个很简单,我给你说怎么弄,缩放千万别搞不成比例的,超级费资源。

按照你的需求,你可以把UV扔 ...[/quote]

尝试过,速度还是慢……我现在想法是直接在源上做文章,参数直接设定小一点,看看行不行

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-18 10:53:38
认可0
本帖最后由 ngswfx 于 2016-7-18 10:58 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=34163&ptid=11958]ljh4371 发表于 2016-7-18 10:51[/url]
尝试过,速度还是慢……我现在想法是直接在源上做文章,参数直接设定小一点,看看行不行[/quote]

那你需要看代码那部分占用时间长,分析出具体的点。

我估计是你后面的处理费劲了。另外,你设计的时候,多少秒分析一个。还是说想实时,一秒弄很多个?这东西,一秒种,有个3-5个应该就足够用了吧。





////////////////那个二维码的代码能不能分析几行就判断出来图像不行呀(例如图像模糊时),就别全部分析了,先分析高度1/4的部分,判断能否识别出几个字符,如果这样就会快很多。

ljh4371

0个粉丝

3

问答

0

专栏

0

资料

ljh4371 2016-07-18 10:56:47
认可0
本帖最后由 ljh4371 于 2016-7-18 10:58 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=34166&ptid=11958]ngswfx 发表于 2016-7-18 10:53[/url]
那你需要看代码那部分占用时间长,分析出具体的点。

我估计是你后面的处理费劲了。[/quote]

可能是……最占时间的是API。
想实时……
现在做了拷贝动作,最开始拷贝yuv全部数据,后来尝试只拷贝Y,现在想试试直接把地址给后期图像处理部分,可能会快一些,但不知道会不会出问题。

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-18 11:00:38
认可0
本帖最后由 ngswfx 于 2016-7-18 11:02 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=34168&ptid=11958]ljh4371 发表于 2016-7-18 10:56[/url]
可能是……最占时间的是API。
想实时……
现在做了拷贝动作,最开始拷贝yuv全部数据,后来尝试只拷贝 ...[/quote]

这类处理,一定要把各个段的代码,通过GetTickCount()这一类的函数,把每个稍微费劲的代码时间都打印出来,然后再来分析原因点。

不过根据我的估计:3518的频率不高,想要实时的转换出640*360的Y都已经很吃力了。


//////你可以看看3519的介绍,里面有智能的一些东西,相关的功能模块不知能否利用。

ljh4371

0个粉丝

3

问答

0

专栏

0

资料

ljh4371 2016-07-18 11:03:12
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=34171&ptid=11958]ngswfx 发表于 2016-7-18 11:00[/url]
这类处理,一定要把各个段的代码,通过GetTickCount()这一类的函数,把每个稍微费劲的代码时间都打印出 ...[/quote]

谢谢您,很受启发!我再试试!

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-18 11:06:36
认可0
本帖最后由 ngswfx 于 2016-7-18 11:18 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=34172&ptid=11958]ljh4371 发表于 2016-7-18 11:03[/url]
谢谢您,很受启发!我再试试![/quote]

另外,我估计cmos应该能直接通过VI接口送D1的数据吧,你可以看看,要是这样就方便了,或者看能不能在VPSS后面再取数据,如果也能得到YUV数据,那就很容易了,甚至可以得到352*288 CIF的数据。




//////////我看了VPSS的文档了,里面有能得到YUV数据的函数,直接就缩放完成的,你直接用就可以了。

wangwenlong

0个粉丝

1

问答

0

专栏

0

资料

wangwenlong 2016-12-21 10:54:09
认可0
您好,请问一下您是如何取出YUV数据帧的啊,我尝试这个接口过程是:
1. sensor设置为offline模式
2. 各种系统初始化
3. set_vpss_chn_depth
4. getstream
5. 将所得到的数据结构体内的s32phyaddr通过HI_MPI_SYS_Mmap映射出来
6. 通过所映射的地址指向的内存获取YUV数据

经过上述步骤能够获取数据,但是只能获取错误的数据,纯绿色的画面,原因还不知道,你是如何获取YUV数据的啊
加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区