---
title: kcv_normalAndNCHW
description: "kcv_normalAndNCHW是基于用户自研接口normalAndNCHW进行优化的，主要用于归一化操作，其结果用于深度学习模型输入。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/251RC1/accel/kunpengaccel_kpcv_06_0043.html
sourcePath: /source/zh/kunpengboostkithistory/251RC1/accel/kunpengaccel_kpcv_06_0043.html
indexId: e8d6f152ad224599194644488d82a6567002507f2f0c567eaf53890b045031a277
---
# kcv_normalAndNCHW

#### 函数功能

kcv_normalAndNCHW是基于用户自研接口normalAndNCHW进行优化的，主要用于归一化操作，其结果用于深度学习模型输入。


#### 函数接口

```
int kcv_normalAndNCHW(cv::Mat &mat, float *outBuf, int mode);
int kcv_normalAndNCHW(
    cv::Mat &mat, const std::array<float, 3> &mean, const std::array<float, 3> &std, float *outBuf, int mode);
```


#### 参数

| 参数名 | 描述 | 取值范围 | 输入/输出 |
| --- | --- | --- | --- |
| mat | 输入的图像。 | 非空，浮点类型，3通道 | 输入 |
| mean | 每个通道的均值。 | 小于1的浮点数 | 输入 |
| std | 每个通道的标准差。 | 小于1的浮点数 | 输入 |
| outBuf | 输出的归一化数据。 | 非空，浮点类型 | 输出 |
| mode | 操作模式。 | 0：simple1模式，进行通道分离操作，将其保存在一个缓冲区 1：simple2模式，与simple1功能一致，但实现方式是预先分配缓冲区，性能更好 2：withMeanStd1模式，通道分析，并进行其归一化操作 3：withMeanStd2模式，与withMeanStd1功能一致，但更高效 | 输入 |


#### 返回值

- 成功：返回KP_CV_SUCCESS。
- 失败：返回错误码。


#### 错误码

| 错误码 | 描述 |
| --- | --- |
| KP\_CV\_INVALID\_PARAM | 参数“mat”存在空指针。 |
| KP\_CV\_NOT\_SUPPORT | 输入的操作模式参数“mode”不是支持的模式。 |


#### 示例

```
#include <gtest/gtest.h>
#include <opencv2/opencv.hpp>
#include <algorithm>
#include "KPCV/kcv.h"
TEST(normalAndNCHW, normal)
{
    Mat m_mat = src.clone();
    m_mat.convertTo(m_mat, CV_32F, 1.0 / 255);
    std::array<float, 3> mean = {0.25603, 0.29465, 0.3477};
    std::array<float, 3> std = {0.18766, 0.16251, 0.19558};
    int testTime = 100;
    cv::TickMeter tm;
    int img_h = m_mat.rows;
    int img_w = m_mat.cols;
    int hw = img_h * img_w;
    int pc = img_h * img_w * 3;
    std::vector<float> simple1_opencv(pc), simple2_opencv(pc),
        withMeanStd1_opencv(pc), withMeanStd2_opencv(pc);
    // simple1
    normalAndNCHW(m_mat, simple1_opencv.data(), 0);
    // simple2
    normalAndNCHW(m_mat, simple2_opencv.data(), 1);
    // withMeanStd1
    normalAndNCHW(m_mat, mean, std, withMeanStd1_opencv.data(), 2);
    // withMeanStd2
    normalAndNCHW(m_mat, mean, std, withMeanStd2_opencv.data(), 3);
}
```
