Kollisionsvermeidung mit OpenCV auf dem iPad

Ich arbeite an einem Projekt, in dem ich die Kollisionsvermeidung mit OpenCV implementieren muss. Dies muss unter iOS erfolgen (iOS 5 und höher reicht aus).

Projektziel: Die Idee ist, ein iPad auf dem Armaturenbrett des Autos anzubringen und die Anwendung zu starten. Die Anwendung sollte Frames von der Kamera abrufen und diese verarbeiten, um festzustellen, ob das Auto mit einem Hindernis kollidiert.

Ich bin ein Anfänger in jeglicher Art von Bildverarbeitung, daher stecke ich in diesem Projekt auf konzeptioneller Ebene fest.

Was ich bisher gemacht habe:

Schauen Sie sich OpenCV an und lesen Sie es im Internet. Die Kollisionsvermeidung erfolgt nach der Lukas-Kanade-Pyramidenmethode. Ist das richtig?

Verwenden Sie dieses Projekt als Ausgangspunkt:http://aptogo.co.uk/2011/09/opencv-framework-for-ios/ Es läuft erfolgreich auf meinem iPad und die Aufnahmefunktion funktioniert auch, was bedeutet, dass die Kameraaufnahme gut integriert ist. Ich habe die processFrame-Implementierung so geändert, dass Optical Flow anstelle von Canny Edge Detection verwendet wird. Hier ist die Funktion (noch unvollständig).

    -(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;
}
Lesen Sie mehr über Optical Flow und wie es (konzeptionell) verwendet wird, um bevorstehende Kollisionen zu erkennen. Zusammenfassung: Wenn ein Objekt größer wird, sich aber zu einer Kante des Rahmens bewegt, handelt es sich nicht um einen Kollisionspfad. Wenn ein Objekt größer wird, sich aber nicht in Richtung einer Kante bewegt, befindet es sich auf einem Kollisionspfad. Ist das richtig?Dieses Projekt (http://se.cs.ait.ac.th/cvwiki/opencv:tutorial:optical_flow) scheint genau das zu tun, was ich erreichen möchte. Aber ich habe nicht verstanden, wie es geht, indem ich den Code gelesen habe. Ich kann es nicht ausführen, da ich keine Linux-Box habe. Ich habe die Erklärung auf dieser Webseite gelesen, sie scheint zu einer Homographenmatrix zu kommen. Wie wird dieses Ergebnis zur Kollisionsvermeidung genutzt?

Zusätzlich zu den oben genannten vier Punkten habe ich viel mehr über dieses Thema gelesen, kann aber immer noch nicht alle Teile zusammenfügen.

Hier sind meine Fragen (bitte denken Sie daran, dass ich ein Anfänger bin)

WIE wird der optische Fluss verwendet, um eine bevorstehende Kollision zu erkennen? Angenommen, ich erhalte ein korrektes Ergebnis mit der Funktion cv :: calcOpticalFlowPyrLK (). Wie gehe ich von dort aus vor, um eine bevorstehende Kollision mit einem Objekt auf dem Frame zu erkennen? Ist es möglich, die Entfernung von dem Objekt zu messen, mit dem wir am wahrscheinlichsten kollidieren?

Gibt es ein Beispielarbeitsprojekt, das diese oder eine ähnliche Funktionalität implementiert, die ich mir ansehen kann? Ich habe mir das Projekt auf eosgarden.com angesehen, aber es schien keine Funktionalität darin implementiert zu sein.

Im obigen Beispielcode konvertiere ich lastCorners nach UIImage und zeige das Bild auf dem Bildschirm an. Dies zeigt mir ein Bild, das nur farbige horizontale Linien auf dem Bildschirm aufweist, die meinem ursprünglichen Testbild nicht ähnlich sind. Ist dies die richtige Ausgabe für diese Funktion?

Ich habe ein wenig Schwierigkeiten, die in diesem Projekt verwendeten Datentypen zu verstehen. InputArray, OutputArray usw. sind die von OpenCV-APIs akzeptierten Typen. In der processFrame-Funktion wurde cv :: Mat jedoch an die Kantenerkennungsmethode Canny übergeben. Übergebe ich cv :: Mat für prevImage und nextImage an calcOpticalFlowPyrLK ()?

Danke im Voraus :)

Aktualisieren: Dieses Beispielprojekt gefunden (http://www.hatzlaha.co.il/150842/Lucas-Kanade-Detection-for-the-iPhone). Es lässt sich auf meinem Mac nicht kompilieren, aber ich denke, daraus werde ich einen Arbeitscode für den optischen Fluss haben. Aber ich kann immer noch nicht herausfinden, wie ich verhindernde Kollisionen anhand der Verfolgung dieser Punkte erkennen kann. Wenn jemand von euch überhaupt Qts beantworten kann. Nr. 1, es wird eine große Hilfe sein.

Aktualisieren Es sieht so aus, als würde der optische Fluss zur Berechnung von FoE (Focus of Expansion) verwendet. Es kann mehrere FoE-Kandidaten geben. Mit FoE wird TTC (Time To Collision) ermittelt. Im letzteren Teil bin ich mir nicht ganz sicher. Aber bin ich soweit richtig?Implementiert OpenCV FoE und / oder TTC?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage