Py学习  »  Python

有没有一种方法可以使用cv2在Python中通过多个进程从usb摄像头捕获视频?

John • 4 年前 • 543 次点击  

我正在做一个django项目,它将运行在覆盆子Pi 3上。Pi有一个连接的USB摄像头。我的项目中的一个网页将显示来自摄像机的视频源。

我访问相机的方式是使用从 here ,如下所示:

from django.http import StreamingHttpResponse, HttpResponseServerError
from django.views.decorators import gzip
import cv2 

class VideoCamera(object):
    def __init__(self):
        self.video = cv2.VideoCapture(0)

    def __del__(self):
        self.video.release()

    def get_frame(self):
        ret,image = self.video.read()
        ret,jpeg = cv2.imencode('.jpg',image)

        return jpeg.tobytes()

def gen(camera):
    while True:
        frame = camera.get_frame()
        yield(b'--frame\r\n'
        b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')

@gzip.gzip_page
def view_cam(request): 
    try:
        return StreamingHttpResponse(gen(VideoCamera()),content_type="multipart/x-mixed-replace;boundary=frame")
    except HttpResponseServerError as e:
        print("aborted")

它工作得很好,除了一次只有一个django实例可以查看视频流。如果另一个进程已经运行 cv2.VideoCapture(0) 然后再次运行它,该方法调用将阻塞,直到另一个进程使用 .release() .

据我所知,这基本上意味着在任何给定的时间,你只能有一个浏览器观看视频。

这是否是观看USB相机馈送的某种固有限制?我是否需要某种单一的后台进程来监视这个提要,并使用某种IPC将视频帧重新分发给所有django实例?还是有一种更简单的方法让多个浏览器观看同一个提要?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49328
 
543 次点击