CV图像预处理API

请把编译脚本Paddle-Lite/lite/tool/build_linux.shBUILD_CV变量设置为ON, 其他编译参数设置请参考Linux源码编译, 以确保 Lite 可以正确编译。这样CV图像的加速库就会编译进去,且会生成paddle_image_preprocess.h的API文件

  • 硬件平台: ARM

  • 操作系统:MACLINUX

CV 图像预处理功能

Lite 支持不同颜色空间的图像相互转换 Convert 、缩放 Resize 、翻转 Flip、旋转 Rotate 和图像数据转换为 Tensor 存储ImageToTensor 功能,下文将详细介绍每个功能的API接口。

CV 枚举变量和结构体变量

  • 颜色空间
  1. enum ImageFormat {
  2. RGBA = 0,
  3. BGRA,
  4. RGB,
  5. BGR,
  6. GRAY,
  7. NV21 = 11,
  8. NV12,
  9. };
  • 翻转参数
  1. enum FlipParam {
  2. X = 0, // flip along the X axis
  3. Y, // flip along the Y axis
  4. XY // flip along the XY axis
  5. };
  • 转换参数
  1. typedef struct {
  2. int ih; // input height
  3. int iw; // input width
  4. int oh; // outpu theight
  5. int ow; // output width
  6. FlipParam flip_param; // flip, support x, y, xy
  7. float rotate_param; // rotate, support 90, 180, 270
  8. } TransParam;

ImagePreprocess 类的成员变量

ImagePreprocess 类含有以下三个私有成员变量,通过构造函数进行初始化。

  1. private:
  2. ImageFormat srcFormat_; // input image color format
  3. ImageFormat dstFormat_; // output image color format
  4. TransParam transParam_; // image transform parameter
  5. // init
  6. ImagePreprocess::ImagePreprocess(ImageFormat srcFormat, ImageFormat dstFormat, TransParam param) {
  7. this->srcFormat_ = srcFormat;
  8. this->dstFormat_ = dstFormat;
  9. this->transParam_ = param;
  10. }

颜色空间转换 Convert

Convert 函数支持颜色空间:GRAY、NV12(NV21)、RGB(BGR)和RGBA(BGRA)

  • 目前支持以下颜色空间的相互转换:

    • GRAY2BGR

    • GRAY2RGB

    • BGR2RGB

    • BGRA2BGR

    • BGRA2RGB

    • RGBA2RGB

    • RGBA2BGR

    • BGRA2RGBA

  • 目前支持以下颜色空间的单向转换:

    • NV12—BGR

    • NV21—BGR

    • NV12—RGB

    • NV21—RGB

    • NV12—BGRA

    • NV21—BGRA

    • NV12—RGBA

    • NV21—RGBA

  • Convert 功能的API接口

    1. // 方法一d
    2. void ImagePreprocess::image_convert(const uint8_t* src, uint8_t* dst);
    3. // 方法二
    4. void ImagePreprocess::image_convert(const uint8_t* src,
    5. uint8_t* dst, ImageFormat srcFormat, ImageFormat dstFormat);
    6. // 方法三
    7. void ImagePreprocess::image_convert(const uint8_t* src,
    8. uint8_t* dst, ImageFormat srcFormat, ImageFormat dstFormat,
    9. int srcw, int srch);
    • 第一个 image_convert 接口,缺省参数来源于 ImagePreprocess 类的成员变量。故在初始化 ImagePreprocess 类的对象时,必须要给以下成员变量赋值:

      • param srcFormat:ImagePreprocess 类的成员变量srcFormat_

      • param dstFormat:ImagePreprocess 类的成员变量dstFormat_

      • param srcw: ImagePreprocess 类的成员变量transParam_结构体中的iw变量

      • param srch: ImagePreprocess 类的成员变量transParam_结构体中的ih变量

    • 第二个image_convert 接口,缺省参数来源于 ImagePreprocess 类的成员变量。故在初始化 ImagePreprocess 类的对象时,必须要给以下成员变量赋值:

      • param srcw: ImagePreprocess 类的成员变量transParam_结构体中的iw变量

      • param srch: ImagePreprocess 类的成员变量transParam_结构体中的ih变量

    • 第二个image_convert 接口, 可以直接使用

