更新时间:2021-03-18 GMT+08:00
抠图
基本原理
- 调用acldvppCreateChannel接口创建图片数据处理的通道。
- 调用acldvppVpcCropAsync异步接口,按指定区域从输入图片中抠图,再将抠的图片存放到输出内存中,作为输出图片。对于异步接口,还需调用aclrtSynchronizeStream接口阻塞Host运行,直到指定Stream中的所有任务都完成。
- 输出图片区域与抠图区域cropArea不一致时会对图片再做一次缩放操作。
示例代码
您可以从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 61 | #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. 指定抠图区域的位置,cropArea_是acldvppRoiConfig类型
cropArea_ = acldvppCreateRoiConfig(550, 749, 480, 679);
//4. 创建图片数据处理通道时的通道描述信息,dvppChannelDesc_是acldvppChannelDesc类型
dvppChannelDesc_ = acldvppCreateChannelDesc();
//5. 创建图片数据处理的通道。
aclError ret = acldvppCreateChannel(dvppChannelDesc_);
//6. 申请输入内存cropInDevBuffer_,内存大小cropInBufferSize根据计算公式得出
//如果将其它操作(例如,解码)的输出内存作为抠图的输入,则无需单独申请输入内存
ret = acldvppMalloc(&cropInDevBuffer_, cropInBufferSize)
//7. 申请输出内存cropOutBufferDev_,内存大小cropOutBufferSize_根据计算公式得出
ret = acldvppMalloc(&cropOutBufferDev_, cropOutBufferSize_)
//8. 创建输入图片的描述信息,并设置各属性值,cropInputDesc_是acldvppPicDesc类型
cropInputDesc_ = acldvppCreatePicDesc();
acldvppSetPicDescData(cropInputDesc_, cropInDevBuffer_);
acldvppSetPicDescFormat(cropInputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420);
acldvppSetPicDescWidth(cropInputDesc_, inputWidth_);
acldvppSetPicDescHeight(cropInputDesc_, inputHeight_);
acldvppSetPicDescWidthStride(cropInputDesc_, inputWidthStride);
acldvppSetPicDescHeightStride(cropInputDesc_, inputHeightStride);
acldvppSetPicDescSize(cropInputDesc_, cropInBufferSize);
//9. 创建输出图片的描述信息,并设置各属性值,cropOutputDesc_是acldvppPicDesc类型
//如果抠图的输出图片作为模型推理的输入,则输出图片的宽高要与模型要求的宽高保持一致
cropOutputDesc_ = acldvppCreatePicDesc();
acldvppSetPicDescData(cropOutputDesc_, cropOutBufferDev_);
acldvppSetPicDescFormat(cropOutputDesc_, PIXEL_FORMAT_YUV_SEMIPLANAR_420); acldvppSetPicDescWidth(cropOutputDesc_, OutputWidth_);
acldvppSetPicDescHeight(cropOutputDesc_, OutputHeight_);
acldvppSetPicDescWidthStride(cropOutputDesc_, OutputWidthStride);
acldvppSetPicDescHeightStride(cropOutputDesc_, OutputHeightStride);
acldvppSetPicDescSize(cropOutputDesc_, cropOutBufferSize_);
//10. 执行异步缩放,再调用aclrtSynchronizeStream接口阻塞Host运行,直到指定Stream中的所有任务都完成
ret = acldvppVpcCropAsync(dvppChannelDesc_, cropInputDesc_,
cropOutputDesc_, cropArea_, stream_);
ret = aclrtSynchronizeStream(stream_);
//11. 解码结束后,释放资源,包括输入/输出图片的描述信息、输入/输出内存、通道描述信息、通道等
acldvppDestroyPicDesc(cropInputDesc_);
acldvppDestroyPicDesc(cropOutputDesc_);
(void)acldvppFree(cropInDevBuffer_);
(void)acldvppFree(cropOutBufferDev_);
acldvppDestroyChannel(dvppChannelDesc_);
(void)acldvppDestroyChannelDesc(dvppChannelDesc_);
dvppChannelDesc_ = nullptr;
//....
|
父主题: VPC功能
