在 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
我有一个 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