cv.md 9.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
# CV 图像预处理API接口介绍

请把编译脚本`Paddle-Lite/lite/too/build.sh``BUILD_CV`变量设置为`ON`, 其他编译参数设置请参考[源码编译](../source_compile), 以确保 Lite 可以正确编译。这样`CV`图像的加速库就会编译进去,且会生成`paddle_image_preprocess.h`的API文件

- 硬件平台: `ARM`
- 操作系统:`MAC``LINUX`

## CV 图像预处理功能

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

### CV 枚举变量和结构体变量

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

### ImagePreprocess 类的成员变量

`ImagePreprocess` 类含有以下三个私有成员变量,通过构造函数进行初始化。
```cpp
private:
  ImageFormat srcFormat_; // input image color format
  ImageFormat dstFormat_; // output image color format
  TransParam transParam_; // image transform parameter

// init
ImagePreprocess::ImagePreprocess(ImageFormat srcFormat, ImageFormat dstFormat, TransParam param) {
  this->srcFormat_ = srcFormat;
  this->dstFormat_ = dstFormat;
  this->transParam_ = param;
}
```

### 颜色空间转换 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接口
    ```cpp
    // 方法一
    void ImagePreprocess::imageCovert(const uint8_t* src, uint8_t* dst);
    // 方法二
    void ImagePreprocess::imageCovert(const uint8_t* src,
    uint8_t* dst, ImageFormat srcFormat, ImageFormat dstFormat);
    ```

    + 第一个 `imageCovert` 接口,缺省参数来源于 `ImagePreprocess` 类的成员变量。故在初始化 `ImagePreprocess` 类的对象时,必须要给以下成员变量赋值:
        - param srcFormat:`ImagePreprocess` 类的成员变量`srcFormat_`
        - param dstFormat:`ImagePreprocess` 类的成员变量`dstFormat_`
    
    - 第二个`imageCovert` 接口,可以直接使用

### 缩放 Resize

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

+ `Resize` 功能的API接口
    ```cpp
    // 方法一
    void ImagePreprocess::imageResize(const uint8_t* src, uint8_t* dst);
    // 方法二
    void ImagePreprocess::imageResize(const uint8_t* src, uint8_t* dst, ImageFormat srcFormat, ImageFormat srcFormat, int srcw, int srch, int dstw, int dsth);
    ```

    + 第一个`imageResize` 接口,缺省参数来源于`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`
    
    - 第二个`imageResize` 接口,可以直接使用

### 旋转 Rotate

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

+ `Rotate` 功能的API接口
    ```cpp
    // 方法一
    void ImagePreprocess::imageRotate(const uint8_t* src, uint8_t* dst);
    // 方法二
    void ImagePreprocess::imageRotate(const uint8_t* src, uint8_t* dst, ImageFormat srcFormat, ImageFormat srcFormat, int srcw, int srch, float degree);
    ```

    + 第一个`imageRotate` 接口,缺省参数来源于`ImagePreprocess` 类的成员变量。故在初始化`ImagePreprocess` 类的对象时,必须要给以下成员变量赋值:
        - param srcFormat:`ImagePreprocess` 类的成员变量`dstFormat_`
        - param srcw:`ImagePreprocess` 类的成员变量`transParam_.ow`
        - param srch:`ImagePreprocess` 类的成员变量`transParam_.oh`
        - param degree:`ImagePreprocess` 类的成员变量`transParam_.rotate_param`
    
    - 第二个`imageRotate` 接口,可以直接使用

### 翻转 Flip

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

+ `Flip` 功能的API接口
    ```cpp
    // 方法一
    void ImagePreprocess::imageFlip(const uint8_t* src, uint8_t* dst);
    // 方法二
    void ImagePreprocess::imageFlip(const uint8_t* src, uint8_t* dst, ImageFormat srcFormat, ImageFormat srcFormat, int srcw, int srch, FlipParam flip_param);
    ```

    + 第一个`imageFlip` 接口,缺省参数来源于`ImagePreprocess` 类的成员变量。故在初始化`ImagePreprocess` 类的对象时,必须要给以下成员变量赋值:
        - param srcFormat:`ImagePreprocess` 类的成员变量`dstFormat_`
        - param srcw:`ImagePreprocess` 类的成员变量`transParam_.ow`
        - param srch:`ImagePreprocess` 类的成员变量`transParam_.oh`
        - param flip_param:`ImagePreprocess` 类的成员变量`transParam_.flip_param`
    
    - 第二个`imageFlip` 接口,可以直接使用

### Image2Tensor

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

+ `Image2Tensor` 功能的API接口
    ```cpp
    // 方法一
    void ImagePreprocess::image2Tensor(const uint8_t* src, Tensor* dstTensor, LayoutType layout, float* means, float* scales);
    // 方法二
    void ImagePreprocess::image2Tensor(const uint8_t* src, Tensor* dstTensor, ImageFormat srcFormat,  srcw, int srch, LayoutType layout, float* means, float* scales;
    ```

    + 第一个`image2Tensor` 接口,缺省参数来源于`ImagePreprocess` 类的成员变量。故在初始化`ImagePreprocess` 类的对象时,必须要给以下成员变量赋值:
        - param srcFormat:`ImagePreprocess` 类的成员变量`dstFormat_`
        - param srcw:`ImagePreprocess` 类的成员变量`transParam_.ow`
        - param srch:`ImagePreprocess` 类的成员变量`transParam_.oh`
    
    - 第二个`image2Tensor` 接口,可以直接使用



## CV 图像预处理 Demo 示例

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

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

```cpp
// init
srcFormat = ImageFormat::NV12;
dstFormat = ImageFormat::RGB;
srch = 1920;
srcw = 1080;
dsth = 960;
dstw = 540;
flip_param = FlipParam::X;
degree = 90;
layout = LayoutType::NHWC
// 方法一: 
TransParam tparam;
tparam.ih = srch;
tparam.iw = srcw;
tparam.oh = dsth;
tparam.ow = dstw;
tparam.flip_param = flip_param;
tparam.rotate_param = degree;
ImagePreprocess image_preprocess(srcFormat, dstFormat, tparam);
// 方法二: 
ImagePreprocess image_preprocess();
```

### imageConvert Demo

```cpp
// 方法一: 
image_preprocess.imageCovert(src, lite_dst);
// 方法二: 
image_preprocess.imageCovert(src, lite_dst, (ImageFormat)srcFormat, (ImageFormat)dstFormat);
```

### imageResize Demo

```cpp
// 方法一: 
image_preprocess.imageResize(lite_dst, resize_tmp);
// 方法二: 
image_preprocess.imageResize(lite_dst,resize_tmp, (ImageFormat)dstFormat, srcw,
srch, dstw, dsth);
```

### imageRotate Demo

```cpp
// 方法一: 
image_preprocess.imageRotate(resize_tmp, tv_out_ratote);
// 方法二: 
image_preprocess.imageRotate(resize_tmp,tv_out_ratote, (ImageFormat)dstFormat, dstw, dsth, degree);
```

### imageFlip Demo

```cpp
// 方法一: 
image_preprocess.imageFlip(tv_out_ratote, tv_out_flip);
// 方法二: 
image_preprocess.imageFlip(tv_out_ratote, tv_out_flip, (ImageFormat)dstFormat dstw, dsth, flip_param);
```

### image2Tensor Demo

```cpp
// 方法一: 
image_preprocess.image2Tensor(tv_out_flip, &dst_tensor, layout, means, scales);
// 方法二: 
image_preprocess.image2Tensor(tv_out_flip, &dst_tensor,(ImageFormat)dstFormat, dstw, dsth, layout, means, scales);
```