图像预处理
功能约束
所有模块
输入限制:
图像宽高均不支持奇数的格式: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));
}