更新时间:2021-03-18 GMT+08:00
分享

图片缩放

基本原理

  • 调用acldvppCreateResizeConfig接口创建图片缩放配置数据,不支持指定缩放算法,默认缩放算法为“最近邻插值”。
  • 缩放后输出图片内存根据YUV420SP格式计算,计算公式:对齐后的宽*对齐后的高*3/2

示例代码

您可以从acl_vpc_jpege_resnet50样例的“src/sample_process.cpp”“src/dvpp_process.cpp”“src/utils.cpp”文件中查看完整样例代码。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "acl/acl.h"
#include "acl/ops/acl_dvpp.h"
//1.ACL初始化
const char *aclConfigPath = "../src/acl.json";
aclError ret = aclInit(aclConfigPath);

//2.运行管理资源申请,包括Device、Context、Stream
ret = aclrtSetDevice(deviceId_);
ret = aclrtCreateContext(&context_, deviceId_);
ret = aclrtCreateStream(&stream_);

//3. 创建图片缩放配置数据,不支持指定缩放算法,默认缩放算法为“最近邻插值”
//resizeConfig_是acldvppResizeConfig类型
acldvppResizeConfig *resizeConfig_ = acldvppCreateResizeConfig();

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

//5. 创建图片数据处理的通道。
aclError ret = acldvppCreateChannel(dvppChannelDesc_);

//6. 申请缩放输入内存resizeInDevBuffer_,内存大小resizeInBufferSize根据计算公式得出
ret = acldvppMalloc(&resizeInDevBuffer_, resizeInBufferSize)
//7. 申请缩放输出内存resizeOutBufferDev_,内存大小resizeOutBufferSize_根据计算公式得出
ret = acldvppMalloc(&resizeOutBufferDev_, resizeOutBufferSize_)

//8. 创建缩放输入图片的描述信息,并设置各属性值
//resizeInputDesc_是acldvppPicDesc类型
resizeInputDesc_ = acldvppCreatePicDesc();
acldvppSetPicDescData(resizeInputDesc_, resizeInDevBuffer_);
acldvppSetPicDescFormat(resizeInputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420);
acldvppSetPicDescWidth(resizeInputDesc_, inputWidth_);
acldvppSetPicDescHeight(resizeInputDesc_, inputHeight_);
acldvppSetPicDescWidthStride(resizeInputDesc_, inputWidthStride);
acldvppSetPicDescHeightStride(resizeInputDesc_, inputHeightStride);
acldvppSetPicDescSize(resizeInputDesc_, resizeInBufferSize);

//9. 创建缩放输出图片的描述信息,并设置各属性值
//如果缩放的输出图片作为模型推理的输入,则输出图片的宽高要与模型要求的宽高保持一致
//resizeOutputDesc_是acldvppPicDesc类型
resizeOutputDesc_ = acldvppCreatePicDesc();
acldvppSetPicDescData(resizeOutputDesc_, resizeOutBufferDev_);
acldvppSetPicDescFormat(resizeOutputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420); acldvppSetPicDescWidth(resizeOutputDesc_, resizeOutputWidth_);
acldvppSetPicDescHeight(resizeOutputDesc_, resizeOutputHeight_);
acldvppSetPicDescWidthStride(resizeOutputDesc_, resizeOutputWidthStride);
acldvppSetPicDescHeightStride(resizeOutputDesc_, resizeOutputHeightStride);
acldvppSetPicDescSize(resizeOutputDesc_, resizeOutBufferSize_);

//10. 执行异步缩放,再调用aclrtSynchronizeStream接口阻塞Host运行,直到指定Stream中的所有任务都完成
ret = acldvppVpcResizeAsync(dvppChannelDesc_, resizeInputDesc_,
        resizeOutputDesc_, resizeConfig_, stream_);
ret = aclrtSynchronizeStream(stream_);

//11. 缩放结束后,释放资源,包括缩放输入/输出图片的描述信息、缩放输入/输出内存
acldvppDestroyPicDesc(resizeInputDesc_);
acldvppDestroyPicDesc(resizeOutputDesc_);
(void)acldvppFree(resizeInDevBuffer_);
(void)acldvppFree(resizeOutBufferDev_);

//....
分享:

    相关文档

    相关产品

close