cv2.VideoCapture.read()在time.sleep()

时间:2016-01-07 13:25:59

标签: python opencv

我尝试使用Python的opencv和两个摄像头捕获(立体)图像,因此每5秒钟应保存一个图像。但这里的问题是保存旧框架。

缩小的代码如下:

    cap = cv2.VideoCapture(0)

    for i in range(20):
        time.sleep(5)
        print "Taking image %d:" % i
        ret, frame = cap.read()
        cv2.imwrite("image %d" % i, frame)
        print "  image done." if ret else "  Error while taking image..."
    cap.release()
    cv2.destroyAllWindows()

为了检查这一点,我在每张拍摄的图像后改变了相机的位置。但是,保存旧位置的图像(实际上不一样,但我假设在最后保存的图像之后有一些帧)。最后,在5个(或更多)图像之后,图像中捕获的位置也会发生变化。

那么time.sleep有什么问题吗?我想我没有得到实际的帧,而是一个缓冲的帧。如果是这种情况,我该如何解决它并捕获实际帧?

2 个答案:

答案 0 :(得分:4)

VideoCapture正在缓冲。 如果您总是想要实际框架,请执行以下操作:

while True:
    cap = cv2.VideoCapture(0)
    ret, frame = cap.read()
    cap.release()
    cv2.imshow(" ", frame)
    if cv2.waitKey(2000) != -1:
        break

答案 1 :(得分:1)

您需要计算经过的时间,但不能停止读取帧。像这样:

import cv2
import time

cap = cv2.VideoCapture(0)
preframe_tm = time.time()
i = 0
while True:
    ret, frame = cap.read()
    elapsed_time = time.time() - preframe_tm
    if elapsed_time < 5:
        continue
    preframe_tm = time.time()
    i += 1
    print("Taking image %d:" % i)
    cv2.imwrite("image_%d.jpg" % i, frame)
    if i >= 20:
        break

cap.release()
cv2.destroyAllWindows()