将 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 格式的主要内容,如果未能解决你的问题,请参考以下文章
Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等