Как я могу пропускать чтение кадров CV2 с устройства?
Видеопоток cv2 грузит процессор на 10%. Мне не нужны все 15 или 30 кадров/c с камеры. Подскажите пожалуйста, как я могу не читать такие кадры снизив следовательно нагрузку на процессор? Я бы мог их просто не обрабатывать, но мне все равно приходилось бы их читать. Есть какие-нибудь варианты? Я бы хотел считывать к примеру каждый 5 кадр
Ответы (2 шт):
Например для каждого 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 получишь один кадр в секунду
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) - позиционирует ввод на конкретный фрейм