缩放 Resize

Resize 功能支持颜色空间:GRAY、NV12(NV21)、RGB(BGR)和RGBA(BGRA) Resize 功能目前支持的方法:bilinear

  • Resize 功能的API接口

    1. // 方法一
    2. void ImagePreprocess::image_resize(const uint8_t* src, uint8_t* dst);
    3. // 方法二
    4. void ImagePreprocess::image_resize(const uint8_t* src, uint8_t* dst, ImageFormat srcFormat, ImageFormat srcFormat, int srcw, int srch, int dstw, int dsth);
    • 第一个image_resize 接口,缺省参数来源于ImagePreprocess 类的成员变量。故在初始化ImagePreprocess 类的对象时,必须要给以下成员变量赋值:

      • param srcFormat:ImagePreprocess 类的成员变量dstFormat_

      • param srcw:ImagePreprocess 类的成员变量transParam_.iw

      • param srch:ImagePreprocess 类的成员变量transParam_.ih

      • param dstw:ImagePreprocess 类的成员变量transParam_.ow

      • param dsth:ImagePreprocess 类的成员变量transParam_.ow

    • 第二个image_resize 接口,可以直接使用

旋转 Rotate

Rotate 功能支持颜色空间:GRAY、RGB(BGR)和RGBA(BGRA) Rotate 功能目前支持的角度:90、180 和 270

  • Rotate 功能的API接口

    1. // 方法一
    2. void ImagePreprocess::image_rotate(const uint8_t* src, uint8_t* dst);
    3. // 方法二
    4. void ImagePreprocess::image_rotate(const uint8_t* src, uint8_t* dst, ImageFormat srcFormat, ImageFormat srcFormat, int srcw, int srch, float degree);
    • 第一个image_rotate 接口,缺省参数来源于ImagePreprocess 类的成员变量。故在初始化ImagePreprocess 类的对象时,必须要给以下成员变量赋值:

      • param srcFormat:ImagePreprocess 类的成员变量dstFormat_

      • param srcw:ImagePreprocess 类的成员变量transParam_.ow

      • param srch:ImagePreprocess 类的成员变量transParam_.oh

      • param degree:ImagePreprocess 类的成员变量transParam_.rotate_param

    • 第二个image_rotate 接口,可以直接使用

翻转 Flip

Flip 功能支持颜色空间:GRAY、RGB(BGR)和RGBA(BGRA) Flip 功能目前支持的功能:沿X轴翻转、沿Y轴翻转和沿XY轴翻转

  • Flip 功能的API接口

    1. // 方法一
    2. void ImagePreprocess::image_flip(const uint8_t* src, uint8_t* dst);
    3. // 方法二
    4. void ImagePreprocess::image_flip(const uint8_t* src, uint8_t* dst, ImageFormat srcFormat, ImageFormat srcFormat, int srcw, int srch, FlipParam flip_param);
    • 第一个image_flip 接口,缺省参数来源于ImagePreprocess 类的成员变量。故在初始化ImagePreprocess 类的对象时,必须要给以下成员变量赋值:

      • param srcFormat:ImagePreprocess 类的成员变量dstFormat_

      • param srcw:ImagePreprocess 类的成员变量transParam_.ow

      • param srch:ImagePreprocess 类的成员变量transParam_.oh

      • param flip_param:ImagePreprocess 类的成员变量transParam_.flip_param

    • 第二个image_flip 接口,可以直接使用

裁剪 Crop

Crop 功能支持颜色空间:GRAY、RGB(BGR)和RGBA(BGRA)

  • Crop 功能的API接口

    1. // 方法一
    2. void ImagePreprocess::image_crop(const uint8_t* src, uint8_t* dst, ImageFormat srcFormat, ImageFormat srcFormat, int srcw, int srch, FlipParam flip_param);
    • image_crop 接口可以直接使用, 各参数含义如下:

      • param src: 输入图像数组

      • param dst 输出图像数组

      • param srcFormat:输入图像颜色格式

      • param srcw:输入图像的宽度

      • param srch:输入图像的高度

      • param left_x:裁剪坐标的X轴数值

      • param left_y:裁剪坐标的Y轴数值

      • param dstw:输出图像的宽度

      • param dsth:输出图像的高度

