Dlib hat eine sehr praktische, schnelle und effiziente Objekterkennungsroutine, und ich wollte ein cooles Face-Tracking-Beispiel ähnlich dem Beispiel here machen.Was ist falsch mit dieser Webcam Gesichtserkennung?
OpenCV, das weit verbreitet ist, hat VideoCapture-Modul, das ziemlich schnell ist (eine Sekunde zum Schnappschuss verglichen mit 1 Sekunde oder mehr für den Aufruf eines Programms, das die Webcam weckt und ein Bild holt). Ich habe das zum Python-Gesichtserkennungs-Beispiel in Dlib hinzugefügt.
Wenn Sie die OpenCV VideoCapture-Ausgabe direkt anzeigen und verarbeiten, sieht das seltsam aus, weil OpenCV offenbar BGR statt RGB-Reihenfolge speichert. Danach Einstellung, es funktioniert, aber langsam:
from __future__ import division
import sys
import dlib
from skimage import io
detector = dlib.get_frontal_face_detector()
win = dlib.image_window()
if len(sys.argv[1:]) == 0:
from cv2 import VideoCapture
from time import time
cam = VideoCapture(0) #set the port of the camera as before
while True:
start = time()
retval, image = cam.read() #return a True bolean and and the image if all go right
for row in image:
for px in row:
#rgb expected... but the array is bgr?
r = px[2]
px[2] = px[0]
px[0] = r
#import matplotlib.pyplot as plt
#plt.imshow(image)
#plt.show()
print("readimage: " + str(time() - start))
start = time()
dets = detector(image, 1)
print "your faces: %f" % len(dets)
for i, d in enumerate(dets):
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
i, d.left(), d.top(), d.right(), d.bottom()))
print("from left: {}".format(((d.left() + d.right())/2)/len(image[0])))
print("from top: {}".format(((d.top() + d.bottom())/2) /len(image)))
print("process: " + str(time() - start))
start = time()
win.clear_overlay()
win.set_image(image)
win.add_overlay(dets)
print("show: " + str(time() - start))
#dlib.hit_enter_to_continue()
for f in sys.argv[1:]:
print("Processing file: {}".format(f))
img = io.imread(f)
# The 1 in the second argument indicates that we should upsample the image
# 1 time. This will make everything bigger and allow us to detect more
# faces.
dets = detector(img, 1)
print("Number of faces detected: {}".format(len(dets)))
for i, d in enumerate(dets):
print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
i, d.left(), d.top(), d.right(), d.bottom()))
win.clear_overlay()
win.set_image(img)
win.add_overlay(dets)
dlib.hit_enter_to_continue()
# Finally, if you really want to you can ask the detector to tell you the score
# for each detection. The score is bigger for more confident detections.
# Also, the idx tells you which of the face sub-detectors matched. This can be
# used to broadly identify faces in different orientations.
if (len(sys.argv[1:]) > 0):
img = io.imread(sys.argv[1])
dets, scores, idx = detector.run(img, 1)
for i, d in enumerate(dets):
print("Detection {}, score: {}, face_type:{}".format(
d, scores[i], idx[i]))
Vom Ausgang der Zeitpunkte in diesem Programm, es Verarbeitung und packte das Bild scheint jeweils ein Fünftel einer Sekunde nehmen, so könnte man denken, es sollte zeigen Ein oder zwei Updates pro Sekunde - wenn Sie jedoch Ihre Hand heben, wird dies in der Webcam nach ca. 5 Sekunden angezeigt!
Gibt es eine Art internen Cache, der verhindert, dass das neueste Webcam-Bild erfasst wird? Kann ich den Webcam-Eingabeprozess anpassen oder mit mehreren Threads versehen, um die Verzögerung zu beheben? Dies ist auf einem Intel i5 mit 16 GB RAM.
aktualisieren
hier Nach schlägt es die Lese ein Video Frame für Frame packt. Dies würde erklären, dass es das nächste Bild und das nächste Bild aufnimmt, bis es schließlich alle Bilder erfasst, die während der Verarbeitung erfasst wurden. Ich frage mich, ob es eine Option gibt, um die Framerate zu setzen oder setzen Sie Frames und klicken Sie einfach auf ein Bild des Gesichts in der Webcam jetzt auf lesen? http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html#capture-video-from-camera
Die Zeit wird von dlib benötigt, um das Bild zu erkennen. Sie könnten versuchen, das Bild für eine bessere Leistung auf kleinere Abmessungen zu skalieren. – ZdaR
@ZdaR Danke für den Vorschlag. Bitte führen Sie das Beispiel aus, Sie werden sehen, dass das nur einen Bruchteil einer Sekunde dauert. Warum dauert es fast 5 Sekunden vom Bewegen bis zur Anzeige der Bewegung im Webcam-Fenster (mit vielen Zwischenrahmen, die angezeigt werden, bevor sie aktuell sind?) Das ist die Frage. – NoBugs
Was ist die Kameraauflösung und die Gesichtsgröße? – Evgeniy