Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 在opencv 3.4.2中更改帧速率_Python 3.x_Opencv_Frame Rate - Fatal编程技术网

Python 3.x 在opencv 3.4.2中更改帧速率

Python 3.x 在opencv 3.4.2中更改帧速率,python-3.x,opencv,frame-rate,Python 3.x,Opencv,Frame Rate,我想减少网络摄像头每秒采集的帧数,这是我正在使用的代码 #!/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

我想减少网络摄像头每秒采集的帧数,这是我正在使用的代码

#!/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
但是它没有生效,默认情况下我仍然有30 fps,而不是由
cap.set(cv2.cap\u PROP\u fps,10)
设置的10 fps。我想降低帧速率,因为我有一个手检测器,处理每一帧需要相当多的时间,我不能在缓冲区中存储帧,因为它会在以前的位置检测手。我可以使用定时器或其他东西运行探测器,但我认为改变fps是一种更简单的方法,但它不起作用,我不知道为什么

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

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

fps = cap.get(cv2.CAP_PROP_FPS)
它返回零。如果要减少每秒帧数,则可以增加waitkey()参数。例如:

k = cv2.waitKey(100)

我无法为我的相机设置FPS,因此我设法根据时间限制FPS,以便在我的代码的其余部分中仅每秒1帧。它是不精确的,但我不需要精确,只是一个限制器,而不是30fps。嗯

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

设置帧速率并不总是像您期望的那样工作。这取决于两件事:

  • 你的相机能输出什么
  • 您正在使用的当前捕获后端是否支持更改帧速率
  • 因此,第(1)点。您的相机将有一个格式列表,它能够传送到捕获设备(例如,您的计算机)。这可能是1920x1080@30 fps或1920x1080@60 fps,它还指定了像素格式。绝大多数消费类相机都不允许您以更大的粒度更改帧速率。而且大多数捕获库都会拒绝更改为相机没有广告的捕获格式

    即使是机器视觉摄像机,它允许你更多的控制,通常只提供一个选择的帧速率(例如1,2,5,10,15,25,30等)。如果您希望在硬件级别使用不受支持的帧速率,通常唯一的方法是使用硬件触发

    和第(2)点。当您使用
    cv.VideoCapture
    时,实际上是在调用特定于平台的库,如DirectShow或V4L2。我们称之为后端。您可以通过以下方式指定正在使用的后端:

    cv2.VideoCapture(0+cv2.CAP\u DSHOW)

    有很多定义的
    CAP_X
    ,但只有一些适用于您的平台(例如
    CAP_V4L2
    仅适用于Linux)。在Windows上,强制系统使用DirectShow是一个不错的选择。然而,如上所述,如果您的相机只报告它可以输出30fps和60fps,请求10fps将是毫无意义的。更糟糕的是,很多设置在OpenCV中只是报告
    True
    ,而实际上它们并没有实现。您已经看到,大多数时候读取参数会给您带来合理的结果,但是如果没有实现该参数(例如,曝光是一种常见的不实现的参数),那么您可能会变得毫无意义

    你最好等一段时间再看最后一张图片

    小心这个策略。不要这样做:

    捕获时:
    res,image=cap.read()
    时间。睡眠(1)
    

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

    帧速率=10
    prev=0
    捕获时:
    已用时间=time.time()-prev
    res,image=cap.read()
    如果经过的时间>1/帧速率:
    prev=time.time()
    #在这里对你的形象做点什么。
    处理图像()
    

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

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

    我在Ubuntu18.04 LTS中通过以下方式更改了openCV相机的fps:

  • 使用“sudo apt get Install v4l utils安装v4l2”

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

  • 在我的python脚本中:


  • 如何测量相机的帧速率?我认为您只设置了捕获属性(VideoCapture类型),而不是真正的相机设置。设置(cv2.CAP_PROP_FPS,10)后,您可以获得10速率的帧数,但相机仍可以在高速率下工作。我使用“FPS=int(CAP.get(5))”检查帧数。我想问题出在我的相机上。我在这里读到“不是所有的摄像头都支持这些命令,我想这就是问题所在。”。摄像头集成在我的笔记本电脑上。@C先生:是的,这取决于您使用的具体摄像头。在读取文件的
    VideoCapture
    实例上设置FPS绝对没有效果。读取文件时的目标是尽可能快地获取帧,以便处理它们。代码可以达到的最低速度是1 FPS,如前所述。如果需要0.5 FPS或0.25 FPS,请删除
    nowTime-startTime
    减法中的
    int()
    。嗨,Josh,请告诉我如何在单独的线程中运行图像捕获和检测器?我有一个用于检测的API——在这个场景中,异步/等待是否是分离线程的正确方法。请分享你的方法。看看在主线程中运行检测器,并在需要时从图像线程中抓取。“不断清除相机的帧缓冲区”-这是黄金,我想知道为什么所有初学者教程都忽略了这一点,而只是盲目地轮询
    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)