使用opencv从USB摄像头获取当前帧

时间:2019-06-24 11:18:08

标签: python-3.x opencv

我正在使用opencv的VideoCapture()从USB摄像机读取帧。我想要的是在某个随机时间获取静止图像。

我现在所拥有的是使用以下命令初始化上限:

cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)

然后使用以下代码获取框架:

ret, frame = cap.read()

我可以正确获得第一帧。但是,似乎下次我获取一个帧时(在随机的时间间隔之后),它不是那个时候的帧,而是紧挨着第一个帧的连续帧(几乎与第一个帧相同)。

我还尝试在第一次之后释放cap,并为第二次捕获获取新的cap。但是初始化cap大约需要1秒,这太长了,无法接受。

这个问题有解决方案吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

一种解决方案是连续捕获帧,但仅在随机时间间隔后显示帧。

等待随机数的帧:

    import random
    import cv2

    cap = cv2.VideoCapture(0)

    def wait(delay):
            framecount = 0
            # capture and discard frames while the delay is not over
            while framecount < delay:
                    cap.read()
                    framecount += 1

    while True:
            # select and wait random number of delay frames
            delay = random.randint(50,150)
            wait(delay)
            # get and display next frame
            ret, img = cap.read()
            cv2.imshow("Image", img)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                    break

    cv2.destroyAllWindows()  

随机时间等待:

    import time
    import random
    import cv2

    curr_time = time.time()
    cap = cv2.VideoCapture(0)

    def wait(delay):
            # capture and discard frames while the delay is not over
            while time.time()-curr_time < delay:
                    cap.read()

    while True:
            # select and wait random delay time
            delay = random.random()
            wait(delay)
            # update curr_time
            curr_time = time.time()
            # get and display next frame
            ret, img = cap.read()
            cv2.imshow("Image", img)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                    break

    cv2.destroyAllWindows()