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
设置帧速率并不总是像您期望的那样工作。这取决于两件事:
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:
如何测量相机的帧速率?我认为您只设置了捕获属性(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)