Начинаем серию статей про работу с фото и видео в Питоне. Мы будем использовать библиотеку OpenCV постепенно разбираясь с ее многочисленными функциями.
OpenCV (Open Source Computer Vision Library) одна из самых известных, бесплатных и современных библиотек машинного зрения. Но не только зрения , там огромный набор методов для работы с графикой и видео. Но все по порядку.
Установка.
Первым делом нам потребуется библиотека Numpy , если она не стоит то ставим:
pip install numpy
Далее ставим из репозитория OpenCV, вы так же можете собрать и из исходников, ссылка.
pip install opencv-python # Только основные методы pip install opencv-contrib-python # Все методы если не ошибаюсь
Web Camera.
Мне нужна была вебка , по этому я начал с этого. Оказалось все очень просто, сразу к коду:
import cv2 cap = cv2.VideoCapture(0) while True: ret, img = cap.read() cv2.imshow("camera", img) if cv2.waitKey(10) == 27: # Клавиша Esc break cap.release() cv2.destroyAllWindows()
- cap = cv2.VideoCapture(0)
Подключаемся ( захватываем) нашу веб камеру. 0 — это индекс камеры, если их несколько то будет 0 или 1 и т.д.
- ret, img = cap.read()
Читаем с устройства кадр(картинку) , метод возвращает флаг ret (True , False) и img — саму картинку ( массив numpy) .
- cv2.imshow(«camera», img)
Функция imshow отображает изображение в указанном окне. Если окно не было создано, то создается новое. «camera» — имя окна , img — массив картинки.
По сути мы получаем картинку(кадр) с камеры и показываем его.
- cv2.waitKey(10)
Как понятно из названия, ожидает нажатия клавиши в мсек. Возвращает код клавиши или -1 если ничего не было нажато.
Настройки камеры.
Все отлично, но хотелось бы немного более тонко настроить вебку :
cap = cv2.VideoCapture(0) cap.set(cv2.CAP_PROP_FPS, 24) # Частота кадров cap.set(cv2.CAP_PROP_FRAME_WIDTH, 600) # Ширина кадров в видеопотоке. cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # Высота кадров в видеопотоке. # Все параметры.
Можем даже немного поиграть с цветами :
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.imshow("camera", gray) # Будет показывать в оттенках серого.
cv2.cvtColor() — метод преобразует изображение из одного цветового пространства в другое. cv2.COLOR_BGR2GRAY — преобразование между RGB / BGR и оттенками серого . Но это все уже работа с изображением.
Запись видео с Вебки.
С записью видео тоже ничего сложного, сразу код:
import cv2 cap = cv2.VideoCapture(0) codec = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter('captured.avi',codec, 25.0, (640,480)) while(cap.isOpened()): ret, frame = cap.read() if cv2.waitKey(1) & 0xFF == or ('q') or ret == False: break cv2.imshow('frame', frame) out.write(frame) out.release() cap.release() cv2.destroyAllWindows()
- codec = cv2.VideoWriter_fourcc(*’XVID’)
Данный метод просто передает индификатор кодека, которым будем кодировать видео. Вы можете использовать и другие: MJPG , X264 .
- out = cv2.VideoWriter(‘captured.avi’,codec, 25.0, (640,480))
- cv2.VideoWriter(filename, fourcc, fps, frameSize)
Тут мы создаем объект в который по сути будет записываться видео кадр за кадром.
- out.write(frame)
Записываем очередной кадр. Все кадры хранятся в памяти , теперь нам надо закрыть запить и сохранить все в файл :
- out.release()
На этом мы маленький наш обзор заканчиваем. Весь код писался на Python 3.7 , во второй версии может отличаться.
Добрый день!
Код не работает, выдаёт ошибку: [ WARN:0] global C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-j8nxabm_\opencv\modules\videoio\src\cap_msmf.cpp (677) CvCapture_MSMF::initStream Failed to set mediaType (stream 0, (640×480 @ 30) MFVideoFormat_RGB24(codec not found)
Python 3.8 и 3.7, без разницы.
Исправлено при помощи:
cv2.VideoCapture(0, cv2.CAP_DSHOW)
Python: cv.CAP_DSHOW — DirectShow (via videoInput) . У меня в Windows все работает без этого флага. Но кому-то может пригодиться )
Не работает на линуксе:
zsh: segmentation fault python3 camera.py
на секунду лампочка мигает и выскакивает ошибка