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!
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. Deroperator=
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.
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.
Sie können auch eine allgemeine Einführung in das Thema von dieser Wikipedia-Seite Ссылка
habenTags und Links c++ opencv image-processing computer-vision template-matching