如何解决如何在C ++中将TF_Tensor转换为opencv Mat?
我正在尝试将Python Tensorflow模型移植到C ++。 在处理过程中,我需要将TF_Tensor类转换为cv :: Mat。
我创建了如下的输出张量。
TF_Tensor** OutputValues = (TF_Tensor**)malloc(sizeof(TF_Tensor*) * NumOutputs);
然后我加载了模型并且会话成功完成,但是我无法将OutputValues转换为cv :: Mat。
我通过下面的代码获得了指向数据缓冲区的指针。
const float* camBuf = (float*)TF_TensorData(*OutputValues);
但是当我尝试通过以下代码创建cv :: Mat时,
cv::Mat testInputImage(
80,80,3,TF_TensorData(*OutputValues)
);
无法正确生成图像。
我找不到对TF_Tensor数据结构的任何引用,所以我需要帮助。
解决方法
try :
cv::Mat mat(width,height,CV_32F);
std::memcpy((void *)mat.data,camBuf,sizeof(TF_Tensor*) * NumOutputs);
,
这样做:
cv::Mat testInputImage(80,80,CV_32FC(3),TF_TensorData(*OutputValues));
您正在将现有数据“包装”在cv::Mat
中,这避免了复制。请注意,第三个参数应为CV_32FC(3)
(具有3个通道的32位浮点图像)。
如果OutputValues
是TF_Tensor**
类型,并且基础TF_Tensor
拥有适当的数据,则此方法应该有效。
但是,我不认为这是
TF_Tensor** OutputValues = (TF_Tensor**)malloc(sizeof(TF_Tensor*) * NumOutputs);
是分配TF_Tensor的适当方法;我认为您应该改用TF_AllocateTensor。
所有说明,如果您使用的是C ++,则可以考虑使用tf::Tensor API而不是TF_Tensor
(用于C语言,这种情况不太常见)。
您省略了一些细节,但假设您的张量是4维的(很常见),具有float32值,并且被布置为NxHxWxC(换句话说,张量保存着一组float图像)。
如果要将批次中的第idx
个元素转换为cv::Mat
,可以这样:
tf::Tensor tensor = /* tensor from somewhere */;
int idx = /* index of the image in the batch */;
int batch_size = tensor.dim_size(0);
int rows = tensor.dim_size(1);
int cols = tensor.dim_size(2);
int channels = tensor.dim_size(3);
int row_size = channels * cols * sizeof(float);
cv::Mat image(rows,cols,CV_32FC(channels));
auto tensor_mapped = tensor.tensor<float,4>();
for (int r = 0; r < rows; ++r) {
float* row = reinterpret_cast<float*>(mat.data + r * row_size);
for (int c = 0; c < cols; ++c) {
for (int k = 0; k < channels; ++k) {
row[k + c * channels] = tensor_mapped(idx,r,c,k);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。