У Dlib есть действительно удобная, быстрая и эффективная процедура обнаружения объектов, и я хотел сделать крутой пример отслеживания лица, подобный примеру here.Что случилось с этим обнаружением лица веб-камеры?
У поддерживаемого устройства OpenCV имеется довольно быстрый модуль VideoCapture (пятая часть секунды для моментального снимка по сравнению с 1 секундой или более для вызова программы, которая пробуждает веб-камеру и извлекает изображение). Я добавил это к примеру Python для детектирования лица в Dlib.
Если вы непосредственно показываете и обрабатываете вывод OpenCV VideoCapture, это выглядит странно, потому что, по-видимому, OpenCV хранит BGR вместо RGB-заказа. После настройки этого, она работает, но медленно:
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]))
С выхода таймингами в этой программе, кажется, обработки и захвата картины каждый принимает одну пятую секунды, так что вы могли бы подумать, что должно показать один или два обновления в секунду - однако, если вы поднимете руку, она отобразится в режиме просмотра веб-камеры через 5 секунд или около того!
Есть ли какой-то внутренний кеш, чтобы он не захватывал последнее изображение веб-камеры? Могу ли я настроить или многопоточный процесс ввода веб-камеры, чтобы исправить отставание? Это на Intel i5 с 16-гигабайтной оперативной памятью.
Update
Согласно здесь, это предполагает чтение захватывает видео кадр за кадром. Это объясняет, что он захватывает следующий кадр и следующий кадр, пока он, наконец, не догнал все кадры, которые были захвачены во время обработки. Интересно, есть ли опция установить частоту кадров или установить ее для удаления кадров и просто щелкнуть изображение лица в веб-камере сейчас на чтение? http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_gui/py_video_display/py_video_display.html#capture-video-from-camera
Время, затраченное dlib для обнаружения изображения, вы можете попробовать изменить размер изображения на меньшие размеры для лучшей производительности. – ZdaR
@ZdaR Спасибо за предложение. Пожалуйста, запустите пример, вы увидите, что занимает всего одну секунду. Почему требуется переместить почти 5 секунд, чтобы показать перемещение в окне веб-камеры (со многими промежуточными кадрами, показанными до его обновления?) Это вопрос. – NoBugs
Что такое разрешение камеры и размер лица? – Evgeniy