【问题标题】:How do I make images render properly using Django Streaming HTTPS Response?如何使用 Django Streaming HTTPS 响应正确呈现图像?
【发布时间】:2016-04-15 19:19:45
【问题描述】:

我在 Python 中编写了一些代码,它利用OpenCV(以及其他包)逐帧遍历选定的视频,检查该帧是否有人(见here),然后返回所有找到一个人的框架。

目标(目前)是在网络浏览器中动态显示这些图像。我用这个答案作为指导:How to stream an HttpResponse with Django

我的代码如下:

def stream_response(request):
    return StreamingHttpResponse(detect())

def detect():
    frame_count=0
    while(frame_count < num_frames):
        ret, frame = capture.read()
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        image_pil=Image.fromarray(gray)
        response = HttpResponse(content_type="image/jpeg")
        image_pil.save(response, "JPEG")
        yield response
        yield ""*1024
        time.sleep(1)
        frame_count+=1

但是,当我使用 Django 中的 StreamingHTTPResponse 功能产生响应(实现generator 的方法)时,我在浏览器中看到的响应是乱码(见下图)。

但是,当我使用 HTTPResponse 返回响应时,当定向到相应的端口时,图像在浏览器中显示良好。

我尝试了各种测试,但仍然无法弄清楚。我的理论是这可能是由于浏览器无法在给定时间内渲染图像,但我不确定......

更新:最终直接从 Python 生成 HTML 用于原型应用程序。这对当前的目的起到了作用,但会重新探索这一点。

【问题讨论】:

  • 只能返回一张图片/请求让浏览器正确显示。

标签: python django opencv


【解决方案1】:

您需要像Celery 这样的分布式任务队列系统。您可以按照以下方式制作您的应用程序

你的主页(从哪里开始执行流程)

  1. 要求用户上传视频

  2. 将此视频文件保存在服务器上

  3. 在数据库中添加针对视频的条目

  4. 使用视频记录的 id 调用检测异步任务,并将返回的任务 id 保存在数据库中针对视频 记录
  5. 将您的用户重定向到带有视频 ID 的成功页面

在成功页面

  1. 显示成功消息
  2. 使用 javascript 调用具有视频 ID 的状态 Web 服务,并相应地一次又一次地更新页面(动态加载图像),直到您收到状态完成。

在状态网络服务中

  1. 使用视频 ID 获取任务 ID

  2. 检查任务状态

  3. 使用视频 ID 从数据库中获取图像(您的异步任务在后台将图像放入数据库)

  4. 返回状态(已完成或正在进行)和图像列表

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 2021-01-05
    • 2013-11-03
    • 2021-12-14
    • 2019-08-18
    • 1970-01-01
    • 2018-04-25
    • 2018-12-04
    相关资源
    最近更新 更多