Image2Tensor

Image2Tensor 功能支持颜色空间:RGB(BGR)和RGBA(BGRA) Image2Tensor 功能目前支持的Layout:NCHWNHWC Image2Tensor 不仅完成图像转换为Tensor数据处理,而且还完成了图像数据的归一化处理

  • Image2Tensor 功能的API接口

    1. // 方法一
    2. void ImagePreprocess::image_to_tensor(const uint8_t* src, Tensor* dstTensor, LayoutType layout, float* means, float* scales);
    3. // 方法二
    4. void ImagePreprocess::image_to_tensor(const uint8_t* src, Tensor* dstTensor, ImageFormat srcFormat, srcw, int srch, LayoutType layout, float* means, float* scales;
    • 第一个image_to_tensor 接口,缺省参数来源于ImagePreprocess 类的成员变量。故在初始化ImagePreprocess 类的对象时,必须要给以下成员变量赋值:

      • param srcFormat:ImagePreprocess 类的成员变量dstFormat_

      • param srcw:ImagePreprocess 类的成员变量transParam_.ow

      • param srch:ImagePreprocess 类的成员变量transParam_.oh

    • 第二个image_to_tensor 接口,可以直接使用

CV 图像预处理 Demo 示例

例子:输入 1920x1080 大小的 NV12 图像src,输出 960x540 大小 RGB 格式的图像dst;然后,完成 90 度旋转和沿 X 轴翻转功能;最后,用 NHWC 格式存储在Tensor里。

定义 ImagePreprocess 类的对象,初始化成员变量

  1. // init
  2. srcFormat = ImageFormat::NV12;
  3. dstFormat = ImageFormat::RGB;
  4. srch = 1920;
  5. srcw = 1080;
  6. dsth = 960;
  7. dstw = 540;
  8. flip_param = FlipParam::X;
  9. degree = 90;
  10. layout = LayoutType::NHWC
  11. left_x = 1
  12. left_y = 1
  13. // 方法一:
  14. TransParam tparam;
  15. tparam.ih = srch;
  16. tparam.iw = srcw;
  17. tparam.oh = dsth;
  18. tparam.ow = dstw;
  19. tparam.flip_param = flip_param;
  20. tparam.rotate_param = degree;
  21. ImagePreprocess image_preprocess(srcFormat, dstFormat, tparam);
  22. // 方法二:
  23. ImagePreprocess image_preprocess();

颜色空间转换 Demo

  1. // 方法一:
  2. image_preprocess.image_convert(src, lite_dst);
  3. // 方法二:
  4. image_preprocess.image_convert(src, lite_dst, (ImageFormat)srcFormat, (ImageFormat)dstFormat);

图像缩放 Demo

  1. // 方法一:
  2. image_preprocess.image_resize(lite_dst, resize_tmp);
  3. // 方法二:
  4. image_preprocess.image_resize(lite_dst,resize_tmp, (ImageFormat)dstFormat, srcw,
  5. srch, dstw, dsth);

图像旋转 Demo

  1. // 方法一:
  2. image_preprocess.image_rotate(resize_tmp, tv_out_ratote);
  3. // 方法二:
  4. image_preprocess.image_rotate(resize_tmp,tv_out_ratote, (ImageFormat)dstFormat, dstw, dsth, degree);

图像翻转 Demo

  1. // 方法一:
  2. image_preprocess.image_flip(tv_out_ratote, tv_out_flip);
  3. // 方法二:
  4. image_preprocess.image_flip(tv_out_ratote, tv_out_flip, (ImageFormat)dstFormat dstw, dsth, flip_param);

图像裁剪 Demo

  1. // 方法一:
  2. image_preprocess.image_crop(src, dst, (ImageFormat)srcFormat srcw, srch, left_x, left_y, dstw, dsth);

图像数据转换为Tensor存储 Demo

  1. // 方法一:
  2. image_preprocess.image_to_tensor(tv_out_flip, &dst_tensor, layout, means, scales);
  3. // 方法二:
  4. image_preprocess.image_to_tensor(tv_out_flip, &dst_tensor,(ImageFormat)dstFormat, dstw, dsth, layout, means, scales);