如何实时流式传输具有django帧的opencv框架?

时间:2017-08-27 15:19:51

标签: python django opencv django-views real-time-data

我正在尝试使用raspberry pi从USB摄像头捕获图像并使用Django框架进行流式传输 我试图使用StreamingHttpResponse从Opencv2流式传输帧。 但是,它只显示1帧而不替换图像。

如何实时替换图像?

这是我的代码。

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 个答案:

答案 0 :(得分:2)

@Ritwick我所做的是将 gen index 功能更改为

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 ,其边界标记为 frame

在django中有一个gzip装饰器函数。

from django.views.decorators import gzip

提高流媒体的速度。我使用django gzip装饰器方法来gzip框架。