媒体数据处理V2版本(VPC)图像缩放内容解析

举报
马城林 发表于 2022/06/28 14:53:17 2022/06/28
【摘要】 媒体数据处理V2版本的接口介绍

Ascend710,专属媒体数据处理接口介绍

1.什么是Ascend710?

Ascend710是华为公司开发的一款用于AI计算的芯片,也就是大家常说的NPU,通过专用的AI运算加速单元可以实现低功耗高效率的处理大量的AI运算任务。


2.为什么要用专用的媒体数据接口,opencv不是更加的通用吗?

opencv确实非常的通用,在CPU,GPU上都可以调用相应的API接口进行一些图像的数据处理,但是Ascend710上集成了专用的媒体数据处理结构,可以比传统媒体数据处理的方式更加节能高效的完成任务,这点在一些嵌入式的场景中意义重大,而opencv虽然也可以,但是考虑到传统的软件解码大多安排在CPU上运算,不仅带来了极高的运算量抢占其它的应用计算资源而且不高效,而opencv也不可以调用相应的Asend芯片的能力。所以我们要有一套专用接口。


首先贴出官方的文档的链接,请各位小伙伴有不太明白的地方查看官方的文档。
官方文档链接

虽然媒体数据处理v2版本的接口目前处在体验中,并未大规模宣传,但是从官网图片来看已经支持的很好了
image.png

流程图
vpc流程图
从图上我们可以看出虽然接口变成了第二版本,但是实际上整体思路还是没有改变依然是:

系统初始化==》创建对应的媒体处理功能通道==》申请内存==》调用处理接口==》调用获取结果接口==》内存释放==》系统注销

重点分析一下几个重要的API接口

  1. 创建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;
  1. 缩放的接口
// 原型
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用来区分不同任务
  1. 接收缩放(抠图)的结果的接口
// 原型
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:超时方式,配置具体的超时时间。一般偏差在操作系统的一个时间片内
  1. 抠图任务发送接口
// 原型
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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。