抠图贴图
功能介绍
对输入的图像进行抠图并粘贴到背景图片中的操作,输出到Image对象中。
接口调用流程
使用抠图贴图接口前,用户需准备好被抠图以及被粘贴的图片对象。
图1 图像处理(抠图贴图)接口调用流程
关键步骤说明如下:
- 调用MxInit()接口进行全局初始化。
- ImageProcessor初始化。
用户构造ImageProcessor对象,之后可以调用InitVpcChannel()初始化通道,若不调用该接口,ImageProcessor会在执行抠图并贴图前自动进行通道初始化。
- 使用图片解码接口对输入图片进行解码。
根据业务对图片进行解码,生成可抠图贴图的Image对象。后续可以通过图像处理接口对图片进行处理,生成最终需要抠图贴图的Image对象。
- 构造抠图贴图参数和输出Image。
- 根据业务要求,设置被抠图片的矩阵并设置粘贴图片位置的矩阵,二者大小不一样时将自动进行缩放。
- 构造输出图片的背景图片,使用预申请内存的Image()构造函数构造被粘贴图片或其他非空图片作为输出。
- 调用CropAndPaste()对输入图片进行抠图并将图片粘贴至指定位置。
- 同步执行。
- 不创建Stream,将输入图片及其他参数传入接口,获取抠图贴图结果。
- 异步执行。
- 创建Stream,具体请参见异步调用。
- 将输入图片、已创建的Stream及其他参数传入接口,获取抠图贴图结果。
- 调用MxDeInit()接口对初始化的全局资源进行去初始化。
- 同步执行。
示例代码
以下为功能特性关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。
//初始化
MxInit();
{
//构造图像处理类
ImageProcessor imageProcessor(deviceId);
//图像解码生成Image
//解码后的图像类
Image decodedImage;
//根据图像路径进行解码
APP_ERROR ret = imageProcessor.Decode(imagePath, decodedImage);
if (ret != APP_ERR_OK) {
std::cout << "Decode failed." << std::endl;
}
//(可选)初始化图像处理通道
imageProcessor.InitVpcChannel();
//构造背景Image(也可以选择其他已有数据的Image对象)
Size imageSize(640, 640);
size_t dataSize = 640 * 640 * 3 / 2;
MemoryData imgData(dataSize, MemoryData::MemoryType::MEMORY_DVPP, deviceId);
if (MemoryHelper::Malloc(imgData) != APP_ERR_OK) {
std::cout << "Malloc failed." << std::endl;
}
std::shared_ptr<uint8_t> pastedData((uint8_t*)imgData.ptrData, imgData.free);
/ 抠图贴图操作后图像类
Image pastedImage(pastedData, dataSize, deviceId, imageSize);
//执行抠图贴图
//抠图和贴图尺寸
Rect rectFrom(0, 0, 240, 240);
Rect rectTo(0, 0, 480, 480);
std::pair<Rect, Rect> cropPasteRect = {rectFrom, rectTo};
//抠图贴图操作
ret = imageProcessor.CropAndPaste(resizeImage, cropPasteRect, pastedImage) ;
if (ret != APP_ERR_OK) {
std::cout << "CropAndPaste failed." << std::endl;
}
}
//去初始化
MxDeInit();
父主题: 通过接口进行图像处理(Image)