В задачах компьютерного зрения, часто требуется найти и обработать какой-либо объект из фото или видео. И Python как нельзя лучше подходит для написания логики такой программы. В данной статье мы будем искать лица на видео и сохранять их в отдельной папке. Для распознавания лица используем каскад Хаара . Он должен б...

Извлекаем кадры видео с Python и Opencv

В задачах компьютерного зрения, часто требуется найти и обработать какой-либо объект из фото или видео. И Python как нельзя лучше подходит для написания логики такой программы. В данной статье мы будем искать лица на видео и сохранять их в отдельной папке. Для распознавания лица используем каскад Хаара. Он должен быть установлен в папке cv2 как, haarcascade_frontalface_default.xml. Найдем его и скопируем путь к нему. Также используем модуль cv2 библиотеки Opencv, и numpy для обрезания кадра по найденным линиям.


import cv2
import numpy as np


# открываем встроенную веб камеру 
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
# или видеозапись
# cap = cv2.VideoCapture("путь/record.mp4", cv2.CAP_DSHOW)


# устанавливаем счетчик 
counter=0

# запускаем бесконечный цикл и проверяем статус камеры
while cap.isOpened():
    
    # читаем кадры с записи или камеры в frame
    _, frame = cap.read()
    
    # переводим кадр в черно-белую градацию
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # создаем функцию классификатор и сохраняем ее в переменной
    face_cascade = cv2.CascadeClassifier("путь/haarcascade_frontalface_default.xml")
    # вызываем метод с параметром в виде кадра gray 
    # метод вернет список найднных областей
    faces = face_cascade.detectMultiScale(gray)

    # выделяем на кадре эти области прямоугольником
    for x, y, width, height in faces:
        cv2.rectangle(frame, (x, y), (x + width, y + height), color=(255, 0, 0), thickness=2)

    
     # вырезаем и сохраняем  найденные объекты
     # в папку detected_from_video_screen. Точка перед ней указывает на текущий каталог
    for x, y, width, height in faces:
        crop_img = frame[y:y + height, x:x + width]
        cv2.imwrite("./detected_from_video_screen/face_{0}.jpg".format(counter), crop_img)
        counter = counter+1

    cv2.imshow("frame", frame)
    if cv2.waitKey(40) == 27:
      break


cap.release()
cv2.destroyAllWindows()

Таким образом можно найти и сохранить любой объект, будь то человек или животное или же машина. При этом программа генерирует большое количество фото, что может сильно затормозить компьютер.