PiCamera Flask, start and stop preview
我正在 Flask 中创建一个小的 Web 界面,以使用 PiCamera python 模块控制 Raspberry Pi 相机。我有一个显示来自相机的流的工作索引页面。但是,当我通过输入按钮发布 stop_preview() 时,应用程序失败,我无法弄清楚我做错了什么。到目前为止,这是我的一些代码。
这是我的观点的一部分。py
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
from flask import redirect, url_for, session, request, \\
render_template, Response from simplepam import authenticate from app.camera_pi import Camera from app import app
@app.route(‘/’, methods=[‘GET’, ‘POST’])
def gen(camera):
@app.route(‘/video_feed’) |
这是我的 index.html 模板。
1
2 3 4 5 6 7 8 9 10 11 12 13 |
<!DOCTYPE html>
<html> |
这是 camera_pi.py 文件(取自 Miguel Grinberg 的 github 存储库 https://github.com/miguelgrinberg/flask-video-streaming)
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# The MIT License (MIT)
# # Copyright (c) 2014 Miguel Grinberg # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the”Software”), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED”AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE.
import time
class Camera(object): def initialize(self): # wait until frames start to be available def get_frame(self): def StopPreview(): @classmethod # let camera warm up stream = io.BytesIO() # reset stream for next frame # if there hasn’t been any clients asking for frames in |
我添加了”def StopPreview()”部分,当我从索引页面发布提交按钮时,它被调用,但此时应用程序崩溃了。
提前感谢您提供的任何帮助。
- “只是崩溃”是什么意思?你有追溯吗?在这里张贴
- 是的,回溯是:picamera.exc.PiCameraMMALError:无法启用相机组件:资源不足(内存除外)
- 在Flask中尝试另一个网络摄像头流式传输。它以替代方法实现。 github.com/36rahu/webcam_streaming_flask
首先,picamera的start_preview和stop_preview方法只是启动和停止预览,也就是出现在Pi自带显示器上的叠加视频。这些方法不会启动或停止相机本身。
要停止摄像头,您必须让方法 _thread 中的后台线程退出,这与它在 10 秒不活动过去时退出的方式类似。
例如,您可以向对象添加一个 stop_camera 变量,并使用 False 进行初始化。在您的停止方法中,您只需将变量翻转为 True 并返回。然后在后台线程中,根据条件中此变量的值添加第二个条件,检查 10 秒的非活动状态。
希望这会有所帮助!
- 嗨,米格尔,感谢您的回复。我已经修改了上面的 camera_pi.py,现在按照您的建议包含了一个 stop_camera 变量,但是现在我收到了一个回溯错误,其中指出:ValueError:查看函数没有返回响应。此外,虽然这会停止相机,但我也希望能够在不刷新整个页面的情况下重新加载预览,停止和启动相机是实现这一目标的最佳方式,还是我能够停止并启动预览不知何故?
- view function did not return a response 错误无关。你所有的 Flask 路由都必须返回一个响应,即使它是一个空字符串。您在其中一条路线中遗漏了这一点,我猜您添加的路线是为了停止相机。要重新启动相机,只需添加另一个启动新后台线程的路由。
- 嗨,米格尔,我仍在努力解决这个问题。请您提供一些代码示例吗?
- @RyanKowalewski 我没有任何现成的东西,我拥有的是我在博客文章和 GitHub 存储库中写的东西。对不起。
来源:https://www.codenong.com/37763294/