Opencv默认读取的图像格式是BGR,顺序为HWC。但是做深度学习推理的时候往往需要RGB,CHW的格式,因此需要转换。
一、BGR转RGB
将其封装成一个函数,读取出来的就是RGB格式:
// 加载图像并转为RGB
cv::Mat load_image(const std::string& filepath) {
cv::Mat img = cv::imread(filepath, cv::IMREAD_COLOR);
if (img.empty()) {
throw std::runtime_error("无法加载图像: " + filepath);
}
cv::cvtColor(img, img, cv::COLOR_BGR2RGB); // 转换为RGB格式
return img;
}
// 调用load_image
cv::Mat img = load_image(image_path);
二、HWC转为CHW
我在网上找了许久Opencv将HWC转为CHW的代码,但是发现无一可用,后来去onnxruntime官方下面查看推理例程发现了转换的代码,非常简单(这里包含了我的一些数据预处理,可忽略):
#include <opencv2/dnn.hpp>
#include <opencv2/opencv.hpp>
// 加载图像
cv::Mat img = load_image(image_path);
// 获取图像hwc
int h = img.rows;
int w = img.cols;
int c = img.channels();
// 将其数据转成float格式
cv::Mat img_float;
img.convertTo(img_float, CV_32F);
// 归一化图像数据到 [0, 1] 范围
img_float /= 255.0f;
// HWC to CHW
cv::Mat image_chw;
cv::dnn::blobFromImage(img_float, image_chw);
通过调用cv::dnn::blobFromImage函数即可。这里转换成CHW格式之后是无法通过image_chw.rows和image_chw.cols获取图像的h和w,因此在转换成CHW格式之前先将h和w读取出来后续使用。