Home > database >  Standardize image with opencv in c ?
Standardize image with opencv in c ?

Time:04-22

I have a TfLite model that takes a standardized float32 image as an input, the pixel range should convert from the [0~255] to [-1~1] I wrote a demo function but it didn't work. I couldn't set the color value back to the image; How can I set the color back to the "des" image? and Is there a better way to do that?

this is my demo code

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

CodePudding user response:

please do not write for loops. instead:

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