基本上,我的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>
答案 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页面的情况下刷新自身。