如何访问2个线程的1个网络摄像头

时间:2018-06-02 20:35:50

标签: python multithreading opencv video-capture

我在opencv中使用python 3.5。

我想使用2个帖子:

  • 主题1:将视频保存到文件
  • 主题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()

我得到一个错误,我假设与想要同时访问视频缓冲区的两个线程有​​关。

我知道这可以在没有线程的情况下完成,但还有其他事情我想进一步做,而不能只在单独的线程中完成。

如何从两个线程访问上限视频捕获?

1 个答案:

答案 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帧来访问视频上限...但是,每次调用该函数时帧都会有所不同。

我希望这会对你有所帮助。