Python скрипт для распознавания лиц на видео, каскадные фильтры
Напишем скрипт для распознавания лиц на видео при помощи Python. С использованием каскадных фильтров.
В первую очередь устанавливаем библиотеку opencv-python
pip install opencv-python
Импортируем библиотеку.
Обозначим функцию face_capture в которой будем выполнять всю основную работу
Для работы будем использовать каскадные фильтры для поиска по лицу haarcascade_frontalface_default.xml
Ссылка на фильтры — https://github.com/opencv/opencv/tree/master/data/haarcascades
Скачаем файл с фильтрами и поместим в директорию filters рядом с исполняемым файлом. Указываем путь до файла в переменной cascade_path
Далее создаем объект класса CascadeClassifier модуля cv2 и построим классификатор на основе фильтра. Передаем путь до файла в качестве параметра
Захватываем видеопоток при помощи класса VideoCapture. В качестве аргумента передаем путь к файлу где мы хотим захватить лица или номер девайса если используете видеокамеру в качестве видеопотока, в большинстве случаем это 0
Запускаем цикл где вызываем метод read у нашего объекта с видео, тем самым захватываем и декодируем. После чего метод возвращает следующий кадр
Переведем каждый кадр в серый цвет, для лучшей работы алгоритма. Для этого в функцию cvtColor(frame) в первый аргумент передаем кадр, во второй константу cv2.COLOR_BGR2GRAY
Для поиска всех лиц в кадре используем метод detectMultiscale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)
- gray — первый аргумент это кадр
- scaleFactor — второй масштабирование
- minNeighbors — третий это минимальное число соседей (чем число меньше тем больше лиц найдете). Но при этом высокая вероятность найти не лицо а похожий предмет.
- flags — Четвертый аргумент минимальный размер объекта, все что меньше не будет попадать в выборку. Пятый флаг со значение старого каскада
Запускаем цикл for для итерации по лицам. Используем оси x и y, высоту и ширину сторон для отрисовки линий прямоугольника.
Внутри цикла используем функцию rectangle.
- frame — Первый аргумент — кадр.
- (x, y) — Вторым оси x и y в кортеже.
- (x + width, y + height) — Третий стороны прямоугольника, к x прибавляем ширину, а к y высоту.
- (255, 255, 255) — Четвертый это цвет рамки в формате rgb.
- 2 — Пятый это толщина линии.
В конце вызываем функцию cv2.imshow в первом аргументе название видео во втором кадр.
Для закрытия видео и выхода из цикла по клавише допишем условие.
Закрывать будем по клавише h.
Далее вызываем метод release у объекта video capture для закрытия видео и функцию destroyAllWindows для закрытия всех окон
Пример скрипта распознавания лиц на видео
from platform import release
import cv2
def face_capture():
cascade_path = 'ваш путь до файла haarcascade_frontalface_default.xml'
clf = cv2.CascadeClassifier(cascade_path)
camera = cv2.VideoCapture()
while True:
_, frame = camera.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = clf.detectMultiScale(
gray,
scaleFront=1.1,
minNeigbors=5,
minSize=(30, 30,
flags=cv2.CASCADE_SCALE_IMAGE
)
for (x, y, width, height) in faces:
cv2.rectangle(frame, (x, y), (x + width, y + height), (255, 255, 255), 2)
cv2.imshow('Super Faces', frame)
if cv2.waitKey(1) == ord('h'):
break
camera.release()
cv2.destroyAllWindows()
def main():
face_capture()
if __name__ == '__main__':
main()
Запускаем видео и наслаждаемся результатом