захват капель fps с более низким разрешением opencv - PullRequest
1 голос
/ 05 марта 2020

У меня есть USB-камера, способная записывать 60 кадров в секунду. Я использую openCV с простым python кодом на Windows для захвата некоторых видео, но все идет не так гладко!

Моя главная проблема заключается в том, что, если я установлю свойства [width, height] на максимум камера допускает, что она способна записывать 60 кадров в секунду, в противном случае (т.е. при любом более низком разрешении) запись / потоковая передача упадут до макс. 30 кадров в секунду (запись будет настолько забавной, что либо ускоряется, либо замедляется в соответствии с указанными кадрами в секунду; т. е. если задано разрешение 320X240 и частота кадров записи 60, а в течение 10 секунд результирующее видео будет сжато до 5 секунд, так что в основном оно увеличилось в 2 раза !!)

Я не понимаю, почему именно это происходит? есть идеи?

вот фрагмент кода:

import cv2
import os
import time

def readVideo(Did):
    cap = cv2.VideoCapture(Did)
    # cap.set(cv2.CAP_PROP_FPS, 60) # no matter if you specify or not it selects what suits!!
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320) # 640 is maximum
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240) # 480 is maximum
    ret,frame = cap.read()

    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter('./output.avi', fourcc, 60.0, (320,240)) # (width,height) must match what is stated above in CAP!
    while ret:
        ret,frame = cap.read()
        elapsed = time.time() - start
        count = count + 1 # frame numbers
        cv2.putText(frame,str(cfpsBacked), (25,15),font,fontScale,fontColor,lineType)
        out.write(frame)
        cv2.imshow('camera',frame)
        if elapsed - tick >= 1:
            print("Actual count:{}",count)
            tick += 1
            cfpsBacked = count
            count = 0
        if tick - 10 == 0: # just records 10 seconds
            break

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break
    out.release()
    cap.release()
    cv2.destroyAllWindows()  # destroy all the opened windows
...