главная/Python скрипт для распознавания лиц на видео, каскадные фильтры
Ищем лица на видео Питон

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)

  1. gray — первый аргумент это кадр
  2. scaleFactor — второй масштабирование
  3. minNeighbors — третий это минимальное число соседей (чем число меньше тем больше лиц найдете). Но при этом высокая вероятность найти не лицо а похожий предмет.
  4. 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()

Запускаем видео и наслаждаемся результатом