Skip to main content

抠图缩放

缩放

功能介绍

对输入的图像进行缩放操作,输出到Image对象中。

接口调用流程

使用缩放接口前,用户需准备好被缩放的图片对象。

图1 图像处理(缩放)接口调用流程

关键步骤说明如下:

  1. 调用MxInit()接口进行全局初始化。

  2. ImageProcessor初始化。

    用户构造ImageProcessor对象,之后可以调用InitVpcChannel()初始化通道,若不调用该接口,ImageProcessor会在执行缩放前自动进行通道初始化。

  3. 使用图片解码接口对输入图片进行解码。

    根据业务对图片进行解码,生成可缩放的Image对象。后续可以通过图像处理接口对图片进行处理,生成最终需要缩放的Image对象。

  4. 构造缩放参数和输出Image。

    根据业务要求,构造对应的输入和输出Size和Image。

  5. 选择执行方式进行抠图。

    1. 同步执行。
      1. 不创建Stream,将输入图片及其他参数传入Resize()接口,获取缩放结果。
    2. 异步执行。
      1. 创建Stream,具体请参见异步调用
      2. 将输入图片、已创建的Stream及其他参数传入Resize()接口,获取缩放结果。
  6. 调用MxDeInit()接口对初始化的全局资源进行去初始化。

示例代码

以下为功能特性关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。

//初始化
MxInit();
{
//构造图像处理类
ImageProcessor imageProcessor(deviceId);

//图像解码生成Image
//解码后的图像类
Image decodedImage;

//根据图像路径进行解码
APP_ERROR ret = imageProcessor.Decode(imagePath, decodedImage);
if (ret != APP_ERR_OK) {
return 0;
}

//(可选)初始化图像处理通道
imageProcessor.InitVpcChannel();

//执行缩放
//缩放操作后图像类
Image resizedImage;

//缩放尺寸
Size size(416, 416);

//缩放操作
ret = imageProcessor.Resize(decodedImage, size, resizedImage, Interpolation::HUAWEI_HIGH_ORDER_FILTER);
if (ret != APP_ERR_OK) {
return 0;
}
}
//去初始化
MxDeInit();

父主题: 通过接口进行图像处理(Image)

补边

功能介绍

对输入的图像进行补边操作,输出到Image对象中。

接口调用流程

使用补边接口前,用户需准备好被补边的图片对象。

图1 图像处理(补边)接口调用流程

关键步骤说明如下:

  1. 调用MxInit()接口进行全局初始化。

  2. ImageProcessor初始化。

    用户构造ImageProcessor对象,之后可以调用InitVpcChannel()初始化通道,若不调用该接口,ImageProcessor会在执行补边前自动进行通道初始化。

  3. 使用图片解码接口对输入图片进行解码。

    根据业务对图片进行解码,生成可补边的Image对象。后续可以通过图像处理接口对图片进行处理,生成最终需要补边的Image对象。

  4. 构造补边参数。

    根据业务要求,构造对应的输入的“padDim”(表示补边上下左右的像素值)、“Color”(补边颜色)和输出的Image。

  5. 调用Padding()接口对输入图像进行补边。

  6. 调用MxDeInit()接口对初始化的全局资源进行去初始化。

示例代码

以下为功能特性关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。

//初始化
MxInit();
{
//构造图像处理类
ImageProcessor imageProcessor(deviceId);

//图像解码生成Image
//解码后的图像类
Image decodedImage;

//根据图像路径进行解码
APP_ERROR ret = imageProcessor.Decode(imagePath, decodedImage);
if (ret != APP_ERR_OK) {
return 0;
}

//(可选)初始化图像处理通道
imageProcessor.InitVpcChannel();

//执行补边
//补边操作后图像类
Image paddingImage;

//构造补边参数
Dim padDim(0, 0, 240, 240);
Color color(0, 0, 0);

// Padding操作
ret = imageProcessor.Padding(decodedImage, padDim, color, BorderType::BORDER_CONSTANT, paddingImage);
if (ret != APP_ERR_OK) {
return 0;
}
}
//去初始化
MxDeInit();

