图像预处理

功能约束

所有模块

输入限制:

  • 图像宽高均不支持奇数的格式:NV12、NV21、NV12(10bit)、NV21(10bit);

  • 图像宽不支持奇数的格式:YUYV、UYVY、NV16、NV61。

输出限制:

  • 图像宽高均不支持奇数的格式:NV12、NV21、NV12(10bit)

  • 图像宽不支持奇数的格式:YUYV、UYVY、NV16、NV61。


Crop

输入限制:

  • 支持的格式:NV12、NV21、NV12(10bit)、NV21(10bit)、RGB、BGR、YUV400、Gray、YUYV、UYVY、NV16、NV61、NV24、NV42;

  • 当图像格式为NV12、NV21、NV12(10bit)、NV21(10bit)、YUV400支持最大分辨率:3840×2160,其他情况下的输入最大分辨率:1920×1080;

  • 最小分辨率:8×8;

  • 起始点X/Y不支持越界;

  • 起始点X/Y均不支持奇数的格式:NV12、NV21、NV12(10bit)、NV21(10bit);

  • 起始点X不支持奇数的格式:YUYV、UYVY、NV16、NV61。

输出限制:

  • 支持的格式:NV12、RGB、BGR、YUV400、Gray、HSV、LAB;

  • 当输出格式为NV12或者YUV400,且处理模块只有crop时,最大分辨率支持到3840×2160,其他情况下的最大分辨率:1920×1080;

备注

  • 当仅有Crop处理,输出宽度大于1920或者高度大于1080时,宽度需要为32的倍数,当宽度小于1920,高度小于1080,输出为NV12或者YUV400时,建议宽度为32的倍数,否则会有性能损失。

  • Crop输出宽度大于1920或者高度大于1080时,不支持和其他图像处理操作(Resize、Flip、Mirror、C2C和Pad等8种)同时使能,只能处理Crop操作。

  • 最小分辨率:8×8;

  • Crop宽高应小于原图尺寸,不支持越界裁剪。


Flip

输入限制:

  • 支持的格式:NV12、NV21、NV12(10bit)、NV21(10bit)、RGB、BGR、YUV400、Gray、YUYV、UYVY、NV16、NV61、NV24、NV42;

  • 最大分辨率:1920×1080;

  • 最小分辨率:8×8。

输出限制:

  • 支持的格式:NV12、RGB、BGR、YUV400、Gray、HSV、LAB;

  • 最大分辨率:1920×1080;

  • 最小分辨率:8×8。


Resize

输入限制:

  • 支持的格式:NV12、NV21、NV12(10bit)、NV21(10bit)、RGB、BGR、YUV400、Gray、YUYV、UYVY、NV16、NV61、NV24、NV42;

  • 其中当resize作为第一个处理操作时,图像格式NV12、NV21、NV12(10bit)、NV21(10bit)、YUV400支持最大分辨率:3840×2160;其他情况的输入最大分辨率:1920×1080。

  • 最小分辨率:8×8。

输出限制:

  • 支持的格式:NV12、RGB、BGR、YUV400、Gray、HSV、LAB;

  • 最大分辨率:1920×1080;

  • 最小分辨率:8×8。


C2C

输入限制:

  • 支持的格式:NV12、NV21、NV12(10bit)、NV21(10bit)、RGB、BGR、YUV400、Gray、YUYV、UYVY、NV16、NV61、NV24、NV42;

  • 最大分辨率:1920×1080;

  • 最小分辨率:8×8。

输出限制:

  • 支持的格式:NV12、RGB、BGR、YUV400、Gray、HSV、LAB;

  • 最大分辨率:1920×1080;

  • 最小分辨率:8×8;

备注

  • 如模块输入类型为YUV400,仅支持转换为Gray;如模块输入类型为Gray,仅支持转换为RGB、BGR。

  • 通路2和通路3不支持输出HSV和LAB。


Pad

输入限制:

  • 支持的格式:NV12、NV21、NV12(10bit)、NV21(10bit)、RGB、BGR、YUV400、Gray、YUYV、UYVY、NV16、NV61、NV24、NV42;

  • 最大分辨率:1920×1080;

  • 最小分辨率:8×8;

  • 填充颜色根据模块当前图像类型而定。

备注

如模块输入类型为YUV400或Gray,填充颜色x/y/z三值必须相等。

输出限制:

  • 支持的格式:NV12、RGB、BGR、YUV400、Gray、HSV、LAB;

  • 输入图像格式为NV21、NV12(10bit)、NV21(10bit)、NV24、NV42、NV61、NV16、YUYV、UYVY时默认输出NV12;

  • 最大分辨率:1920×1080;

  • 最小分辨率:8×8;

  • 请保证Pad上下左右填充后图像尺寸符合输出限制;

  • Pad上下左右均不支持奇数的格式:NV12、NV21。


Mirror

输入限制:

  • 支持的格式:NV12、NV21、NV12(10bit)、NV21(10bit)、RGB、BGR、YUV400、Gray、YUYV、UYVY、NV16、NV61、NV24、NV42;

  • 最大分辨率:1920×1080;

  • 最小分辨率:8×8。

输出限制:

  • 支持的格式:NV12、RGB、BGR、YUV400、Gray、HSV、LAB;

  • 输入图像格式为NV21、NV12(10bit)、NV21(10bit)、NV24、NV42、NV61、NV16、YUYV、UYVY时默认输出NV12;

  • 最大分辨率:1920×1080;

  • 最小分辨率:8×8。


Rotate

