如何用C++实现[width,height,3]图像到[1,32,32,1]格式的转换
C++ 同等图像预处理功能实现
你可以基于OpenCV库实现该功能,逻辑和你提供的Python参考代码完全对齐。
前置依赖
- 项目中需要引入并链接OpenCV的core、imgcodecs、imgproc三个模块
实现代码
#include <opencv2/opencv.hpp> #include <vector> cv::Mat rescale(const std::string& img_path) { // 对应Python:img = cv2.imread(img_path),默认读取为BGR三通道uint8图像 cv::Mat img = cv::imread(img_path, cv::IMREAD_COLOR); CV_Assert(!img.empty()); // 校验图像读取成功 // 对应Python:img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv::Mat img_gray; cv::cvtColor(img, img_gray, cv::COLOR_BGR2GRAY); // 对应Python:tf.image.resize(input_data, [32,32]) // 双线性插值和TensorFlow默认resize行为完全一致,注意cv::Size参数顺序为[宽,高],和tf的[高,宽]相反,此处为正方形无差异 cv::Mat img_resized; cv::resize(img_gray, img_resized, cv::Size(32, 32), 0, 0, cv::INTER_LINEAR); // 对应Python:np.array(input_data, dtype=np.float32) cv::Mat input_data; // 若需要将数值归一化到[0,1]范围,可将下方1.0改为1/255.0 img_resized.convertTo(input_data, CV_32FC1, 1.0); // 对应Python两次newaxis操作,最终维度为 [1, 32, 32, 1](NHWC布局) std::vector<int> dims = {1, 32, 32, 1}; cv::Mat output(4, dims.data(), CV_32F, input_data.data); return output.clone(); // 返回深拷贝避免临时内存释放问题 }
补充说明
- 如果你后续需要将输出送入TensorRT/ONNXRuntime等推理框架,直接取出返回Mat的data指针即可,内存布局和Python返回的numpy数组完全一致
- 若需要返回扁平化的float数组,遍历output的数据指针存入
std::vector<float>即可
内容的提问来源于stack exchange,提问作者mohamed gamal
相关产品推荐
相关产品推荐

