Echtzeit-Vorlagenvergleich - OpenCV, C ++

8

Ich versuche, Echtzeit-Tracking mit Vorlagen zu implementieren. Ich möchte die Vorlage mit jedem Rahmen aktualisieren. Die wichtigsten Änderungen, die ich vorgenommen habe, sind:

1) trennte den Vorlagenvergleich und minmaxLoc in separate Module, nämlich die Funktionen TplMatch () und minmax () .

2) Innerhalb der track () -Funktion wird das select_flag immer true beibehalten, so dass die neue Vorlage bei jeder Iteration in 'myTemplate' kopiert wird.

3) Die letzten 3 Zeilen der Funktion track () sollen die Vorlage aktualisieren (roiImg).

4) Außerdem habe ich alle Argumente für die Funktion track () entfernt, da img und roiImg sind globale Variablen und müssen daher nicht an Funktionen übergeben werden.

Nachfolgend ist der Code:

%Vor%

Die aktualisierte Vorlage wird nicht verfolgt. Ich bin nicht in der Lage herauszufinden, warum dies passiert, da ich meine Vorlage (roiImg) mit jeder Iteration aktualisieren. Der Abgleich Wert von minmax () Funktion gibt den gleichen Punkt (Koordinaten) jedes Mal zurück. Testvideo ist verfügbar unter: Ссылка Bitte schau hinein und leite voraus ... vielen Dank!

    
learner 24.11.2013, 19:46
quelle

3 Antworten

12

Ich erhalte Ihren Originalcode aus dieser Überarbeitung Ihrer Frage: Ссылка

Ich habe die kleinste Änderung an Ihrem ursprünglichen Code vorgenommen, mein resultierender Code ist folgender:

%Vor%

Das Video unter Ссылка zeigt einen Test des oben genannten Programms.

Ich würde die Verwendung globaler Variablen vermeiden, weil ich denke, dass sie nicht helfen zu verstehen, wo die Probleme liegen; außerdem würde ich auch auf die seichte vs. deep copy für OpenCVs Mat klasse achten, wie 1 ' in seinem geschrieben hat Antwort :

  

OpenCV Mat -Klasse ist einfach eine Kopfzeile für die tatsächlichen Bilddaten,   wo es einen Zeiger auf enthält. Der operator= kopiert den Zeiger   (und die anderen Informationen in der Kopfzeile, wie die Bildmaße)   damit beide Mats die gleichen Daten teilen. Dies bedeutet, dass das Ändern der   Daten in einem Mat ändern es auch in dem anderen. Das nennt man a   "seichte" Kopie, da nur die oberste Ebene (der Header) kopiert wird, nicht   die untere Schicht (die Daten).

     

Um eine Kopie der zugrunde liegenden Daten zu erstellen ("tiefe Kopie" genannt), verwenden Sie die    clone() Methode. Sie können Informationen darüber auf der Seite finden, die   du hast mit verlinkt.

Bearbeiten Sie die Abweichung: Im Kommentar Echtzeit-Vorlagenabgleich - OpenCV, C ++ , Lerner fragt nach dem Tracking Drift. Wenn wir das Video Ссылка betrachten, sehen wir, dass das Programm zu Beginn des Videos das rechte Auge des Mädchens verfolgt, während es sich befindet 0:15 es fängt an, die Augenbrauen des Mädchens zu verfolgen, um 0:19 fängt es an, die Augenbrauen des Jungen zu verfolgen und es verfolgt nie mehr das Auge des Mädchens, zum Beispiel bei 0:27 verfolgt es die rechte Augenbraue des Mädchens, während das rechte Auge des Mädchens deutlich ist sichtbar im Bild.

Diese Drift vom Verfolgen des Auges bis zum Verfolgen der Augenbraue ist normal in einem einfachen Code wie der, den ich gepostet habe, und die Erklärung ist ziemlich einfach: Sehen Sie das Video unter Ссылка , das Video beginnt mit dem Tracking (Inhalt des schwarzen Rechtecks) der Spielkarte, dann entferne ich die Spielkarte aus der Szene und das tracking schwarze Rechteck" driftet "auf die unten links in der Szene; Schließlich aktualisieren wir die Vorlage ständig und so ist das Verhalten korrekt: Das Programm stoppt, um die Spielkarte zu verfolgen und fängt an, einen weißen Hintergrund zu verfolgen und so hast du die "Drift" ... mit anderen Worten, deine TplMatch() -Funktion gibt immer ein gültiges result image zurück und Ihre aktuelle Implementierung von minmax() gibt immer ein gültiges Minimum zurück.

    
Alessandro Jacopson 08.12.2013, 09:41
quelle
2

Sie können dem OpenCV-Lernprogramm "Vorlagenabgleich" folgen. Ihre Funktion track enthält möglicherweise den Code, um die Vorlage im aktuellen Frame zu finden. Ein einfacher Code basiert auf der matchTemplate und minMaxLoc Funktionen.

Das interessante Problem in Bezug auf den "Echtzeit" -Teil Ihrer Frage besteht darin, die Übereinstimmung, falls vorhanden, innerhalb der Zeit zwischen dem aktuellen Rahmen und dem nächsten zu finden.

Bearbeiten :

Der folgende Code und das Video auf Ссылка zeigen was Ich meine für Tracking .

Da ich keine Webcam habe, habe ich Ihren Code leicht modifiziert, um nur ein Video zu verwenden, dieses Ссылка

Ich füge dann track function und etwas Logik hinzu, um das Video zu verlangsamen, bis ich eine ROI wähle und danach das Video mit normaler Geschwindigkeit abspiele.

%Vor%     
Alessandro Jacopson 24.11.2013 20:00
quelle
0

Sie können auch eine allgemeine Einführung in das Thema von dieser Wikipedia-Seite Ссылка

haben     
Alessandro Jacopson 18.03.2014 21:06
quelle