Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件
若该文为原创文章,转载请注明原文出处
本文章博客地址: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_GetChanFrame与Hi_MPI_VPSS_ReleaseChnFrame要成对使用。
解决方法
上一篇:《Hi3516开发笔记(九):在QtCreator开发环境中引入海思sdk的bsp包,运行显示Qt界面》
下一篇:敬请期待…
若该文为原创文章,转载请注明原文出处
本文章博客地址:https://hpzwl.blog.csdn.net/article/details/123536470
Hi3516开发笔记(十):Qt从VPSS中获取通道图像数据存储为jpg文件相关推荐
- Qt 中获取摄像头图像数据的方法
Qt 中获取摄像头图像数据的方法 在 Qt 中提供了 QCamera 类用来操作摄像头.(这里的摄像头指的是电脑上常用的那种 USB 摄像头或网络摄像头,暂时还不支持工业相机.)摄像头获取的实时图像可 ...
- java memcached 存储对象_java – 从Memcache中获取低级别数据存储区实体对象时的慢速反序列化...
事实证明,检索存储内存缓存的低级数据存储实体非常缓慢.由于objectify将实体缓存为低级数据存储区实体类型,因此当使用objectify从memcache中获取许多实体时,这会导致性能不佳. 真正 ...
- Hi3516开发笔记(十一):通过HiTools使用网口将uboot、kernel、roofts烧写进eMMC
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/128425000 红胖子(红模仿)的博文大全:开发技术集 ...
- Hi3516开发笔记(一):海思HI3516DV300芯片介绍,入手开发板以及Demo测试
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121314575 长期持续项目技术分享,Shang业Di ...
- Hi3516开发笔记(三):Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121458516 长期持续项目技术分享,Shang业Di ...
- Hi3516开发笔记(二):Hi3516虚拟机基础环境搭建之串口调试、网络连接以及sftp文件传输
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121314575 长期持续项目技术分享,Shang业Di ...
- 【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo
本系列文章由zhmxy555编写,转载请注明出处. 文章链接 http://blog.csdn.net/zhmxy555/article/details/7447864 作者:毛星云 邮箱: ...
- 【Visual C 】游戏开发笔记十六 讲解一个完整的回合制游戏demo
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- [原]【Visual C++】游戏开发笔记十六 讲解一个完整的回合制游戏demo
本系列文章由zhmxy555编写,转载请注明出处. 文章链接 http://blog.csdn.net/zhmxy555/article/details/7447864 作者:毛星云 邮箱: ...
最新文章
- afn原理 ios_iOS开发:AFN的基本使用
- Javascript获取最近若干个月
- python opencv读写图片
- python如何做散点图-Python-如何为散点图制作动画?
- 做正确的事,正确的做事
- curl http header_PHP如何解析header头部信息
- efcore调用函数_.net core EF Core调用存储过程的方式
- [WCF安全系列]认证与凭证:用户名/密码认证与Windows认证
- 目标检测——图像增广
- MATLAB 读取txt文件(importdata函数)
- Android中的权限请求
- 零基础学HCIE难度大吗?
- [渝粤教育] 西南石油大学 岩体力学 参考 资料
- Apache ShenYu源码阅读系列-Dubbo插件
- 在校大学生关于程序员培训机构的想法
- matlab教师考试安排,2018教师资格证考试科目及日程安排
- SCC会员北京车展围拍超跑 却火了这款华为MateRS保时捷版手机
- python画图大全_python画图教程
- 【菜鸡读论文】Former-DFER: Dynamic Facial Expression Recognition Transformer
- KingbaseES 数据库导入导出方法
热门文章
- 永磁同步电机simulink仿真——PMSM直接转矩控制DTC
- 有哪些音频转文字的软件可以批量操作?
- 安卓学习专栏——从文件中读取数据、openFileInput(图文+代码)
- 计算机学院创新基金项目题目,关于组织开展2017年度大学生科技创新基金项目立项申报的通知...
- display:flex如何设置内容水平垂直居中
- 【jiasuba】驱动人生2008 一款免费的驱动管理软件
- layui实现增删改查——图书管理
- 郑伯克段于鄢隐公元年 《左传》
- 2021投资大复盘】上个月年化收益50%,这个月到今天54%了,也在今天封盘了,来年我们再战江湖【配图版】
- java dbcp连接池_Java——DBCP连接池