Skip to main content

开发流程

开发流程

关键步骤说明

  1. 使用mxVision接口进行应用开发,需首先进行初始化才能进行后续处理,在整体应用流程完成后还需进行去初始化,否则可能会导致后续系统内部资源初始化出错,进而导致其它业务异常,具体请参见初始化与去初始化
  2. 媒体数据处理/模型推理。
    1. 媒体数据处理功能,可实现图像编解码、抠图、缩放、补边、色域转换等操作,具体请参见媒体数据处理
    2. 模型推理,可实现如目标识别,图像分类等应用,环节可参考以下几个步骤,具体请参见模型推理
      1. 模型推理前,需准备合适的om模型。
      2. 模型加载,将准备好的模型通过文件或内存方式加载到系统中,具体请参见模型推理
      3. (可选)媒体数据处理,模型推理前,可对输入的媒体数据进行处理,如图片解码、抠图、缩放、补边等操作。
      4. 模型执行,使用模型实现图片分类、目标识别等功能。
      5. (可选)模型后处理,对模型推理输出的数据进行后处理操作,此处根据用户的实际需求来处理推理结果,如整理为可理解阅读的具体结果。模型后处理支持通过三种方式进行:
        • (推荐)自行选择模型后处理方式。
        • 通过调用mxVision接口进行,具体操作请参见模型后处理
        • 在已有模型的基础上进行二次开发,具体请参见模型后处理开发
  3. 调用MxDeInit()接口进行去初始化,具体请参见初始化与去初始化

父主题: 使用API接口方式开发(C++)

初始化与去初始化

功能介绍

  • mxVision应用开发初始化接口,在代码调用相关接口之前,需调用全局初始化函数MxInit()申请设备资源和日志资源。
  • 如需配置全局变量(如调整VPC通道资源池数量),可调用MxInit(const AppGlobalCfg &globalCfg)接口,通过传入配置参数进行调整。

mxVision接口全部执行完毕后,用户需调用MxDeInit()接口对初始化的全局资源进行去初始化操作。

示例代码

以下为各初始化方法的代码示例,不可以直接拷贝编译运行,仅供参考。

  • 全局初始化,加载设备资源和日志资源。

    APP_ERROR ret = MxInit();
    // 执行全局初始化后即可正常调用mxVision接口
    ...
    // mxVision接口全部执行完毕后,调用去初始化接口释放全局资源
    ret = MxDeInit();
  • 全局初始化,加载全局变量。

    MxBase::AppGlobalCfg globalCfg;
    globalCfg.vpcChnNum = 48;
    APP_ERROR ret = MxInit(globalCfg);
    ...
    // mxVision接口全部执行完毕后,调用去初始化接口释放全局资源
    ret = MxDeInit();

父主题: 使用API接口方式开发(C++)

图片解码

功能介绍

通过对输入图片数据进行解码处理,将本地图片或图片数据转换为Image类,用于后续前处理和推理业务,类型目前支持JPEG和PNG格式。

接口调用流程

用户需准备好本地待解码的图片文件或待解码的图片数据,初始化ImageProcessor类,构造输出的Image对象,通过调用ImageProcessor类的Decode接口解码结果。

图片解码调用流程参考如下:

图1 图片解码接口调用流程

关键步骤说明如下:

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

  2. ImageProcessor构造及初始化。

    用户构造ImageProcessor对象,在构造完成后可以调用InitJpegDecodeChannel()初始化通道,若不选择调用该接口,ImageProcessor将会在执行解码前自动进行通道初始化。

  3. 构造输出的Image对象。

    使用构造函数Image()存放待解码输出的图片对象。

  4. 准备数据。

    根据业务需求选择从文件加载图片从内存加载图片数据

  5. 调用Decode()接口对图片进行解码。

    用户需根据输如的不同数据类型,调用对应的Decode接口。

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

示例代码

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

//初始化
MxInit();
{
//构造图像处理类
ImageProcessor imageProcessor(deviceId);
//(可选)初始化解码通道
imageProcessor.InitJpegDecodeChannel();
//图像解码
//解码后的图像类
Image decodedImage;
//根据图像路径进行解码
APP_ERROR ret = imageProcessor.Decode(imagePath, decodedImage, ImageFormat::YUV_SP_420);
if (ret != APP_ERR_OK) {
return 0;
}
}
//去初始化
MxDeInit();

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

图片编码

功能介绍

将接口输出的Image对象编码为JPG格式的图片内存或保存到指定的图片路径。

接口调用流程

用户需提前准备好待编码的Image对象,可以通过图片解码以及图像处理接口(抠图、缩放、补边等操作对应接口)输出,输出到本地图片或者内存中。

图片编码调用流程参考如下:

图1 图片编码接口调用流程

关键步骤说明如下:

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

  2. ImageProcessor构造及初始化。

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

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

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

  4. 调用Encode()接口对输入图片进行编码。

    用户需根据实际业务情况输出图片数据,选择输出到文件输出到内存

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

示例代码

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

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

//图像解码/图像处理操作生成Image
//解码后的图像类
Image decodedImage;
//根据图像路径进行解码
APP_ERROR ret = imageProcessor.Decode(imagePath, decodedImage);
if (ret != APP_ERR_OK) {
return 0;
}
//图像处理操作后图像类
Image resizedImage;
//图像处理操作(缩放)
ret = imageProcessor.Resize(decodedImage, Size(416, 416), resizedImage, Interpolation::HUAWEI_HIGH_ORDER_FILTER);
if (ret != APP_ERR_OK) {
return 0;
}

//(可选)初始化编码通道JpegEncodeChnConfig jpegEncodeChnConfig;
JpegEncodeChnConfig.maxPicWidth = 4096;
JpegEncodeChnConfig.maxPicHeight = 4096;
imageProcessor.InitJpegEncodeChannel(JpegEncodeChnConfig);

//图像编码
ret = imageProcessor.Encode(resizedImage,"encode.jpg");
if (ret != APP_ERR_OK) {
return 0;
}
}
//去初始化
MxDeInit();

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

抠图

功能介绍

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

接口调用流程

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

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

关键步骤说明如下:

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

  2. ImageProcessor初始化。

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

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

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

  4. 构造抠图Rect以及输出Image。

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

  5. 选择执行方式进行抠图,请根据实际业务选择同步抠图方式或异步抠图方式。

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

示例代码

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

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

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

//图像解码操作生成Image
//解码后的图像类
Image decodedImage;
//根据图像路径进行解码
APP_ERROR ret = imageProcessor.Decode(imagePath, decodedImage);
if (ret != APP_ERR_OK) {
return 0;
}

//执行Crop
//抠图图像类
Image cropImage;
//抠图坐标信息
Rect cropRect {0, 0, 640, 512};
//抠图操作
ret = imageProcessor.Crop(decodeImage, cropRect, cropImage);
if (ret != APP_ERR_OK) {
return 0;
}
}
//去初始化
MxDeInit();

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

在线提单