使用受支持的摄像头无法在opencv中达到60fps

2024-05-08 14:11:25 发布

您现在位置:Python中文网/ 问答频道 /正文

对于我的项目,我需要处理高速率的帧,越多越好,但至少60帧是强制性的。我在Windows 10机器vía Anaconda中使用opencv 4.1.1,以防您需要了解平台。使用提供的代码,无论帧速率或分辨率如何,我都能获得30 fps

我的相机型号是ELP-USBFHD01M-L21,它能够:

  1. 1920(高)x1080(V)MJPEG 30fps YUY2 6fps
  2. 1280(高)x1024(高)兆焦耳每分钟30帧YUY2每分钟6帧
  3. 1280(高)x 720(V)兆焦耳每小时60帧,比每小时2帧9帧
  4. 1024(高)x 768(五)兆焦耳每小时30帧,比每小时2帧9帧
  5. 800(高)x 600(V)MJPEG 60帧/秒YUY2 21帧/秒
  6. 640(高)x480(V)MJPEG 120fps YUY2 30fps
  7. 352(高)x288(V)MJPEG 120fps YUY2 30fps
  8. 320(高)x240(伏)兆焦耳PEG 120fps YUY2 30fps

所有这些帧速率都使用AMCAP软件进行了正确测试

如何达到所需的帧速率

代码:

import cv2
import time
import numpy as np

if __name__ == "__main__":

    VIDEO_SOURCE = 0
    CAMERA_CAPTURE_FPS = 60
    CAMERA_CAPTURE_WIDTH = 1280
    CAMERA_CAPTURE_HEIGHT = 720

    frameCounter = 0
    fps = 0
    startTime = time.time()

    cap = cv2.VideoCapture(VIDEO_SOURCE)

    print("Parameters BEFORE assignment: ")
    print("WIDTH: " + str(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))
    print("HEIGHT: " + str(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    print("FPS: " + str(cap.get(cv2.CAP_PROP_FPS)))
    print("FOURCC: " + str(cap.get(cv2.CAP_PROP_FOURCC)))

    # Noting seems to change adding or deleting this 2 lines
    fourcc = cv2.VideoWriter_fourcc('M','J','P','G')
    cap.set(cv2.CAP_PROP_FOURCC, fourcc)
    
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, CAMERA_CAPTURE_WIDTH)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, CAMERA_CAPTURE_HEIGHT)
    cap.set(cv2.CAP_PROP_FPS, CAMERA_CAPTURE_FPS)

    print()
    print("Parameters AFTER assignment: ")
    print("WIDTH: " + str(cap.get(cv2.CAP_PROP_FRAME_WIDTH)))
    print("HEIGHT: " + str(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    print("FPS: " + str(cap.get(cv2.CAP_PROP_FPS)))
    print("FOURCC: " + str(cap.get(cv2.CAP_PROP_FOURCC)))


    while True:

        ret, frame = cap.read()

        cv2.putText(frame, "FPS: " + str(fps), (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 1, cv2.LINE_AA)
        frameCounter += 1

        if time.time() - startTime >= 1:
            fps = frameCounter
            frameCounter = 0
            startTime = time.time()

        cv2.imshow("Camera stream", frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cv2.destroyAllWindows()
    cap.release()

Tags: gettimewidthcv2framecameracapturecap