Importe OpenCV Mat en C ++ Tensorflow sin copiar

Mi objetivo es ejecutar un modelo TensorFlow en tiempo real para controlar un vehículo a partir de un modelo aprendido. Nuestro sistema de vehículos utiliza ROS (sistema operativo de robot), que está estrechamente relacionado con OpenCV. Entonces, recibo una estera OpenCV que contiene la imagen de interés de ROS.

    cv::Mat cameraImg;

Me gustaría crear un Tensorflow Tensor directamente a partir de los datos en esta matriz OpenCV para evitar el gasto de copiar la matriz línea por línea. Usando la respuesta aEsta pregunta Logré obtener el pase directo de la red trabajando con el siguiente código:

cameraImg.convertTo(cameraImg, CV_32FC3);

Tensor inputImg(DT_FLOAT, TensorShape({1,inputheight,inputwidth,3}));
auto inputImageMapped = inputImg.tensor<float, 4>();
auto start = std::chrono::system_clock::now();
//Copy all the data over
for (int y = 0; y < inputheight; ++y) {
    const float* source_row = ((float*)cameraImg.data) + (y * inputwidth * 3);
    for (int x = 0; x < inputwidth; ++x) {
        const float* source_pixel = source_row + (x * 3);
        inputImageMapped(0, y, x, 0) = source_pixel[2];
        inputImageMapped(0, y, x, 1) = source_pixel[1];
        inputImageMapped(0, y, x, 2) = source_pixel[0];
    }
}
auto end = std::chrono::system_clock::now();

Sin embargo, con este método, la copia al tensor tarda entre 80 ms y 130 ms, mientras que el pase directo completo (para una red convolucional de 10 capas) solo tarda 25 ms.

Mirando ala documentación de tensorflow, parece que hay un constructor Tensor que toma un asignador. Sin embargo, no he podido encontrar ninguna documentación de Tensorflow o Eigen relacionada con esta funcionalidad o laClase Eigen Map en lo que se refiere a los tensores.

¿Alguien tiene alguna idea de cómo se puede acelerar este código, idealmente reutilizando mi memoria OpenCV?

EDITAR: He implementado con éxito lo que @mrry sugirió, y puedo reutilizar la memoria asignada por OpenCV. He abiertoGithub número 8033 solicitando que esto se agregue al árbol fuente de tensorflow. Mi método no es tan bonito, pero funciona.

Todavía es muy difícil compilar una biblioteca externa y vincularla a la biblioteca libtensorflow.so. Potencialmente elbiblioteca de tensorflow cmake ayudará con esto, aún no lo he probado.

Respuestas a la pregunta(2)

Su respuesta a la pregunta