我在opencv中使用python 3.5。
我想使用2个帖子:
要从网络摄像头查看/捕获视频,我使用以下网站的代码片段:opencv video docs
我可以使用以下代码捕获并保存视频:
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
while(True):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,0)
# write the flipped frame
out.write(frame)
else:
break
out.release()
cv2.destroyAllWindows()
我可以使用以下代码观看视频:
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
这些代码中的每一段都在它们自己的函数中,称为捕获和显示。然后我用pythons线程库在单独的线程中调用它们,如下所示:
cap = cv2.VideoCapture(0)
Thread(target=capture).start()
Thread(target=display).start()
cap.release()
我得到一个错误,我假设与想要同时访问视频缓冲区的两个线程有关。
我知道这可以在没有线程的情况下完成,但还有其他事情我想进一步做,而不能只在单独的线程中完成。
如何从两个线程访问上限视频捕获?
答案 0 :(得分:1)
我的flask / django体验是有限的,所以我不确定如何做到这一点,但我会回答直接发布的问题。
首先,您需要创建一个线程安全的对象,以避免同时调用不同线程中的读取函数。
import cv2
import threading
class VideoCamera(object):
# filename can be 0 to access the webcam
def __init__(self, filename):
self.lock = threading.Lock()
self.openVideo(filename)
def openVideo(self, filename):
self.lock.acquire()
self.videoCap = cv2.VideoCapture(filename)
self.lock.release()
有了这个,您应该能够创建一个带锁的对象并安全地打开一个视频(如果您想打开另一个具有相同对象的视频)。
现在您有2个选项,要么创建一个更新帧的线程并在内部存储当前帧,要么以线程安全的方式更新下一帧功能。我会在这里做第二个向你展示:
def getNextFrame(self):
self.lock.acquire()
img = None
# if no video opened return None
if self.videoCap.isOpened():
ret, img = self.camVid.read()
self.lock.release()
return img
这样你就可以使用2帧来访问视频上限...但是,每次调用该函数时帧都会有所不同。
我希望这会对你有所帮助。