我使用Flask创建了一个Web应用程序,以便通过HTTP请求触发检测程序。
基本上,每次将GET请求发送到端点URL时,我都希望执行一个函数。
我正在使用的代码是:
web_app = Flask(__name__)
@web_app.route('/test/v1.0/run', methods=['GET'])
def main():
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
while(True):
ret, frame = cap.read()
***performing operations on each frame and running ML models on them***
return ('', 204)
if __name__ == '__main__':
web_app.run(debug=True)
如果我使用的话,一切都在第一次正常运行
curl -i http://localhost:5000/test/v1.0/run
执行main()函数,最后将结果上传到在线数据库。
此后,程序将继续侦听URL。如果我发送另一个GET请求,则将再次执行main(),但它会在while循环的第一次迭代后挂起。
我尝试通过将相同的代码放置在for循环中多次简单地运行同一代码:
for i in range(10):
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
while(True):
ret, frame = cap.read()
***performing operations on each frame and running ML models on them***
它可以正常工作,因此挂起操作不应依赖于我在代码内所做的任何事情。
该问题可能是由于我正在使用flask来触发函数这一事实引起的,但是在这种情况下,我不理解为什么main()在启动后会挂起。一般而言,我对Flask和Web应用程序还很陌生,所以这里可能缺少一些非常简单的内容。
答案 0 :(得分:0)
问题是我还使用
显示了从相机收集的帧cv2.imshow("window", frame)
并且,即使在程序结束时,我也可以通过以下方式关闭所有内容:
cap.release()
cv2.destroyAllWindows()
某些东西仍然挂着,使进程陷入了下一次迭代。 我通过删除cv2.imshow解决了...我真的不需要可视化流,因此我可以使用它。 不过,通常出于好奇,我会尝试找出如何使它即使在可视化视频帧时也能正常工作。