我刚买了一个高端的1080p网络摄像头,在#34;相机中打开它#34; Windows 10的应用程序以25或30fps的速度完美显示,但是当使用opencv它非常迟钝时,我在循环中放置了一个计时器,同时禁用了显示器,每帧之间有大约200ms。
为什么?
import numpy as np
import cv2
import time
def getAvailableCameraIds(max_to_test):
available_ids = []
for i in range(max_to_test):
temp_camera = cv2.VideoCapture(i)
if temp_camera.isOpened():
temp_camera.release()
print "found camera with id {}".format(i)
available_ids.append(i)
return available_ids
def displayCameraFeed(cameraId, width, height):
cap = cv2.VideoCapture(cameraId)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
while(True):
start = time.time()
ret, frame = cap.read()
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
end = time.time()
print "time to read a frame : {} seconds".format(end-start)
#DISABLED
#cv2.imshow('frame', frame)
#if cv2.waitKey(1) & 0xFF == ord('q'):
#break
cap.release()
cv2.destroyAllWindows()
#print getAvailableCameraIds(100)
displayCameraFeed(0, 1920, 1080)
由于
Windows 10 x64上的Opencv 3.1,使用python 2.7 x64
答案 0 :(得分:0)
Python是一种scritpt语言,因此它比编译代码慢。您应该使用C ++来增加fps。多线程也会增加fps
答案 1 :(得分:0)
我在Linux系统上也遇到过同样的问题,帧之间有150ms的延迟。就我而言,问题在于相机的“自动曝光”功能处于打开状态,这增加了曝光时间,从而导致延迟。
关闭自动曝光可将延迟减少到49〜51毫秒
这里是OBSProject的链接,对此进行了讨论https://obsproject.com/forum/threads/getting-the-most-out-of-your-webcam.1036/
我不确定您如何在Windows计算机上执行此操作,Google搜索显示,在您的Skype设置上对其进行更改会对其进行全局更改。 (如果您的相机捆绑了软件,则也可以在其中进行更改。)
对于Linux机器,运行v4l2-ctl --list-ctrls
列出了可以修改的相机功能。
我将exposure_auto_priority (bool)
设置为0
,这将关闭“自动曝光”。
答案 2 :(得分:0)
对我来说,这在Windows 10上使用Logitech c922达到了目的。 方法被调用的顺序似乎有影响。 (我有“导入cv”而不是“导入cv2”)
cap = cv.VideoCapture(camera_index + cv.CAP_DSHOW)
cap.set(cv.CAP_PROP_FRAME_WIDTH, 1920)
cap.set(cv.CAP_PROP_FRAME_HEIGHT, 1080)
cap.set(cv.CAP_PROP_FPS, 30)
cap.set(cv.CAP_PROP_FOURCC, cv.VideoWriter_fourcc(*'MJPG'))