OpenCv网络摄像头阅读官方代码非常慢

时间:2017-10-10 19:29:45

标签: python python-2.7 opencv webcam

我刚买了一个高端的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

3 个答案:

答案 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'))