如何将TensorFlow的ReadTensorFromImageFile替换为OpenCV实现获取输入张量
基于OpenCV替换TensorFlow ReadTensorFromImageFile的实现方案
首先明确ReadTensorFromImageFile的默认处理逻辑,我们的OpenCV实现会严格对齐以下流程:
- 读取图像为RGB三通道格式
- 缩放到指定的
input_height×input_width尺寸 - 对每个像素执行归一化计算:
(像素值 - input_mean) / input_std - 输出为NHWC格式([batch=1, 高度, 宽度, 通道数=3])的浮点型TensorFlow张量
完整实现代码
依赖头文件
#include <opencv2/opencv.hpp> #include "tensorflow/core/public/session.h" #include "tensorflow/core/framework/tensor.h"
核心替换逻辑
// 1. 用OpenCV读取图像 cv::Mat img = cv::imread(image_path); if (img.empty()) { LOG(ERROR) << "读取图像失败: " << image_path; return -1; } // 2. 通道转换:OpenCV默认BGR格式,对齐TensorFlow读取的RGB格式 cv::cvtColor(img, img, cv::COLOR_BGR2RGB); // 3. 缩放到指定尺寸,插值方式对齐TensorFlow默认的双线性插值 cv::resize(img, img, cv::Size(input_width, input_height), 0, 0, cv::INTER_LINEAR); // 4. 像素值归一化,和原逻辑完全对齐 cv::Mat img_float; img.convertTo(img_float, CV_32F); img_float = (img_float - input_mean) / input_std; // 5. 转换为TensorFlow的Tensor,形状为[1, input_height, input_width, 3] tensorflow::Tensor resized_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({1, input_height, input_width, 3})); auto tensor_mapped = resized_tensor.tensor<float, 4>(); const float* data_ptr = reinterpret_cast<float*>(img_float.data); for (int h = 0; h < input_height; ++h) { for (int w = 0; w < input_width; ++w) { for (int c = 0; c < 3; ++c) { tensor_mapped(0, h, w, c) = data_ptr[(h * input_width + w) * 3 + c]; } } } // 输出验证,和原代码输出完全一致 std::cout << "resized_tensor_height:\t" << resized_tensor.shape().dim_sizes()[1] << "\nresized_tensor_width:\t" << resized_tensor.shape().dim_sizes()[2] << std::endl;
注意事项
- 如果你的
ReadTensorFromImageFile使用了非默认插值方式,修改cv::resize的最后一个参数即可,比如最近邻插值对应cv::INTER_NEAREST - 如果处理的是单通道灰度图,修改通道转换逻辑为
cv::COLOR_BGR2GRAY,同时将Tensor形状的通道数改为1即可 - 上述代码生成的
resized_tensor可以直接传入你给出的Session Run接口,无需额外修改
内容的提问来源于stack exchange,提问作者W3 heap
相关产品推荐
相关产品推荐

