Ich habe ein Projekt entwickelt, um Gesicht durch Kamera mit der OpenCV-Bibliothek zu verfolgen.
Ich habe Haarkaskade mit haarcascade_frontalface_alt.xml
verwendet, um das Gesicht zu erkennen.
Mein Problem ist, wenn die Bilderfassung von der Webkamera keine Gesichter enthält, ist der Prozess zum Erkennen von Gesichtern sehr langsam, so dass Bilder von der Kamera, die dem Benutzer kontinuierlich angezeigt werden, verzögert sind.
Mein Quellcode:
%Vor% Der Haar-Klassifizierer ist von Natur aus relativ langsam. Darüber hinaus gibt es nicht viel Optimierung für den Algorithmus selbst, weil detectMultiScale
in OpenCV parallelisiert wird.
Die einzige Anmerkung zu deinem Code: Bekommst du wirklich einige Gesichter, die jemals mit minSize
erkannt wurden, was gleichbedeutend mit Size(200, 200)
ist? Obwohl, je größer die minSize
- desto besser ist die Leistung.
Versuchen Sie, das Bild zu skalieren, bevor Sie etwas erkennen:
%Vor% (vergiss nicht, minSize
auf einen vernünftigeren Wert zu ändern und erkannte Flächen in einen realen Maßstab zu konvertieren)
Die Bildgröße, die für 2, 3, 5 Mal reduziert wird, ist eine großartige Leistungserleichterung für jeden Bildverarbeitungsalgorithmus, besonders wenn es um einige kostspielige Dinge wie Erkennung geht.
Wie bereits erwähnt, sollten Sie versuchen, einige andere Engpässe mithilfe eines Profilers zu beheben, wenn die Größenänderung nicht ausreicht.
Und Sie können auch zum LBP-Klassifikator wechseln, der vergleichsweise schneller, aber weniger genau ist.
Ich hoffe, es wird helfen.
Vielleicht ist es für Sie nützlich:
Es gibt eine Simd-Bibliothek mit einem Implementierung von HAAR- und LBP-Kaskaden-Klassifikatoren. Es kann Standard HAAR und LBP casscades von OpenCV verwenden. Diese Implementierung hat SIMD-Optimierungen unter Verwendung von SSE4.1, AVX2 und NEON (ARM), so dass es 2-3-mal schneller arbeitet als die ursprüngliche OpenCV-Implementierung.
Ich benutze regelmäßig Haar-Kaskadenklassifizierer und erhalte auf einem Intel PC / Mac (Windows / Ubuntu / OS X) mit 4GB Ram und 2GHz CPU 15 Bilder / Sekunde für die Gesichtserkennung auf 640x480 Bildern. Was ist Ihre Konfiguration?
Hier sind ein paar Dinge, die Sie ausprobieren können.
Sie müssen das Fenster ( namedWindow(window_name, CV_WINDOW_AUTOSIZE);
) nicht innerhalb jedes Rahmens erstellen. Erstellen Sie es zuerst und aktualisieren Sie das Bild.
Sie können versuchen, wie schnell es ohne Histogrammausgleich läuft. Nicht immer mit einer Webcam erforderlich.
Wie von Micka oben vorgeschlagen, sollten Sie überprüfen, ob Ihr Programm im Debug-Modus oder im Release-Modus läuft.
Verwenden Sie einen Profiler, um festzustellen, ob der Engpass vorhanden ist.
Falls Sie es noch nicht gemacht haben, haben Sie die Bildrate gemessen, die Sie bekommen, wenn Sie die Gesichtserkennung auskommentieren und Rechtecke zeichnen?
Tags und Links c++ opencv face-detection face-recognition