如何在实时情况下使用Django框架流式传输OpenCV帧?

9

我正在尝试使用树莓派捕获USB摄像头的图像,并使用Django框架进行流处理。我尝试使用StreamingHttpResponse从Opencv2中流式传输帧。但是它只显示一帧而不替换图像。

如何实现实时替换图像?

这是我的代码。

from django.shortcuts import render
from django.http import HttpResponse,StreamingHttpResponse
import cv2
import time

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(frame)
        time.sleep(1)

def index(request):
    # response = HttpResponse(gen(VideoCamera())
    return StreamingHttpResponse(gen(VideoCamera()),content_type="image/jpeg")

1
客户端可能只期望一个单独的图像,因为 content_type 是 image/jpeg。这个问题可能会有所帮助。https://dev59.com/1mEi5IYBdhLWcg3whcni - Håken Lid
谢谢您的回复!我已经能够使用multipart/x-mixed流式传输我的相机输入帧! - luvwinnie
你能解释一下你是如何使用multipart的吗?或者有代码片段可以提供吗?我遇到了同样的问题。 - Archetype2142
1个回答

6

@Ritwick,我所做的是将genindex函数更改为以下内容:

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 index(request): 
    try:
        return StreamingHttpResponse(gen(VideoCamera()),content_type="multipart/x-mixed-replace;boundary=frame")
    except HttpResponseServerError as e:
        print("aborted")

我使用Python生成器来生成每个相机帧,并使用StreamingHttpResponse替换multipart/x-mixed-replace,其中边界标记为帧

Django中有一个gzip装饰器函数。

from django.views.decorators import gzip

为了改善流媒体的速度,我使用了Django Gzip装饰器方法来压缩框架。


1
有没有办法将这个放在模板上?我有一个网页,想在网页的侧边栏运行上述代码并显示结果。您能告诉我在视图和模板中需要做哪些更改吗? - Abhijit
完整示例请参见:https://blog.miguelgrinberg.com/post/video-streaming-with-flask/page/8 - Emil Terman
@Abhijit,你找到解决方案了吗?我也在寻找同样的答案。 - Miguel
1
@Abhijit,你可以使用<img src="{% url 'url-name' %}"></img>,其中url-name是上面视图index的URL名称。这里有一个Django应用程序可以实现此功能:https://github.com/sawardekar/Django_VideoStream - Sayyor Y
@luvwinnie 当我们使用JPEG压缩格式时,是否需要gzip装饰器?为什么在Safari中有时流无法工作并且加载页面会冻结? - Martin Kubovčík

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接