1

我目前正在使用ReadTensorFromImageFile()函数读取图像。但我想使用 OpenCV 功能阅读。

张量流图像读取:

 Status read_tensor_status =
  ReadTensorFromImageFile(image_path, input_height, input_width, input_mean,
                          input_std, &resized_tensors);
  if (!read_tensor_status.ok()) {
      LOG(ERROR) << read_tensor_status;
      return -1;
  }
  // @resized_tensor: the tensor storing the image
  const Tensor &resized_tensor = resized_tensors[0];
  auto resized_tensor_height = resized_tensor.shape().dim_sizes()[1];
  auto resized_tensor_width = resized_tensor.shape().dim_sizes()[2];
  std::cout << "resized_tensor_height:\t" << resized_tensor_height
            << "\nresized_tensor_width:\t" << resized_tensor_width << std::endl;

出去

resized_tensor_height:  416
resized_tensor_width:   416

相同的阅读想要使用 OpenCV 函数来完成。转换 OpenCV 格式后,想要传递resized_tensor到这个会话中

  Status run_status = session->Run({{input_layer, resized_tensor}},
                                   output_layer, {}, &outputs);
4

1 回答 1

1

如果您有 tensor t,并且想要创建指向内存t(并且不拥有内存本身)的 cv::Mat ,您可以执行以下操作:

cv::Mat m(height, width, CV_32FC1, t.flat<float>().data());

需要确保类型正确,不确定ReadTensorFromImageFile返回什么格式。如果您现在想将其调整为另一个张量,您可以执行以下操作:

// Create the target tensor, again - use correct types
tensorflow::Tensor tResized(tensorflow::DT_FLOAT, tensorflow::TensorShape({ 1, w, h, 1 }));

// Wrap it with cv::Mat
cv::Mat mResized(height, width, CV_32FC1, tResized.flat<float>().data());

// resize with cv
resize(m, mResized, newSize);

笔记:

  • 没有编译或运行这段代码,所以它更像是一个伪代码
  • 为什么不首先使用 cv::imread 加载图像?
于 2021-11-25T08:37:13.267 回答