在opencv 3.4.2中更改帧速率

Mr.*_*. C 7 opencv frame-rate python-3.x

我想减少摄像头每秒获取的帧数,这是我正在使用的代码

#!/usr/bin/env python

import cv2

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FPS, 10)
fps = int(cap.get(5))
print("fps:", fps)

while(cap.isOpened()):

    ret,frame = cap.read()
    if not ret:
        break

    cv2.imshow('frame', frame)

    k = cv2.waitKey(1)
    if k == 27:
        break
Run Code Online (Sandbox Code Playgroud)

但这并没有生效,默认情况下,我仍然有30 fps(而不是由设置的10 fps)cap.set(cv2.CAP_PROP_FPS, 10)。我想降低帧速率,因为我有一个手检测器,该检测器要花费很多时间来处理每个帧,我无法将帧存储在缓冲区中,因为它会检测到先前位置中的手。我可以使用计时器或其他工具来运行检测器,但我认为更改fps是更简单的方法,但是它不起作用,我也不知道为什么。

我在Windows 8.1中将Opencv 3.4.2与Python 3.6.3结合使用

Jos*_*osh 10

设置帧频并非总是能如您所愿。这取决于两件事:

  1. 您的相机能够输出什么。
  2. 您正在使用的当前捕获后端是否支持更改帧速率。

因此,要点(1)。您的相机将具有可以传送到捕获设备(例如您的计算机)的格式列表。这可能是1920x1080 @ 30 fps或1920x1080 @ 60 fps,并且还指定了像素格式。绝大多数的消费类相机不允许您更精确地更改其帧速率。而且大多数捕获库都会拒绝更改相机不宣传的捕获格式。

即使是允许您进行更多控制的机器视觉相机,通常也只能提供一组帧速率(例如1、2、5、10、15、25、30等)。如果要在硬件级别获得不支持的帧速率,通常唯一的方法是使用硬件触发。

并指出(2)。使用时,cv.VideoCapture您实际上是在调用特定于平台的库,例如DirectShow或V4L2。我们称其为后端。您可以使用类似如下的命令来确切指定使用哪个后端:

cv2.VideoCapture(0 + cv2.CAP_DSHOW)

CAP_X定义了很多,但只有少数适​​用于您的平台(例如,仅适用CAP_V4L2于Linux)。在Windows上,强制系统使用DirectShow是一个不错的选择。但是,如上所述,如果您的相机仅报告其可以输出30fps和60fps,则请求10fps将毫无意义。更糟糕的是,许多设置True在未实际实施时只是在OpenCV中报告。您已经看到,虽然大多数时候读取参数都会给您带来有意义的结果,但是,如果未实现该参数(例如,不常见的暴露方式),那么您可能会胡说八道。

您最好等待一段时间,然后再读取最后一张图像。

请谨慎使用此策略。不要这样做:

while capturing:
    res, image = cap.read()
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

您需要确保不断清除相机的帧缓冲区,否则您将开始在视频中看到延迟。类似于以下内容的东西应该起作用:

frame_rate = 10
prev = 0

while capturing:

    time_elapsed = time.time() - prev
    res, image = cap.read()

    if time_elapsed > 1./frame_rate:
        prev = time.time()

        # Do something with your image here.
        process_image()
Run Code Online (Sandbox Code Playgroud)

对于手持检测器之类的应用程序来说,比较好的方法是让一个线程捕获图像,并且检测器运行在另一个线程中(该线程也控制GUI)。检测器将提取最后捕获的图​​像,运行并显示结果(在读取/写入图像缓冲区时,可能需要锁定对图像缓冲区的访问)。这样,您的瓶颈就是检测器,而不是相机的性能。


小智 6

正如 Josh 所说,更改 openCV 上相机的 fps 很大程度上取决于您的相机是否支持您尝试设置的配置。

我设法在 Ubuntu 18.04 LTS 中通过以下方式更改 openCV 相机的 fps:

  1. 使用“ sudo apt-get install v4l-utils ”安装 v4l2

  2. 运行命令“ v4l2-ctl --list-formats-ext ”以显示支持的视频格式,包括帧大小和间隔。 运行 v4l2-ctl --list-formats-ext 的结果

  3. 在我的Python脚本中:

import cv2

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')) # depends on fourcc available camera
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
cap.set(cv2.CAP_PROP_FPS, 5)
Run Code Online (Sandbox Code Playgroud)


Jef*_*hal 5

我无法为我的相机设置 FPS,所以我设法根据时间限制 FPS,以便每秒只有 1 帧进入我的其余代码。它不精确,但我不需要精确,只需要一个限制器而不是 30fps。HTH

import time

fpsLimit = 1 # throttle limit
startTime = time.time()
cv = cv2.VideoCapture(0)
While True:
    frame = cv.read
    nowTime = time.time()
    if (int(nowTime - startTime)) > fpsLimit:
        # do other cv2 stuff....
        startTime = time.time() # reset time
Run Code Online (Sandbox Code Playgroud)


小智 2

CV_CAP_PROP_FPS属性目前仅适用于视频。如果您使用以下命令:

fps = cap.get(cv2.CAP_PROP_FPS)
Run Code Online (Sandbox Code Playgroud)

返回零。如果你想减少每秒帧数,那么你可以增加 waitkey() 的一个参数。例如:

k = cv2.waitKey(100)
Run Code Online (Sandbox Code Playgroud)