原文作者:Pete Warden
它不是直接来自CvMat,但您可以看到如何在TensorFlow Android示例中从内存数组初始化张量的示例: https : //github.com/tensorflow/tensorflow/blob/0.6.0/tensorflow /examples/android/jni/tensorflow_jni.cc#L173
你可以通过创建一个新的tensorflow :: Tensor对象来开始,像这样(所有代码都未经测试):
tensorflow::Tensor input_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({1, height, width, depth}));
这会创建一个带有浮点值的张量对象,其批量大小为1, width
x height
为大小,并带depth
通道。 例如,具有3个通道的128×64的高图像将以{1, 64, 128, 3}
的形状通过。 批量大小仅用于需要在一次调用中传递多个图像的情况,对于简单用途,您可以将其保留为1。
然后你可以使用这样一行来获得张量后面的底层数组:
auto input_tensor_mapped = input_tensor.tensor<float, 4>();
input_tensor_mapped
对象是新创建的张量中数据的接口,然后可以将自己的数据复制到它中。 在这里,我假设你已经将source_data
设置为指向源数据的指针,例如:
const float* source_data = some_structure.imageData;
然后,您可以遍历数据并复制它:
for (int y = 0; y < height; ++y) {
const float* source_row = source_data + (y * width * depth);
for (int x = 0; x < width; ++x) {
const float* source_pixel = source_row + (x * depth);
for (int c = 0; c < depth; ++c) {
const float* source_value = source_pixel + c;
input_tensor_mapped(0, y, x, c) = *source_value;
}
}
}