【问题标题】:Opencv Live Stream from camera in Django Webpage来自 Django 网页中相机的 Opencv Live Stream
【发布时间】:2018-09-15 17:39:43
【问题描述】:

我正在用 Django 做一个项目。我想在网页上显示来自摄像头的实时信息。但是我不确定如何返回从网页上的摄像头获得的实时提要。 这是我迄今为止尝试过但没有看到任何进展的代码。

from django.shortcuts import render
from .forms import FaceAdditionForm
import cv2
import numpy as np
from django.http import StreamingHttpResponse

def capture_video_from_cam():
    cap = cv2.VideoCapture(0)
    currentFrame = 0
    while True:

        ret, frame = cap.read()

        # Handles the mirroring of the current frame
        frame = cv2.flip(frame,1)
        currentFrame += 1

def addfaces(request):
    add_faces_form = FaceAdditionForm()
    if add_faces_form.is_valid():
        add_faces_form.save()
    return render(request, 'base.html', {'add_faces': add_faces_form})


def show_video_on_page(request):
    resp = StreamingHttpResponse(capture_video_from_cam())
    return render(request, 'base.html', {'video': resp})

【问题讨论】:

    标签: python django opencv live-streaming


    【解决方案1】:

    上述问题的解决方案是这样的:

    views.py

    from django.views.decorators import gzip
    from django.http import StreamingHttpResponse
    import cv2
    import threading
    
    class VideoCamera(object):
        def __init__(self):
            self.video = cv2.VideoCapture(0)
            (self.grabbed, self.frame) = self.video.read()
            threading.Thread(target=self.update, args=()).start()
    
        def __del__(self):
            self.video.release()
    
        def get_frame(self):
            image = self.frame
            _, jpeg = cv2.imencode('.jpg', image)
            return jpeg.tobytes()
    
        def update(self):
            while True:
                (self.grabbed, self.frame) = self.video.read()
    
    
    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 livefe(request):
        try:
            cam = VideoCamera()
            return StreamingHttpResponse(gen(cam), content_type="multipart/x-mixed-replace;boundary=frame")
        except:  # This is bad! replace it with proper handling
            pass
    

    然后在 urls.py 中将其映射到一个 url。

    【讨论】:

    • 上面的代码工作正常。您能告诉我如何修改此代码,以便它从相机读取帧,但不需要在屏幕上显示帧。基本上,我想读取相机输入,而不是在屏幕上显示给用户。
    • 感谢您的解决方案。我有一个与此相关的查询。此解决方案在整个网页上显示图像并不断重新加载。我需要使用相机实时源更新某些 div 或图像源。请帮忙。我在问是否可以使用上下文来完成,因为我们在 views.py 中的渲染中传递上下文
    • @anshumansingh 这是一个快速破解。很快就会寻找更好的解决方案。
    • @AniketMaithani 我找到了一个解决方案。我已经向这个实时视频源公开了一个 url,然后将此 url 设置为图像的源,它工作正常。我尝试从 StreamingHttpResponse 中提取内容,但不能。如果您有更好的解决方案,请分享。
    • @AniketMaithani,我想试试你的代码,但由于我是 django 和 python 的新手,你有什么参考资料可以让我读到你的代码。我曾尝试关注一些文章,但在 html 中添加代码时仍然感到困惑
    猜你喜欢
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多