【2023 · CANN训练营第一季】应用开发深入讲解

开发应用时,如果涉及抠图、缩放等图片处理,则应用程序中必须包含图片处理的代码逻辑。


前言

DVPP最底层是一个独立于昇腾AI处理器中其他模块的单独专用加速器,专门负责执行与图像和视频 相对应的编解码和预处理任务。 DVPP的主要功能包括缩放、抠图、格式转换、图片编解码、视频编解码等。
本文介绍图片缩放!

一、抠图缩放流程。

来自https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/60RC1alpha001/infacldevg/aclcppdevg/aclcppdevg_000043.html

二、关键接口的说明如下(以抠图、缩放处理为例)。

1.调用acldvppCreateChannel接口创建图片数据处理的通道。

1)创建图片数据处理的通道前,需先调用acldvppCreateChannelDesc接口创建通道描述信息。调用acldvppCreateRoiConfig接口、acldvppCreateResizeConfig接口分别创建抠图区域位置的配置、缩放配置。
2)实现抠图、缩放功能前,若需要申请Device上的内存存放输入或输出数据,需调用acldvppMalloc申请内存。

2.执行抠图、缩放。

关于抠图:
调用acldvppVpcCropAsync异步接口,按指定区域从输入图片中抠图,再将抠的图片存放到输出内存中,作为输出图片。输出图片区域与抠图区域cropArea不一致时会对图片再做一次缩放操作。
当前系统还提供了acldvppVpcCropAndPasteAsync异步接口,支持按指定区域从输入图片中抠图,再将抠的图片贴到目标图片的指定位置,作为输出图片。
抠图区域cropArea的宽高与贴图区域pasteArea宽高不一致时会对图片再做一次缩放操作。
如果用户需要将目标图片读入内存用于存放输出图片,将贴图区域叠加在目标图片上,则需要编写代码逻辑:在申请输出内存后,将目标图片读入输出内存。
关于缩放:
调用acldvppVpcResizeAsync异步接口,将输入图片缩放到输出图片大小。
缩放后输出图片内存根据YUV420SP格式计算,计算公式:对齐后的宽对齐后的高3/2。

三、抠图缩放(一框一图)。

1.基本原理。

	1)调用acldvppCreateChannel接口创建图片数据处理的通道、调用acldvppDestroyChannel接口销毁图片数据处理的通道。

	2)调用acldvppVpcCropResizeAsync异步接口,按指定区域从输入图片中抠图,再将抠的图片存放到输出内存中,作为输出图片。对于异步接口,还需调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成。调用acldvppVpcCropResizeAsync接口实现抠图缩放时,支持指定缩放算法。

	3)输出图片区域与抠图区域cropArea不一致时会对图片再做一次缩放操作。

2.部分代码。

// 1.AscendCL初始化
aclRet = aclInit(nullptr);

// 2.运行管理资源申请(依次申请Device、Context、Stream)
aclrtContext context_;
aclrtStream stream_;
aclrtSetDevice(0);
aclrtCreateContext(&context_, 0);
aclrtCreateStream(&stream_);

// 3. 创建缩放配置数据,并指定抠图区域的位置
// resizeConfig_是acldvppResizeConfig类型
resizeConfig_ = acldvppCreateResizeConfig();
aclError aclRet = acldvppSetResizeConfigInterpolation(resizeConfig_, 0);
// cropArea_是acldvppRoiConfig类型
cropArea_ = acldvppCreateRoiConfig(550, 749, 480, 679);

// 4. 创建图片数据处理通道时的通道描述信息,dvppChannelDesc_是acldvppChannelDesc类型
dvppChannelDesc_ = acldvppCreateChannelDesc();

// 5. 创建图片数据处理的通道。
ret = acldvppCreateChannel(dvppChannelDesc_);
//略
// 12. 释放运行管理资源(依次释放Stream、Context、Device)
aclrtDestroyStream(stream_);
aclrtDestroyContext(context_);
aclrtResetDevice(0);

// 13.AscendCL去初始化
aclRet = aclFinalize();

// ....
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值