Извлекаем кадры видео с 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()
Таким образом можно найти и сохранить любой объект, будь то человек или животное или же машина. При этом программа генерирует большое количество фото, что может сильно затормозить компьютер.
-
- Михаил Русаков
Комментарии (2):
Здравствуйте, мне необходимо из видео достать каждый 500 кадр. Как это можно реализовать?
Ответить
Здравствуйте Используйте следующее условие во втором вложенном цикле из примера выше: if counter % 500 == 0: // save
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.