在 C++ 中用 opencv 规范化图像?

normalize image with opencv in c++?

我有一个 TfLite 模型,它采用标准化的 float32 图像作为输入,像素范围应该从 [0~255] 转换为 [-1~1] 我写了一个演示函数,但它没有用.我无法将颜色值设置回图像; 如何将颜色设置回“des”图像?还有更好的方法吗?

这是我的演示代码

#include <cstdint>
#include <vector>
#include <iostream>

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/dnn.hpp>

void standardize(cv::Mat &src, cv::Mat &des)
{
    cv::Vec3b  src_color,des_color;
    for(int i = 0; i < src.rows; i++)
    {
        for(int j = 0; j < src.cols; j++)
        {
            src_color =  src.at<cv::Vec3b>(cv::Point(j,i));                        
            des_color =  des.at<cv::Vec3b>(cv::Point(j,i));
            des_color[0] = ((int) src_color[0] -127.5 ) / 127.5 ;
            des_color[1] = ((int) src_color[1] -127.5 ) / 127.5 ;
            des_color[2] = ((int) src_color[2] -127.5 ) / 127.5 ;
            
            des.at<cv::Vec3b>(cv::Point(j,i)) = des_color ;
            
            std::cout <<  (int) src_color[0]   << std::endl;                          
            std::cout << ((int) src_color[0] -127.5 ) / 127.5  << std::endl;          
            std::cout << (int) des.at<cv::Vec3b>(cv::Point(j,i))[0] << std::endl; 
        }
    }
}
int main(int argc, char *argv[])
{
    cv::Mat src, des;
    // src ---> CV_8UC3 
    src = cv::imread("/test.jpg");
    // copy to take the same size
    src.copyTo(des);
    // des ----> CV_32FC3
    src.convertTo(des, CV_32FC3);
    standardize(src,des);

    return 0;
}

请不要写for循环。相反:

src.convertTo(dst, CV_32F);
dst -= 127;
dst /= 255; // EDIT