我尝试使用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
有什么问题吗?我想我没有得到实际的帧,而是一个缓冲的帧。如果是这种情况,我该如何解决它并捕获实际帧?
答案 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()