我正在使用IP摄像头。我可以使用这样的URL从相机中获取静态图像:
http://Username:Password@IP_of_Camera:Port/streaming/channels/1/picture
我想要做的是让python / flask在客户端加载页面时从该URL下载图像,并使用img标记将图像嵌入到页面中。
如果我的模板看起来像这样:
<html>
<head>
<title>Test</title>
</head>
<body>
<img src="{{ image }}">
</body>
</html>
如何用下载的图片替换{{image}}?
我是否会使用urllib / requests将图像下载到flask的静态文件夹中,用{{ url_for('static', filename="temp_image.png") }}
替换{{image}},然后在页面加载时从静态文件夹中删除图像?我会在其他地方下载它(静态文件夹除外)吗?或者是否有其他方法可以将图像保存在内存中?
PS。我知道可以直接用该URL替换{{image}},但是会向客户端显示相机的用户名/密码/ IP /端口。
答案 0 :(得分:6)
我会在烧瓶上添加一个屏蔽路径,直接取出并提供图像。
让我们说domain.com/image/user1/cam1
您的服务器通常会向摄像头发出http请求,一旦收到回复,您可以直接将其作为具有适当mimetype的Response
对象提供。
在这种情况下,从相机获取的图像位于RAM中。
@app.route('image/<userID>/<camID>')
def fun(userID,camID):
# fetch the picture from appropriate cam
pic = requests.get('http://'+
'Username:Password'+ # dynamically replace user id / password/ auth
'@IP_of_Camera:Port'+ #dynamically replace port / IP
'/streaming/channels/1/picture')
# do processing of pic here..
return Response(pic,mimetype="image/png")
但是,如果需要一遍又一遍地提供此图像,那么您可能想要缓存它。在这种情况下,我会选择更接近你的方法的东西。
如果你想要流式传输相机图像,这是一个完全不同的球赛。
答案 1 :(得分:1)
import requests
url = "http://Username:Password@IP_of_Camera:Port/streaming/channels/1/picture"
response = requests.get(url)
if response.status_code == 200:
f = open("/your/static/dir/temp.png", 'wb')
f.write(response.content)
f.close()
{{ url_for('static' filename="temp.png") }}
不确定为什么你需要删除它,但我想你可以认为这是必需的