抠图
功能介绍
对输入的图像进行抠图操作,输出到Tensor对象中。
接口调用流程
使用抠图接口前,用户需准备好被抠图的图片并转换到Tensor对象中。
图1 张量方法(抠图)接口调用流程
关键步骤说明如下:
- 调用MxInit()接口进行全局初始化。
- 构造抠图Rect以及输出Tensor。
- 选择执行方式进行抠图,请根据实际业务选择同步抠图方式或异步抠图方式。
- 同步执行。
- 不创建Stream,将输入图片及其他参数传入Crop方法,获取抠图结果。
- 异步执行。
- 创建Stream,具体请参见异步调用。
- 将输入图片、已创建的Stream及其他参数传入Crop方法,获取抠图结果。
- 同步执行。
- 调用MxDeInit()接口对初始化的全局资源进行去初始化。
示例代码
以下为功能特性关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。
//初始化
MxBase::MxInit();
{
// 读取图片
std::string imgPath = "./test.jpg";
cv::Mat imgData = cv::imread(imgPath, cv::IMREAD_UNCHANGED);
std::vector<uint32_t> shape{600, 600, 3};
// 构造输入tensor
MxBase::Tensor input(imgData.data, shape, MxBase::TensorDType::UINT8, -1);
input.ToDvpp(0);
// 设置抠图区域
MxBase::Rect rect(0, 0, 320, 320);
// 构造输出tensor
std::vector<uint32_t> dstShape = {320, 320, 3};
MxBase::Tensor dst(dstShape, MxBase::TensorDType::UINT8, -1);
dst.Malloc();
dst.ToDevice(0);
// 设置输出tensor是否保留无效边界
bool keepMargin = true;
// 执行抠图操作
APP_ERROR ret = MxBase::Crop(input, rect, dst, keepMargin);
if (ret != APP_ERR_OK) {
std::cout << "Crop failed." << std::endl;
}
}
//去初始化
MxBase::MxDeInit();
父主题: 通过张量方法进行图像处理(Tensor)