将cv2帧从视图传递到模板

时间:2017-09-22 21:02:59

标签: python django

基本上,我的django应用程序需要在视图中创建一个图像,并将其传递给模板。对于字符串来说这很容易,但我无法找到一种方法来处理图像。我已经阅读了很多堆栈溢出线程,但没有一个像我的,这是令人惊讶的。

我正在尝试将此变体视为我的观点:

views.py:

def index(request):
  while (True):

    #video_capture = cv2.VideoCapture(0)
    #ret, frame = video_capture.read()

    img = "D:/Desktop/Tap/bsnsFaces.jpg"
    frame = cv2.imread(img)
    facesNumber ="Found {0} faces!".format(len(faces))

    return render(request, 'result.html', {'p': facesNumber}, {'img': frame})`

最后 {'img':frame} 部分不靠近右边。我尝试了一些我在SO上找到的东西,但到目前为止没有任何效果。我知道图像是静态的,但最终我希望这是一个从网络摄像头捕获的帧,所以我无法通过使用模型来解决这个问题(或者我可以吗?)。

提前感谢任何建议!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Face detection with Django</title>
    <p>{{ p }}</p>
    <img src="data:image/jpg;base64, {{ img }}"></img>
</head>
<body>

</body>
</html>

1 个答案:

答案 0 :(得分:2)

我建议对帧进行base64编码并传递该字符串。这样,您可以将动态生成的图像从视图传递到result.html进行渲染。然后,您可以在result.html中显示base64图像。

<强> views.py

import cv2
import base64

def index(request):
  #while (True): #Note: This loop is pointless, it will break when you return.

    #video_capture = cv2.VideoCapture(0)
    #ret, frame = video_capture.read()

    img = "D:/Desktop/Tap/bsnsFaces.jpg"
    frame = cv2.imread(img)
    ret, frame_buff = cv2.imencode('.jpg', frame) #could be png, update html as well
    frame_b64 = base64.b64encode(frame_buff)
    facesNumber ="Found {0} faces!".format(len(faces))

    # Note this was fixed to be one dict with the context variables
    return render(request, 'result.html', {'p': facesNumber, 'img': frame_b64})

<强> result.html

   <img src="data:image/jpeg;base64, {{img}}"></img>

只是基于你的while循环的注释,如果你想不断地从网络摄像头更新页面,这应该在客户端完成。否则,您需要不断刷新页面以查看图像更新。客户端(result.html)可以使用AJAX轮询服务器以进行映像更新,并在不实际重新加载整个result.html页面的情况下刷新自身。