下面我有一些非常简单的性能测试代码,用于在2011年底的Macbook Pro上使用OpenCV 3.1 + Python3测量我的摄像头的FPS:
cap = cv2.VideoCapture(0)
count = 0
start_time = time.perf_counter()
end_time = time.perf_counter()
while (start_time + 1) > end_time:
count += 1
cap.read()
# Attempt to force camera FPS to be higher
cap.set(cv2.CAP_PROP_FPS, 30)
end_time = time.perf_counter()
print("Got count", count)不做任何处理,甚至不显示图像或在另一个线程中这样做,我只得到大约15个FPS。
尝试用cap.get(cv2.CAP_PROP_FPS)访问相机的FPS,我得到了0.0。
知道为什么吗?
我已经在互联网上搜索了相当多的答案,所以我一直在想:
**编辑**附加细节:似乎我捕获的第一帧速度很快,随后的帧速度较慢;似乎这可能是缓冲区问题(例如,相机在第一帧后暂停,因为必须分配新的缓冲区写入?)
在每次读取之后,调整代码以计算平均FPS:
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_CONVERT_RGB, False)
cap.set(cv2.CAP_PROP_FPS, 30)
start_time = time.perf_counter()
count = 0
cv2.CAP_PROP_FPS
end_time = time.perf_counter()
while True:
count += 1
ret, frame = cap.read()
end_time = time.perf_counter()
print("Reached FPS of: ", count / (end_time - start_time))我得到了一个大约30 are的帧,随后的帧速度更慢:
到达FPS : 27.805818385257446
到达FPS : 19.736237223924398
到达FPS : 18.173748156583795
到达FPS : 17.214809956810114
到达FPS : 16.94737657138959
到达FPS : 16.73624509452099
到达FPS : 16.33156408530572
**编辑**仍然没有运气到10/20。我最好的推测是,内存传输存在一些问题,因为相机本身可以根据其他应用程序的能力,在30 FPS确定捕获。
发布于 2016-10-16 04:58:59
这不是回答。因为原来问题中的评论太长了,不值得你注意。我在外面发邮件。
首先,当CV_CAP_PROP_FPS返回0时是正常的。OpenCV for Python只是OpenCV C++的包装器。据我所知,这个属性只适用于视频文件,而不是摄像机。你必须自己计算FPS (就像你编辑的那样)。
其次,OpenCV有一个错误,它总是将图像从相机转换为RGB https://github.com/opencv/opencv/issues/4831。普通相机通常采用YUYV颜色。这需要很长时间。您可以检查所有支持的分辨率+ fps https://trac.ffmpeg.org/wiki/Capture/Webcam。我看到一些相机不支持RGB颜色和OpenCV力,以获得RGB和采取可怕的FPS。由于摄像机的限制,在相同的编解码器中,分辨率越高,fps越慢。在不同支持的编解码器中,相同分辨率的输出越大,fps越慢。例如,我的相机支持yuyv和mjpeg,在高清分辨率中,YUYV有最大10 fps,而MJPEG有最大30 fps。
因此,首先您可以尝试ffmpeg可执行文件来获得帧。在识别错误来源之后,如果ffmpeg运行良好,您可以使用ffmpeg库(而不是ffmpeg可执行文件)从您的相机获取帧(大多数视频I/O (包括摄像机)使用ffmpeg的OpenCV)。
请注意,我只使用C++语言的ffmpeg和C++,而不是C++。使用ffmpeg库是另一个很长的故事。
祝好运!
https://stackoverflow.com/questions/40055428
复制相似问题