样例介绍

获取样例

单击GiteeGithub,进入Ascend samples开源仓,参见README中的“版本说明”下载配套版本的sample包,从“cplusplus/level2_simple_inference/0_data_process/smallResolution_cropandpaste”目录下获取smallResolution_cropandpaste样例

功能描述

该样例主要实现以下三种场景的抠图贴图:

1、抠图区域小于10*6。

2、贴图区域与抠图区域的缩放比例在[1/32, 16]范围内。

3、满足VPC分辨率要求的输入图片的抠图贴图,分辨率的要求,请参见约束说明

原理介绍

在该样例中,涉及的关键功能点,如下表所示。API接口的详细介绍请参见AscendCL API参考

初始化

  • 调用aclInit接口初始化AscendCL配置。
  • 调用aclFinalize接口实现AscendCL去初始化。

Device管理

  • 调用aclrtSetDevice接口指定用于运算的Device。
  • 调用aclrtGetRunMode接口获取软件栈的运行模式,根据运行模式的不同,内部处理流程不同。
  • 调用aclrtResetDevice接口复位当前运算的Device,回收Device上的资源。

Context管理

  • 调用aclrtCreateContext接口创建Context。
  • 调用aclrtDestroyContext接口销毁Context。

Stream管理

  • 调用aclrtCreateStream接口创建Stream。
  • 调用aclrtDestroyStream接口销毁Stream。
  • 调用aclrtSynchronizeStream接口阻塞程序运行,直到指定Stream中的所有任务都完成。

内存管理

  • 调用aclrtMallocHost接口申请Host上内存。
  • 调用aclrtFreeHost释放Host上的内存。
  • 调用aclrtMalloc接口申请Device上的内存。
  • 调用aclrtFree接口释放Device上的内存。

执行媒体数据处理时,若需要申请Device上的内存存放输入或输出数据,需调用acldvppMalloc申请内存、调用acldvppFree接口释放内存。

数据传输

调用aclrtMemcpy接口:

  • 将数据从Host传输到Device上,作为解码的输入数据。
  • 模型推理结束后,将推理结果从Device传输到Host。

如果在板端环境上运行应用,则无需进行数据传输。

媒体数据处理

抠图贴图:

调用acldvppVpcCropAndPasteAsync接口按指定区域从输入图片中抠图,再将抠的图片贴到目标图片的指定位置,作为输出图片。

目录结构

样例代码结构如下所示。

├── data
│   ├── dvpp_vpc_1920x1080_nv12.yuv            //测试数据,需要按指导获取测试图片,放到data目录下

├── inc
│   ├── dvpp_process.h               //声明媒体数据处理相关函数的头文件
│   ├── sample_process.h               //声明模型处理相关函数的头文件                  
│   ├── utils.h                       //声明公共函数(例如:文件读取函数)的头文件

├── src
│   ├── acl.json               //系统初始化的配置文件
│   ├── CMakeLists.txt         //编译脚本
│   ├── dvpp_process.cpp       //媒体数据处理相关函数的实现文件
│   ├── main.cpp               //主函数,抠图贴图功能的实现文件
│   ├── sample_process.cpp     //资源初始化/销毁相关函数的实现文件                                       
│   ├── utils.cpp              //公共函数(例如:文件读取函数)的实现文件

├── CMakeLists.txt    //编译脚本,调用src目录下的CMakeLists文件