0

我使用 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()在启动后会挂起。一般来说,我对烧瓶和 Web 应用程序很陌生,所以我可能在这里遗漏了一些非常简单的东西。

4

1 回答 1

0

问题是我还显示了从相机收集的帧,使用

cv2.imshow("window", frame)

而且,即使在程序结束时我通过以下方式关闭所有内容:

cap.release()
cv2.destroyAllWindows()

某些东西仍然悬而未决,并且使该过程在下一次迭代中停滞不前。我通过删除 cv2.imshow 解决了...我真的不需要可视化流,所以我可以忍受它。不过,主要是出于好奇,我会尝试弄清楚如何使它工作,即使在可视化视频帧时也是如此。

于 2020-10-08T07:49:04.067 回答