若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/123536470
红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…

海思开发专栏

上一篇:《Hi3516开发笔记(九):在QtCreator开发环境中引入海思sdk的bsp包,运行显示Qt界面》
下一篇:敬请期待…

前言

  上一篇已经将himpp套入qt的基础上进行开发。那么qt中拿到frame则是很关键的交互,这是qt与海思可能编解码交叉开发的关键步骤。

受限制

  因为直接配置sample的vi比较麻烦,确实是困难的,其实就是配置驱动,所以我们只能从开发板的demo入手,去在相等条件下探测可能的留,从vpss中拿取后,进行软编码。
  当然,如果不用qt还有一种方式,也就是大量开发海思人员使用的方式,是基于sample写一个编码程序,然后使用本地socket交互,其实绝大部分海思开发者都是这样开发的,但是他们不涉及与qt的深入交互。

前提条件

  需要移植ffmpeg到海思平台,可参考博文《FFmpeg开发笔记(十):ffmpeg在ubuntu上的交叉编译移植到海思HI35xx平台》。

Demo演示

  从vpss中获取一帧图像,如下图:
  
  

相关的API

  (原本整理了一大半自己的习惯格式,后续海思看多了,觉得海思文档也还行,就是争对性的开发,无用信息有点多,所以此处还是用海思的文档,但是只提取涉及的部分,海思文档是个庞大的体系,需要动手,光看是很难理解的)。

HI_MPI_VPSS_GetChnFrame:从通道获取一帧处理完的数据

  用户从通道获取一帧处理完成的图像,必须与HI_MPI_VPSS_ReleaseChnFrame()配对使用。

函数原型

HI_S32 HI_MPI_VPSS_GetChnFrame(VPSS_GRP VpssGrp,VPSS_CHN VpssChn,VIDEO_FRAME_INFO_S *pstVideoFrame,HI_S32 s32MilliSec);
  • 参数一:VpssGrou,通道组号,海思芯片通道号,
    取值[0, VPSS_MAX_GRP_NUM];
  • 参数二:VpssChn,通道号,通道组下的通道号,
    取值[0, VPSS_MAX_CHN_NUM];
  • 参数三:pstVideoFrame,帧数据的结构体,要取的数据就在这个帧里面,这
    是很关键的结构体,稍后是会深入讲解的重点;
  • 参数四:s32MilliSec,阻塞时间,跟其他阻塞有点区别,-1为阻塞,0为直
    接获取,其他整数位等待的超时时间。

返回值

  

其他注意

  

HI_MPI_VPSS_ReleaseChnFrame:释放一帧图像

  释放之前通过HI_MPI_VPSS_GetChnFrame获取获取的图像。

函数原型

HI_S32 HI_MPI_VPSS_ReleaseChnFrame (VPSS_GRP VpssGrp,VPSS_CHN VpssChn,const VIDEO_FRAME_INFO_S *pstVideoFrame);
  • 参数一:VpssGrou,通道组号,海思芯片通道号,
    取值[0, VPSS_MAX_GRP_NUM],之前获取使用的是哪个就哪个;
  • 参数二:VpssChn,通道号,通道组下的通道号,
    取值[0, VPSS_MAX_CHN_NUM];之前获取使用的是哪个就哪个;
  • 参数三:pstVideoFrame,帧数据的结构体,要取的数据就在这个帧里面,这
    是很关键的结构体,稍后是会深入讲解的重点;

返回值

  

其他注意

  

相关的结构体

VIDEO_FRAME_INFO_S:定义视频图像帧信息结构体

结构体原型

typedef struct hiVIDEO_FRAME_INFO_S
{VIDEO_FRAME_S stVFrame;        // 视频图像帧HI_U32 u32PoolId;           // 视频缓存池IDMOD_ID_E enModId;         // 当前帧数据是由哪一个硬件逻辑模块写出的
} VIDEO_FRAME_INFO_S;

VIDEO_FRAME_S:定义视频原始图像帧结构体

结构体原型

