我正在使用opencv的VideoCapture()从USB摄像机读取帧。我想要的是在某个随机时间获取静止图像。
我现在所拥有的是使用以下命令初始化上限:
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
然后使用以下代码获取框架:
ret, frame = cap.read()
我可以正确获得第一帧。但是,似乎下次我获取一个帧时(在随机的时间间隔之后),它不是那个时候的帧,而是紧挨着第一个帧的连续帧(几乎与第一个帧相同)。
我还尝试在第一次之后释放cap
,并为第二次捕获获取新的cap
。但是初始化cap
大约需要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()