kcv_normalAndNCHW

函数功能

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

函数接口

1
2
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的浮点数

输入

mode

操作模式。

  • 0:simple1模式,进行通道分离操作,将其保存在一个缓冲区。
  • 1:simple2模式,与simple1功能一致,但实现方式是预先分配缓冲区,性能更好。
  • 2:withMeanStd1模式,通道分析,并进行其归一化操作。
  • 3:withMeanStd2模式,与withMeanStd1功能一致,但更高效。

输入

示例

 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
#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);
}