将 ReadTensorFromImageFile 转换为 opencv 格式

Posted

技术标签:

【中文标题】将 ReadTensorFromImageFile 转换为 opencv 格式【英文标题】:Convert ReadTensorFromImageFile to opencv format 【发布时间】:2022-01-03 12:47:45 【问题描述】:

我目前正在使用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);

【问题讨论】:

可能 cv::blobFromImage 是您在 cv::imread 之后需要的。如果 TF 函数和 opencv 到底是做什么的,请阅读文档。 【参考方案1】:

如果你有张量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 加载图像?

【讨论】:

以上是关于将 ReadTensorFromImageFile 转换为 opencv 格式的主要内容,如果未能解决你的问题,请参考以下文章

如何将thinkcmf导入eclipse

如何将Ios文件上传到

Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等

如何将视频文件转换格式

sh 一个将生成CA的脚本,将CA导入到钥匙串中,然后它将创建一个证书并与CA签名,然后将其导入到

python怎么将0写入文件?