Ответ 1
Это не непосредственно из CvMat, но вы можете увидеть пример инициализации тензора из массива в памяти в примере Android TensorFlow: 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}));
Это создает объект Tensor со значениями float с размером партии 1 и размером width
x height
и с каналами depth
. Например, изображение шириной 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;
}
}
}
Есть очевидные возможности для оптимизации этого наивного подхода, и у меня нет примера кода, чтобы показать, как работать с частью OpenCV для получения исходных данных, но, надеюсь, это поможет вам начать работу.