Я распознаю лица с помощью haarcascade и отслеживаю их с помощью веб-камеры, используя OpenCV. Мне нужно сохранить каждое лицо, которое отслеживается. Но проблема в том, когда люди двигаются. В этом случае лицо становится размытым.
Я попытался решить эту проблему с помощью детектора лица opencv dnn и Laplacian с помощью следующего кода:
blob = cv2.dnn.blobFromImage(cropped_face, 1.0, (300, 300), (104.0, 177.0, 123.0))
net.setInput(blob)
detections = net.forward()
confidence = detections[0, 0, 0, 2]
blur = cv2.Laplacian(cropped_face, cv2.CV_64F).var()
if confidence >= confidence_threshold and blur >= blur_threshold:
cv2.imwrite('less_blurry_image', cropped_face)
Здесь я попытался ограничить сохранение лица, если оно не смазанным из - за движения по setting blur_threshold
500 и confidence_threshold
до 0,98 (т.е. 98%).
Но проблема в том, что если я меняю камеру, мне придется снова менять пороги вручную. И в большинстве случаев установка порога опускает большинство граней.
Кроме того, это трудно обнаружить, поскольку фон всегда четкий по сравнению с размытым лицом.
Поэтому мой вопрос заключается в том, как я могу обнаружить это размытое изображение на лице. Я знаю, что могу обучить модель ML обнаружению движения лица. Но это потребует больших ресурсов обработки для небольшой задачи.
Более того, мне понадобится огромное количество аннотированных данных для обучения, если я пойду по этому пути. Что не так легко для такого студента, как я.
Следовательно, я пытаюсь обнаружить это с помощью OpenCV, который будет намного менее ресурсоемким по сравнению с использованием модели ML для обнаружения.
Есть ли менее ресурсоемкое решение для этого?
Вероятно, вы можете использовать преобразование Фурье (FFT) или дискретное косинусное преобразование (DCT), чтобы выяснить, насколько размыты ваши лица. Размытость на изображениях приводит к исчезновению высоких частот, и остаются только низкие частоты.
Таким образом, вы берете изображение вашего лица, обнуляете его до размера, который будет хорошо работать для FFT или DCT, и смотрите, сколько спектральной мощности вы имеете на более высоких частотах.
Вам, вероятно, не нужен БПФ - DCT будет достаточно. Преимущество DCT заключается в том, что он дает реальный результат (без мнимой части). С точки зрения производительности, FFT и DCT действительно быстрые для размеров, которые имеют степень 2, а также для размеров, которые имеют только факторы 2, 3 и 5 (хотя, если у вас также есть 3 и 5, это будет немного медленнее).