typedef struct hiVIDEO_FRAME_S
{HI_U32 u32Width;                   // 图像宽度HI_U32 u32Height;                    // 图像高度VIDEO_FIELD_E enField;               // 帧场模式PIXEL_FORMAT_E enPixelFormat;        // 视频图像像素格式VIDEO_FORMAT_E enVideoFormat;        // 视频图像格式COMPRESS_MODE_E enCompressMode;        // 视频压缩模式DYNAMIC_RANGE_E enDynamicRange;        // 动态范围COLOR_GAMUT_E enColorGamut;          // 色域范围HI_U32 u32HeaderStride[3];           // 图像压缩头跨距HI_U32 u32Stride[3];              // 图像数据跨距HI_U32 u32ExtStride[3];                // 10bit数据位宽的图像,部分格式分开存HI_U64 u64HeaderPhyAddr[3];           // 压缩头物理地址HI_U64 u64HeaderVirAddr[3];           // 压缩头虚拟地址,内核态虚拟地址HI_U64 u64PhyAddr[3];              // 图像数据物理地址HI_U64 u64VirAddr[3];                // 图像数据虚拟地址,内核态虚拟地址HI_U64 u64ExtPhyAddr[3];          // 10bit数据位宽度的图像,部分格式分开存HI_U64 u64ExtVirAddr[3];         // 10bit数据位宽度的图像,部分格式分开存HI_S16 s16OffsetTop;                 // 图像顶部剪裁宽度HI_S16 s16OffsetBottom;              // 图像底部剪裁宽度HI_S16 s16OffsetLeft;                // 图像左侧剪裁宽度HI_S16 s16OffsetRight;               // 图像右侧剪裁宽度HI_U32 u32MaxLuminance;              // 显示图像的最大亮度HI_U32 u32MinLuminance;             // 显示图像的最小亮度HI_U32 u32TimeRef;                  // 图像帧序列号HI_U64 u64PTS;                     // 图像时间戳HI_U64 u64PrivateData;              // 私有数据HI_U32 u32FrameFlag;                 // 当前帧的标记,使用FRAME_FLAG_E标记VIDEO_SUPPLEMENT_S stSupplement;   // 图像的补充信息
} VIDEO_FRAME_S;

其他注意

  

相关枚举

VIDEO_FIELD_E:帧场模式

  

PIXEL_FORMAT_E:视频图像像素格式

  
  

VIDEO_FORMAT_E:视频图像格式

  

COMPRESS_MODE_E:视频压缩模式

  

DYNAMIC_RANGE_E:动态范围

  

COLOR_GAMUT_E:色域范围

  

VIDEO_SUPPLEMENT_S:图像的补充信息

  

Demo

void HiMppManager::testGetVPssFrame()
{VIDEO_FRAME_INFO_S videoFrameInfoS;
#if 0// 搜索开开发板用了哪个通道(应该只有2个摄像头,绑定了vpss)// 结果:探测到开发板在snap抓图模式下在通道组0通道0下有图片for(int groupIndex = 0; groupIndex < VPSS_MAX_GRP_NUM; groupIndex++){for(int channelIndex = 0; channelIndex < VPSS_MAX_CHN_NUM; channelIndex++){HI_S32 s32MilliSec = 100;HI_S32 ret = HI_MPI_VPSS_GetChnFrame(groupIndex, channelIndex, &videoFrameInfoS, s32MilliSec);if(ret == 0){LOG << QString("Succeed to get HI_MPI_VPSS_GetChnFrame(%1, %2, &videoFrameInfoS, %3)").arg(groupIndex).arg(channelIndex).arg(s32MilliSec);break;
#if 0}else{LOG <<  QString("Failed to get HI_MPI_VPSS_GetChnFrame(%1, %2, &videoFrameInfoS, %3): %4").arg(groupIndex).arg(channelIndex).arg(s32MilliSec).arg(ret);
#endif}}}
#endifwhile(HI_MPI_VPSS_GetChnFrame(0, 0, &videoFrameInfoS, -1) == 0){LOG << "get frame";LOG << videoFrameInfoS.stVFrame.enPixelFormat<< "PIXEL_FORMAT_YVU_PLANAR_420:" << (int)PIXEL_FORMAT_YVU_PLANAR_420<< "PIXEL_FORMAT_YVU_SEMIPLANAR_420:" << (int)PIXEL_FORMAT_YVU_SEMIPLANAR_420;LOG << videoFrameInfoS.stVFrame.enVideoFormat;HI_MPI_VPSS_ReleaseChnFrame(0, 0, &videoFrameInfoS);LOG << "release frame";    }
}

入坑

入坑一:获取vpss图像一定帧数后无法再获取

