我对python和flask很陌生,并且在Miguel Grinberg的博客上看到了“用flask进行视频流传输”的很好的例子。我现在正尝试做类似的事情,但是将我的烧瓶应用程序放在基于云的服务器上(以后将需要用于云计算)。
这意味着我需要使用另一个脚本将摄像机的视频提要发送到云服务器,因为我无法再直接从flask应用程序访问摄像机。我发现了如何通过POST请求发送图像,但是当我访问云服务器的URL时,仅出现html标题(“视频流演示”),而没有显示来自视频的图像,因此我无法弄清楚是什么出问题了...有人可以让我走上正确的路吗?
这是我在云服务器上运行的烧瓶应用程序:
from flask import Flask, jsonify, request, render_template, Response
import cv2
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
return render_template('index.html')
@app.route('/video_feed', methods=['GET', 'POST'])
def video_feed():
return Response(gen(request),
mimetype='multipart/x-mixed-replace; boundary=newframe')
def gen(request):
while True:
frame = request.data
yield (b'--newframe\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
if __name__ == '__main__':
app.run(host='0.0.0.0', debug=True)
这是我用来将图像发送到云服务器的python代码:
import cv2
from PIL import Image
from six import StringIO
import requests
cap = cv2.VideoCapture(0)
# prepare headers for http request
content_type = 'image/jpeg'
headers = {'content-type': content_type}
# stream continuous loop of .jpg images from the camera to the requested url
while True:
ret, frame = cap.read()
cv2.imshow('frame', frame)
cv2.waitKey(1)
#if cv2.waitKey(1) and 0xFF == ord('q'):
ret, jpeg = cv2.imencode('.jpg', frame)
imgdata = jpeg.tobytes()
response = requests.post(
url='https://www.servername.com/serve/video_feed',
data=imgdata
#headers=headers
)
#break
cap.release()
cv2.destroyAllWindows()
非常感谢您的帮助!