Как я могу пропускать чтение кадров CV2 с устройства?

Видеопоток cv2 грузит процессор на 10%. Мне не нужны все 15 или 30 кадров/c с камеры. Подскажите пожалуйста, как я могу не читать такие кадры снизив следовательно нагрузку на процессор? Я бы мог их просто не обрабатывать, но мне все равно приходилось бы их читать. Есть какие-нибудь варианты? Я бы хотел считывать к примеру каждый 5 кадр

https://pastebin.com/fF90NwVc


Ответы (2 шт):

Автор решения: eri

Например для каждого 10 кадра(3 fps из 30) пропускай лишние когда читаешь:

import cv2

def process_frame(frame):
    pass

vid = cv2.VideoCapture(0)
i = 0
while(True):
    ret, frame = vid.read()
    if i == 0:
        process_frame(frame)
    i += 1
    i %= 10
  
vid.release()

При этом можно снять нагрузку с камеры. Запусти v4l2-ctl --list-formats-ext или другую программу для камеры - посмотри доступные fps (моя может 5,7.5,10,15,20,25,30)

vid = cv2.VideoCapture(0)
vid.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
vid.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
vid.set(cv2.CAP_PROP_FPS, 5)

и с i %= 5 получишь один кадр в секунду

→ Ссылка
Автор решения: pb318
import cv2

videofile = 't1-720-30-21s.mp4'
cap = cv2.VideoCapture(videofile)
shift = 5  
frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) - 1
frame = 0
while frame < frames:
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame)
    ret, img = cap.read()
    cv2.imshow('frameshift', img)
    frame += shift
    key_press = cv2.waitKeyEx(10)

cap.release()
cv2.destroyAllWindows()

shift - выводить каждый пятый кадр cap.set(cv2.CAP_PROP_POS_FRAMES, frame) - позиционирует ввод на конкретный фрейм

→ Ссылка