输入限制:

  • 支持的格式:NV12、NV21、NV12(10bit)、NV21(10bit)、RGB、BGR、YUV400、Gray、YUYV、UYVY、NV16、NV61、NV24、NV42;

  • 最大分辨率:1920×1080;

  • 最小分辨率:8×8。

输出限制:

  • 支持的格式:NV12、NV21、RGB、BGR、YUV400、Gray、NV16、NV61、NV24、NV42;其中:
    • 输入NV12(10bit)输出NV12;

    • 输入NV21(10bit)输出NV21;

    • 输入YUYV输出NV16;

    • 输入UYVY输出NV61。

  • 最大分辨率:1920×1080;

  • 最小分辨率:8×8。

备注

rotate不支持指定输出格式,除特殊说明外,输出格式等于输入格式。


Affine

输入限制:

  • 支持的格式:NV12、NV21、NV12(10bit)、NV21(10bit)、RGB、BGR、YUV400、Gray、YUYV、UYVY、NV16、NV61、NV24、NV42;

  • 最大分辨率:1920×1080;

  • 最小分辨率:8×8。

输出限制:

  • 输入图像格式为NV21、NV12(10bit)、NV21(10bit)、NV24、NV42、NV61、NV16、YUYV、UYVY时输出NV12;其他情况下输出图像格式等于输入图像格式。

  • 最大分辨率:1920×1080;

  • 最小分辨率:8×8。


拼接

输入限制:

  • 支持的格式:NV12、NV21、NV12(10bit)、NV21(10bit)、RGB、BGR、YUV400、YUYV、UYVY、NV16、NV61、NV24、NV42;

  • 最大分辨率:1920×1080;

  • 最小分辨率:8×8;

  • 输入图像ROI指定位于输出图像RECT不支持越界。

输出限制:

  • 支持输出格式:NV12和YUV400;

  • 最大分辨率:3840×2160;

  • 最小分辨率:8×8。

图像预处理

用户可以从LynSDK提供的示例代码中查看完整样例,在示例代码中,调用各接口后都添加了异常判断和处理,以下是关键步骤代码示例,仅供参考,不可以直接拷贝编译。

const string sequence = "cr2"; // c:crop, r:resize, 2:c2c
lynError_t RunIPE()
{
    RET_ERR(lynIpeCreatePicDesc(&input));
    RET_ERR(lynIpeCreatePicDesc(&output));
    RET_ERR(lynIpeCreateConfigDesc(&config));

    RET_ERR(lynIpeResetPicDesc(input));
    RET_ERR(lynIpeResetPicDesc(output));
    RET_ERR(lynIpeResetConfigDesc(config));

    inWidth = stoi(cfgParams.at("input_width"));
    inHeight = stoi(cfgParams.at("input_height"));
    inFormat = static_cast<lynPixelFormat_t>(stoi(cfgParams.at("input_format")));

    RET_ERR(calPicSize(inSize, inWidth, inHeight, inFormat));
    RET_ERR(lynMalloc(&inData, inSize));
    RET_ERR(readFile(inData, inSize, gBasePath + cfgParams["input_path"]));

    RET_ERR(lynIpeSetInputPicDesc(input, inData, inWidth, inHeight, inFormat));

    for (auto t : sequence)
    {
        switch (t)
        {
        case 'c':
            lynIpeSetCropConfig(config, stoi(cfgParams.at("crop_x")), stoi(cfgParams.at("crop_y")), stoi(cfgParams.at("crop_width")), stoi(cfgParams.at("crop_height")));
            break;
        case 'f':
            lynIpeEnableFlip(config);
            break;
        case '2':
            lynIpeSetC2CConfig(config, static_cast<lynPixelFormat_t>(stoi(cfgParams.at("c2c_format"))), stoi(cfgParams.at("c2c_standard")));
            break;
        case 'r':
            lynIpeSetResizeConfig(config, stoi(cfgParams.at("resize_width")), stoi(cfgParams.at("resize_height")));
            break;
        case 'p':
            lynIpeSetPadConfig(config, stoi(cfgParams.at("pad_top")), stoi(cfgParams.at("pad_right")), stoi(cfgParams.at("pad_bottom")), stoi(cfgParams.at("pad_left")), stoi(cfgParams.at("pad_color_x")), stoi(cfgParams.at("pad_color_y")), stoi(cfgParams.at("pad_color_z")));
            break;
        case 'm':
            lynIpeEnableMirror(config);
            break;
        case 't':
            lynIpeSetRotateConfig(config, stof(cfgParams.at("rotate_angle")), stoi(cfgParams.at("rotate_mode")), stoi(cfgParams.at("pad_color_x")), stoi(cfgParams.at("pad_color_y")), stoi(cfgParams.at("pad_color_z")));
            break;
        default:
            LOG(ERROR) << "test.cfg error";
            return lynEIPEPROCESS;
        }
    }

    RET_ERR(lynIpeCalOutputPicDesc(output, input, config, stoi(cfgParams.at("passage_id"))));

    RET_ERR(lynIpeGetPicDesc(output, nullptr, &outWidth, &outHeight, &outFormat));
    LOG(DEBUG) << "output info: " << outWidth << "-" << outHeight << "-" << (int)outFormat;

    RET_ERR(calPicSize(outSize, outWidth, outHeight, outFormat));
    RET_ERR(lynMalloc(&outData, outSize));
    RET_ERR(lynIpeSetOutputPicData(output, outData));

    RET_ERR(lynIpeProcessAsync(stream, input, output, config));
}