媒体数据处理V2版本(VPC)图像缩放内容解析
【摘要】 媒体数据处理V2版本的接口介绍
Ascend710,专属媒体数据处理接口介绍
1.什么是Ascend710?
Ascend710是华为公司开发的一款用于AI计算的芯片,也就是大家常说的NPU,通过专用的AI运算加速单元可以实现低功耗高效率的处理大量的AI运算任务。
2.为什么要用专用的媒体数据接口,opencv不是更加的通用吗?
opencv确实非常的通用,在CPU,GPU上都可以调用相应的API接口进行一些图像的数据处理,但是Ascend710上集成了专用的媒体数据处理结构,可以比传统媒体数据处理的方式更加节能高效的完成任务,这点在一些嵌入式的场景中意义重大,而opencv虽然也可以,但是考虑到传统的软件解码大多安排在CPU上运算,不仅带来了极高的运算量抢占其它的应用计算资源而且不高效,而opencv也不可以调用相应的Asend芯片的能力。所以我们要有一套专用接口。
首先贴出官方的文档的链接,请各位小伙伴有不太明白的地方查看官方的文档。
官方文档链接
虽然媒体数据处理v2版本的接口目前处在体验中,并未大规模宣传,但是从官网图片来看已经支持的很好了
流程图
从图上我们可以看出虽然接口变成了第二版本,但是实际上整体思路还是没有改变依然是:
系统初始化==》创建对应的媒体处理功能通道==》申请内存==》调用处理接口==》调用获取结果接口==》内存释放==》系统注销
重点分析一下几个重要的API接口
- 创建vpc图像处理通道接口
// 原型
hi_s32 hi_mpi_vpc_create_chn(hi_vpc_chn chn, const hi_vpc_chn_attr *attr)
// 参数
hi_vpc_chn chn:此参数表示图像的处理通道号取值范围为[0,256)
hi_vpc_chn_attr *attr
typedef struct {
hi_s32 attr; // 任务队列深度,取值范围:[0,350],表示一个通道的下发任务量。内存消耗随容量线性变化。
hi_u32 pic_width; // 通道所支持的最大的图像宽度,目前没有实际作用,官方建议设置为零,防止以后的版本兼容的问题。
hi_u32 pic_height; // 通道所支持的最大的图像高度,目前没有实际作用,官方建议设置为零,防止以后的版本兼容的问题。
} hi_vpc_chn_attr;
- 缩放的接口
// 原型
hi_s32 hi_mpi_vpc_resize (hi_vpc_chn chn, const hi_vpc_pic_info *source_pic, hi_vpc_pic_info *dest_pic, hi_double fx, hi_double fy, hi_u32 interpolation, hi_u32 *task_id, hi_s32 milli_sec)
// 参数
hi_vpc_chn chn:图片处理通道号,取值范围:[0, 256)
hi_vpc_pic_info *source_pic 输入图像信息的结构体指针
hi_vpc_pic_info *dest_pic 输出图像信息的结构体指针
typedef struct {
hi_void* picture_address; // 存放图片数据的Device地址。
hi_u32 picture_buffer_size; // 存放图片数据的缓冲区大小。(注意此大小为宽高对其后的大小,不一定为图片原始大小)
hi_u32 picture_width; // 图片真实宽。
hi_u32 picture_height; // 图片真实高
hi_u32 picture_width_stride; // 图片宽stride
hi_u32 picture_height_stride; // 图片高stride
hi_pixel_format picture_format; // 目标图片的格式
} hi_vpc_pic_info;
hi_double fx: 宽的缩放比例
hi_double fy: 高的缩放比例
hi_u32 interpolation:图像缩放
0:业界通用的Bilinear算法
1:业界通用的Nearest neighbor 算法
hi_s32 milli_sec:超时的方式
-1:阻塞方式
0:非阻塞方式
>0:超时方式,配置具体的超时时间。一般偏差在操作系统的一个时间片内。
hi_u32 *task_id:任务的ID用来区分不同任务
- 接收缩放(抠图)的结果的接口
// 原型
hi_s32 hi_mpi_vpc_get_process_result(hi_vpc_chn chn, hi_u32 task_id, hi_s32 milli_sec)
此接口可以与任务发送接口在同一个线程中,也可以在另一个线程中调用加快速度。
// 参数
hi_vpc_chn chn: 图片处理通道号,取值范围:[0, 256)
hi_u32 task_id: 任务的ID用来区分不同任务
hi_s32 milli_sec: 超时的方式
-1:阻塞方式
0:非阻塞方式
>0:超时方式,配置具体的超时时间。一般偏差在操作系统的一个时间片内
- 抠图任务发送接口
// 原型
hi_s32 hi_mpi_vpc_crop(hi_vpc_chn chn, const hi_vpc_pic_info *source_pic, hi_vpc_crop_region_info crop_info[], hi_u32 count, hi_u32 *task_id, hi_s32 milli_sec)
// 参数
hi_vpc_chn chn:图片处理通道号,取值范围:[0, 256)
hi_vpc_pic_info *source_pic 解释同上一条
hi_u32 count:抠图区域的数量,取值范围[1,256]
hi_vpc_crop_region_info crop_info[]:抠图图片信息数组,该数组长度与count参数值保持一致
typedef struct {
hi_vpc_pic_info dest_pic_info;
hi_vpc_crop_region crop_region;
} hi_vpc_crop_region_info;
typedef struct {
hi_u32 top_offset; // 抠图的左上角(横坐标)
hi_u32 left_offset; // 抠图的左上角(纵坐标)
hi_u32 crop_width; // 抠图区域宽
hi_u32 crop_height; // 抠图区域高
} hi_vpc_crop_region;
开源代码学习
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)