Evitar colisiones usando OpenCV en iPad

Estoy trabajando en un proyecto en el que necesito implementar la prevención de colisiones utilizando OpenCV. Esto debe hacerse en iOS (iOS 5 y superior lo harán).

Objetivo del proyecto: la idea es montar un iPad en el tablero del automóvil e iniciar la aplicación. La aplicación debe tomar los fotogramas de la cámara y procesarlos para detectar si el automóvil va a chocar con algún obstáculo.

Soy un principiante en cualquier tipo de procesamiento de imágenes, por lo tanto, me estoy atascando en niveles conceptuales en este proyecto.

Lo que he hecho hasta ahora:

Echa un vistazo a OpenCV y lee sobre esto en la red. La prevención de colisiones se implementa utilizando el método de la pirámide de Lukas-Kanade. ¿Es esto correcto?

Utilizando este proyecto como punto de partida:http://aptogo.co.uk/2011/09/opencv-framework-for-ios/ Se ejecuta con éxito en mi iPad y la funcionalidad de captura también funciona, lo que significa que la captura de la cámara está bien integrada. Cambié la implementación de processFrame para probar el flujo óptico en lugar de la detección de bordes Canny. Aquí está la función (incompleta aún).

    -(void)processFrame {
    int currSliderVal = self.lowSlider.value;
    if(_prevSliderVal == currSliderVal) return;
    cv::Mat grayFramePrev, grayFrameLast, prevCorners, lastCorners, status, err;

    // Convert captured frame to grayscale for _prevFrame
    cv::cvtColor(_prevFrame, grayFramePrev, cv::COLOR_RGB2GRAY);
    cv::goodFeaturesToTrack(grayFramePrev, prevCorners, 500, 0.01, 10);
    // Convert captured frame to grayscale for _lastFrame
    cv::cvtColor(_lastFrame, grayFrameLast, cv::COLOR_RGB2GRAY);
    cv::goodFeaturesToTrack(grayFrameLast, lastCorners, 500, 0.01, 10);

    cv::calcOpticalFlowPyrLK(_prevFrame, _lastFrame, prevCorners, lastCorners, status, err);
    self.imageView.image = [UIImage imageWithCVMat:lastCorners];
    _prevSliderVal = self.lowSlider.value;
}
Lea sobre Flujo óptico y cómo se usa (conceptualmente) para detectar colisiones inminentes. Resumen: si un objeto está creciendo en tamaño, pero se está moviendo hacia cualquier borde del marco, entonces no es un camino de colisión. Si un objeto está creciendo en tamaño, pero no se mueve hacia ningún borde, entonces está en el camino de colisión. ¿Es esto correcto?Este proyecto (http://se.cs.ait.ac.th/cvwiki/opencv:tutorial:optical_flow) parece estar haciendo exactamente lo que quiero lograr. Pero no entendí cómo lo está haciendo al leer el código. No puedo ejecutarlo ya que no tengo una caja de Linux. Leí la explicación en esta página web, parece que llega a una matriz de homógrafos. ¿Cómo se usa este resultado para evitar colisiones?

Además de los cuatro puntos mencionados anteriormente, he leído mucho más sobre este tema pero aún no puedo unir todas las piezas.

Aquí están mis preguntas (recuerde que soy un novato en esto)

¿CÓMO se usa el flujo óptico para detectar una colisión inminente? Con esto quiero decir, suponiendo que soy capaz de obtener un resultado correcto de la función cv :: calcOpticalFlowPyrLK (), ¿cómo puedo adelantarlo desde allí para detectar una colisión inminente con cualquier objeto en el marco? ¿Es posible medir la distancia desde el objeto con el que es más probable que choquemos?

¿Hay un proyecto de trabajo de muestra que implemente esta o alguna funcionalidad similar que pueda ver? Eché un vistazo al proyecto en eosgarden.com, pero ninguna funcionalidad parecía estar implementada en él.

En el código de ejemplo anterior, estoy convirtiendo lastCorners a UIImage y estoy mostrando esa imagen en la pantalla. Esto me muestra una imagen que solo tiene líneas horizontales de colores en la pantalla, nada similar a mi imagen de prueba original. ¿Es esta la salida correcta para esa función?

Me cuesta un poco entender los tipos de datos utilizados en este proyecto. InputArray, OutputArray, etc. son los tipos aceptados por las API de OpenCV. Sin embargo, en la función processFrame, cv :: Mat se pasaba al método de detección de bordes Canny. ¿Paso cv :: Mat a calcOpticalFlowPyrLK () para prevImage y nextImage?

Gracias por adelantado :)

Actualizar: Encontré este proyecto de muestra (http://www.hatzlaha.co.il/150842/Lucas-Kanade-Detection-for-the-iPhone). No se compila en mi Mac, pero creo que a partir de esto tendré un código de trabajo para el flujo óptico. Pero aún no puedo entender cómo puedo detectar el impedimento de una colisión para rastrear esos puntos. Si alguno de ustedes puede incluso responder Qts. No. 1, será de gran ayuda.

Actualizar Parece que el flujo óptico se utiliza para calcular FoE (Focus of Expansion). Puede haber múltiples candidatos de FoE. Y utilizando FoE, se llega a TTC (Time To Collision). No estoy muy claro en la última parte. Pero, estoy en lo cierto hasta ahora?¿OpenCV implementa FoE y / o TTC?

Respuestas a la pregunta(1)

Su respuesta a la pregunta