问题

  使用海思sdk获取图像后,多次获取后,大概20次左右就获取失败了。

原因

  海思获取图像后,需要释放,是占用了缓存区。
  海思的HI_MPI_VPSS_GetChanFrameHi_MPI_VPSS_ReleaseChnFrame要成对使用。

解决方法

  

上一篇:《Hi3516开发笔记(九):在QtCreator开发环境中引入海思sdk的bsp包,运行显示Qt界面》
下一篇:敬请期待…

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/123536470

Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件相关推荐

  1. Qt 中获取摄像头图像数据的方法

    Qt 中获取摄像头图像数据的方法 在 Qt 中提供了 QCamera 类用来操作摄像头.(这里的摄像头指的是电脑上常用的那种 USB 摄像头或网络摄像头,暂时还不支持工业相机.)摄像头获取的实时图像可 ...

  2. java memcached 存储对象_java – 从Memcache中获取低级别数据存储区实体对象时的慢速反序列化...

    事实证明,检索存储内存缓存的低级数据存储实体非常缓慢.由于objectify将实体缓存为低级数据存储区实体类型,因此当使用objectify从memcache中获取许多实体时,这会导致性能不佳. 真正 ...

  3. Hi3516开发笔记(十一):通过HiTools使用网口将uboot、kernel、roofts烧写进eMMC

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/128425000 红胖子(红模仿)的博文大全:开发技术集 ...

  4. Hi3516开发笔记(一):海思HI3516DV300芯片介绍,入手开发板以及Demo测试

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121314575 长期持续项目技术分享,Shang业Di ...

  5. Hi3516开发笔记(三):Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121458516 长期持续项目技术分享,Shang业Di ...

  6. Hi3516开发笔记(二):Hi3516虚拟机基础环境搭建之串口调试、网络连接以及sftp文件传输

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121314575 长期持续项目技术分享,Shang业Di ...

  7. 【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo

    本系列文章由zhmxy555编写,转载请注明出处. 文章链接  http://blog.csdn.net/zhmxy555/article/details/7447864 作者:毛星云    邮箱:  ...

  8. 【Visual C 】游戏开发笔记十六 讲解一个完整的回合制游戏demo

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  9. [原]【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo

    本系列文章由zhmxy555编写,转载请注明出处. 文章链接  http://blog.csdn.net/zhmxy555/article/details/7447864 作者:毛星云    邮箱:  ...

最新文章

  1. afn原理 ios_iOS开发:AFN的基本使用
  2. Javascript获取最近若干个月
  3. python opencv读写图片
  4. python如何做散点图-Python-如何为散点图制作动画?
  5. 做正确的事,正确的做事
  6. curl http header_PHP如何解析header头部信息
  7. efcore调用函数_.net core EF Core调用存储过程的方式
  8. [WCF安全系列]认证与凭证:用户名/密码认证与Windows认证
  9. 目标检测——图像增广
  10. MATLAB 读取txt文件(importdata函数)
  11. Android中的权限请求
  12. 零基础学HCIE难度大吗?
  13. [渝粤教育] 西南石油大学 岩体力学 参考 资料
  14. Apache ShenYu源码阅读系列-Dubbo插件
  15. 在校大学生关于程序员培训机构的想法
  16. matlab教师考试安排,2018教师资格证考试科目及日程安排
  17. SCC会员北京车展围拍超跑 却火了这款华为MateRS保时捷版手机
  18. python画图大全_python画图教程
  19. 【菜鸡读论文】Former-DFER: Dynamic Facial Expression Recognition Transformer
  20. KingbaseES 数据库导入导出方法

热门文章

  1. 永磁同步电机simulink仿真——PMSM直接转矩控制DTC
  2. 有哪些音频转文字的软件可以批量操作?
  3. 安卓学习专栏——从文件中读取数据、openFileInput(图文+代码)
  4. 计算机学院创新基金项目题目,关于组织开展2017年度大学生科技创新基金项目立项申报的通知...
  5. display:flex如何设置内容水平垂直居中
  6. 【jiasuba】驱动人生2008 一款免费的驱动管理软件
  7. layui实现增删改查——图书管理
  8. 郑伯克段于鄢隐公元年 《左传》
  9. 2021投资大复盘】上个月年化收益50%,这个月到今天54%了,也在今天封盘了,来年我们再战江湖【配图版】
  10. java dbcp连接池_Java——DBCP连接池