父主题: 通过接口进行图像处理(Image)

抠图缩放

功能介绍

对输入的图像进行抠图并缩放操作,输出到Image对象中。

接口调用流程

使用抠图缩放接口前,用户需准备好被抠图缩放的图片对象。

图1 图像处理(抠图缩放)接口调用流程

关键步骤说明如下:

  1. 调用MxInit()接口进行全局初始化。

  2. ImageProcessor初始化。

    用户构造ImageProcessor对象,之后可以调用InitVpcChannel()初始化通道,若不调用该接口,ImageProcessor会在执行抠图缩放前自动进行通道初始化。

  3. 使用图片解码接口对输入图片进行解码。

    根据业务对图片进行解码,生成可抠图缩放的Image对象。后续可以通过图片处理接口对图片进行处理,生成最终需要抠图缩放的Image对象。

  4. 构造抠图缩放参数和输出Image。

    根据业务要求,选择单输入多抠图单缩放、单输入多抠图多缩放或多输入多抠图多缩放的方式,构造对应的输入的Rect、Size和输出的Image。

  5. 调用CropResize()接口对输入图片进行抠图缩放。

    1. 同步执行。
      1. 不创建Stream,将输入图片及其他参数传入接口,获取抠图缩放结果。
    2. 异步执行。
      1. 创建Stream,具体请参见异步调用
      2. 将输入图片、已创建的Stream及其他参数传入接口,获取抠图缩放结果。
  6. 调用MxDeInit()接口对初始化的全局资源进行去初始化。

示例代码

以下为功能特性关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。

//初始化
MxInit();
{
//构造图像处理类
ImageProcessor imageProcessor(deviceId);

//图像解码生成Image
//解码后的图像类
Image decodedImage;

//根据图像路径进行解码
APP_ERROR ret = imageProcessor.Decode(imagePath, decodedImage);
if (ret != APP_ERR_OK) {
return 0;
}

//(可选)初始化图像处理通道
imageProcessor.InitVpcChannel();

//执行抠图缩放
//抠图缩放操作后图像类
std::vector<Image> cropResizedImageVec(1);

//抠图尺寸
Rect rect(0, 0, 240, 240);
std::vector<Rect> cropConfigVec = &#123;rect&#125;;

//缩放尺寸
Size size(416, 416);

//抠图缩放操作
ret = imageProcessor.CropResize(decodedImage, cropConfigVec, size, cropResizedImageVec);
if (ret != APP_ERR_OK) &#123;
return 0;
&#125;
&#125;
//去初始化
MxDeInit();

父主题: 通过接口进行图像处理(Image)

抠图贴图

功能介绍

对输入的图像进行抠图并粘贴到背景图片中的操作,输出到Image对象中。

接口调用流程

使用抠图贴图接口前,用户需准备好被抠图以及被粘贴的图片对象。

图1 图像处理(抠图贴图)接口调用流程

关键步骤说明如下:

  1. 调用MxInit()接口进行全局初始化。

  2. ImageProcessor初始化。

    用户构造ImageProcessor对象,之后可以调用InitVpcChannel()初始化通道,若不调用该接口,ImageProcessor会在执行抠图并贴图前自动进行通道初始化。

  3. 使用图片解码接口对输入图片进行解码。

    根据业务对图片进行解码,生成可抠图贴图的Image对象。后续可以通过图像处理接口对图片进行处理,生成最终需要抠图贴图的Image对象。

  4. 构造抠图贴图参数和输出Image。

    1. 根据业务要求,设置被抠图片的矩阵并设置粘贴图片位置的矩阵,二者大小不一样时将自动进行缩放。
    2. 构造输出图片的背景图片,使用预申请内存的Image()构造函数构造被粘贴图片或其他非空图片作为输出。
  5. 调用CropAndPaste()对输入图片进行抠图并将图片粘贴至指定位置。

    1. 同步执行。
      1. 不创建Stream,将输入图片及其他参数传入接口,获取抠图贴图结果。
    2. 异步执行。
      1. 创建Stream,具体请参见异步调用
      2. 将输入图片、已创建的Stream及其他参数传入接口,获取抠图贴图结果。
    3. 调用MxDeInit()接口对初始化的全局资源进行去初始化。

示例代码

以下为功能特性关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。

//初始化
MxInit();
&#123;
//构造图像处理类
ImageProcessor imageProcessor(deviceId);

//图像解码生成Image
//解码后的图像类
Image decodedImage;

//根据图像路径进行解码
APP_ERROR ret = imageProcessor.Decode(imagePath, decodedImage);
if (ret != APP_ERR_OK) &#123;
return 0;
&#125;

//(可选)初始化图像处理通道
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) &#123;
return 0;
&#125;
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 = &#123;rectFrom, rectTo&#125;;

