Как заставить Python записывать 30 или 60 кадров в секунду, используя openCV и Logitech C920

Я пытаюсь записать видео в формате 720p со скоростью 60 кадров в секунду или 1080p со скоростью 30 кадров в секунду. Однако при использовании веб-камеры C920 и OpenCV на python я могу получить только около 10 кадров в секунду на 720p и 5 кадров в секунду на 1080p.

Я пробовал много разных настроек для openCV, но ни одна из них не меняет FPS на выходе.

import cv2
import time
FPS = 0

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'MJPG')

if(not cap.isOpened()):
    exit()

cap.set(cv2.CAP_PROP_FOURCC, fourcc);
cap.open(cv2.CAP_ANY);
cap.set(cv2.CAP_PROP_CONVERT_RGB, 0);
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
cap.set(cv2.CAP_PROP_FPS, 60)

last = time.time()

for i in range(0,100):
    before = time.time()
    rval, frame = cap.read()
    now = time.time()
    print("cap.read() took: " + str(now - before))
    if(now - last >= 1):
        print(FPS)
        last = now
        FPS = 0
    else:
        FPS += 1
cap.release()

Я ожидаю, что он будет выводить 60 кадров в секунду, но он дает только 9 или 10 кадров в секунду.


person Joris Janssen    schedule 12.04.2019    source источник
comment
Каковы характеристики оборудования, на котором вы запускаете этот код?   -  person GPPK    schedule 12.04.2019
comment
Если ваш fps падает при более высоком разрешении, совершенно очевидно, что сценарий ограничен процессором или временем, которое требуется камере для отправки своих данных. Если узким местом является камера, а загрузка вашего ЦП остается низкой, возможно, вы можете обойти это, используя несколько потоков.   -  person Peter    schedule 12.04.2019
comment
Я работаю на Windows10, Python 3.6.5, и результат одинаков для моего ноутбука (6700HQ) и моего ПК (8700K).   -  person Joris Janssen    schedule 12.04.2019
comment
Если я записываю в самой Windows, она достигает 1080p30 кадров в секунду.   -  person Joris Janssen    schedule 12.04.2019


Ответы (1)


OpenCV автоматически выбирает первый доступный сервер захвата (см. здесь) . Возможно, он не использует V4L2 автоматически.

Также установите как -D WITH_V4L=ON, так и -D WITH_LIBV4L=ON при сборке из исходного кода.

Возможно, формат пикселей, выбранный OpenCV, не поддерживает нужную частоту кадров в нужном разрешении. В Linux вы можете использовать v4l2-ctl --list-formats-ext и v4l2-ctl --all для просмотра настроек.

Чтобы установить используемый формат пикселей, установите свойство CAP_PROP_FOURCC захвата:

capture = cv2.VideoCapture(cam_id, cv2.CAP_V4L2)
capture.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'))
person zardosht    schedule 14.07.2019