vtni
vtni

Reputation: 980

cv2.VideoCapture.read() gets old frame after time.sleep()

I tried to capture (stereo) images with Python's opencv and two cameras so therefore every 5 seconds an image should be saved. But the problem here is that an old frame is saved.

The minified code is as follows:

    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()

To check this, I changed the position of the camera after each taken image. But nevertheless an image from an old position is saved (actually not the same, but I assume some frames after the last saved image). After 5 (or more) images finally the captured location in the image does also change.

So, is there any problem with time.sleep? I guess that I'm not getting the actual frame, but a buffered one. If this is the case, how could I fix it and capture the actual frame?

Upvotes: 7

Views: 8389

Answers (2)

huajie wang
huajie wang

Reputation: 41

you need to count the elapsed time, but not stop read frames. like this:

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()

Upvotes: 4

user1261273
user1261273

Reputation:

VideoCapture is buffering. If you always want the actual frame, do this:

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

Upvotes: 9

Related Questions