//抠图贴图操作
ret = imageProcessor.CropAndPaste(resizeImage, cropPasteRect, pastedImage) ;
if (ret != APP_ERR_OK) &#123;
return 0;
&#125;
&#125;
//去初始化
MxDeInit();

父主题: 通过接口进行图像处理(Image)

视频编码

功能介绍

通过构造VideoEncoder类实例可实现视频编码功能,编码功能配置项及各项约束与支持情况请参考VideoEncodeConfig数据结构说明。

视频编码支持自定义输出数据格式,通过自定义回调函数传入编码功能配置项,方便用户使用编码后的数据,详情可参考VideoEncodeCallBack

接口调用流程

首先根据需求定义需要的输出数据组合方式,根据组合方式参考VideoEncodeCallBack定义回调函数传入编码功能配置项,然后实例化VideoEncoder类,最后调用Encode成员函数完成编码,获取数据。

视频编码接口调用流程参考如下:

图1 视频编码接口调用流程

mxVision提供VideoEncoder类进行视频编码,关键步骤说明如下:

  1. 调用MxInit()接口进行全局初始化。

  2. 定义输出数据组合形式。

    • 输出数据包含视频帧编码后得到的的Image类数据、当前编码帧的“frameId”和通道“channelId”。
    • 根据需要选择获取以上哪些数据。
  3. 定义输出回调函数。

    • 根据要获取的数据定义回调函数,在函数内组装自定义数据。

    • 回调函数输入参数固定为VideoEncodeCallBack形式,函数内可选择输出。

      请勿在回调函数内实现过于复杂的操作,建议使用自定义“userData”来接收视频编码回调结果,否则回调线程会发生卡住的现象,导致视频编码速度变慢。

  4. 构造视频编码配置项。

    配置项及各项约束与支持情况请参考VideoEncodeConfig数据结构说明。

  5. 实例化视频编码类。

    将配置好的VideoEncodeConfig传入构造函数接口,实例化视频编码类。

  6. 调用MxDeInit()接口对初始化的全局资源进行去初始化。

示例代码

如下提供关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。

// 初始化
MxBase::MxInit();
&#123;
// 定义要接收的编码数据
struct FrameImage &#123;
Image image; // Video Image Class
uint32_t frameId = 0; // Video Frame Index
uint32_t channelId = 0; // Video Channel Index
&#125;;

// 定义获取编码数据到自定义结构的回调函数
APP_ERROR CallBackVenc(std::shared_ptr<uint8_t>& outDataPtr, uint32_t& outDataSize, uint32_t& channelId,
uint32_t& frameId, void* userData)
&#123;
Image image(outDataPtr, outDataSize, -1, Size(1920, 1080));
FrameImage* encodedVec = static_cast<FrameImage*>(userData);
FrameImage frameImage;
encodedVec.image = image;
encodedVec.channelId = channelId;
encodedVec.frameId = frameId;
return APP_ERR_OK;
&#125;
// 构造编码配置项
VideoEncodeConfig vEncodeConfig;
VideoEncodeCallBack cPtr2 = CallBackVenc;
vEncodeConfig.callbackFunc = cPtr2;
vEncodeConfig.width = 1920;
vEncodeConfig.height = 1080;
vEncodeConfig.keyFrameInterval = 1;
vEncodeConfig.srcRate = 30;
vEncodeConfig.rcMode = 1;
vEncodeConfig.maxBitRate = 30000;
vEncodeConfig.ipProp = 70;
// 实例化编码类
VideoEncoder videoEncoder(vEncodeConfig, deviceId);
// 执行编码操作
FrameImage encodedFrame;

