.. _image_preprocessing_key_point: 图像预处理 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 功能约束 """"""""""""""""""""""""""""""""""""""""""""""""""""" **所有模块** 输入限制: - 图像宽高均不支持奇数的格式: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; .. note:: - 当仅有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; .. note:: - 如模块输入类型为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; - 填充颜色根据模块当前图像类型而定。 .. note:: 如模块输入类型为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。 .. note:: 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。 .. _image_preprocessing_process: 图像预处理 """"""""""""""""""""""""""""""""""""""""""""""""""""" 用户可以从LynSDK提供的示例代码中查看完整样例,在示例代码中,调用各接口后都添加了异常判断和处理,以下是关键步骤代码示例,仅供参考,不可以直接拷贝编译。 .. code-block:: c++ 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(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(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)); }