You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 04:36:03