for (size_t i = 0; i < inputFrameList.size(); i++) &#123;
ret = videoEncoder.Encode(image, frameId, &encodedFrame);
&#125;
&#125;
// 去初始化
MxBase::MxDeInit();

父主题: 媒体数据处理

视频解码

功能介绍

通过构造VideoDecoder类实例可实现视频解码功能,解码功能配置项及各项约束与支持情况请参考VideoDecodeConfig数据结构说明。

视频解码支持自定义输出数据格式,通过自定义回调函数传入解码功能配置项,方便用户解码后的数据,详情可参考VideoDecodeCallBack数据结构说明。

接口调用流程

首先根据需求定义需要的输出数据组合方式,根据组合方式参考VideoDecodeCallBack定义回调函数传入解码功能配置项,然后实例化VideoDecoder类,最后调用Decode成员函数完成解码,获取数据。

视频解码接口调用流程参考如下:

图1 视频解码接口调用流程

mxVision提供VideoDecoder类进行视频解码,关键步骤说明如下:

  1. 调用MxInit()接口进行全局初始化。

  2. 定义输出数据组合形式。

    • 输出数据包含视频帧解码后得到的的Image类数据、当前解码帧的“frameId”和通道“channelId”。
    • 可根据需要选择获取以上哪些数据。
  3. 定义输出回调函数。

    • 根据要获取的数据定义回调函数,在函数内组装自定义数据。
    • 回调函数输入参数固定为VideoDecodeCallBack形式,函数内可选择输出。
    • 请勿在回调函数内实现过于复杂的操作,建议只进行自定义获取解码数据操作。
  4. 构造视频解码配置项。

    配置项及各项约束与支持情况请参考VideoDecodeConfig数据结构说明。

  5. 实例化视频解码类。

    将配置好的VideoDecodeConfig传入构造函数接口,实例化视频解码类。

  6. 调用解码接口。

    • 一个实例化的解码器在首次调用Decode接口时,会判断是否为预申请场景。
    • 使用预申请场景时,需要在后续调用Decode接口进行预申请输出内存,防止接口调用失败。
  7. 调用MxDeInit()接口对初始化的全局资源进行去初始化。

示例代码

如下提供关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。

// 初始化
MxBase::MxInit();
&#123;
// 定义要接收的解码数据
struct FrameImage &#123;
Image image; // Video Image Class
uint32_t frameId = 0; // Video Frame Index
uint32_t channelId = 0; // Video Channel Index
&#125;;

//定义获取解码数据到自定义结构的回调函数
APP_ERROR CallBackVdec(Image& decodedImage, uint32_t channelId, uint32_t frameId, void* userData)
&#123;
FrameImage* decodedVec = static_cast<FrameImage*>(userData);
decodedVec->image = decodedImage;
decodedVec->channelId = channelId;
decodedVec->frameId = frameId;
&#125;
// 构造解码配置项
VideoDecodeConfig config;
VideoDecodeCallBack cPtr = CallBackVdec;
config.width = 1920;
config.height = 1080;
config.callbackFunc = cPtr;
config.skipInterval = 0;
config.inputVideoFormat = StreamFormat::H264_MAIN_LEVEL;
config.outputImageFormat = ImageFormat::YUV_SP_420;
// 实例化解码类
VideoDecoder videoDecoder(config, deviceId, channelId);
// 执行解码操作
ret = videoDecoder.Decode(dataPtr, dataSize, frameId, &decodedFrame);
&#125;
// 去初始化
MxBase::MxDeInit();

父主题: 媒体数据处理

在线提单