Flask使用OpenCV视频流截图

本文介绍了如何在Flask应用中利用OpenCV实现从视频流中获取实时截图。首先尝试通过全局变量读取视频帧,但发现并非实时。改进方案是每次请求时重新初始化VideoCapture,虽然能获取实时画面但增加延迟。最终,通过后台线程持续读取视频流并保存当前帧,解决了延迟问题。然而,当使用gunicorn部署时,由于gunicorn的greenlet特性导致问题,将worker_class由"gevent"改为默认设置后恢复正常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做了一个需求是接收到请求后,从摄像头里截取实时的图片。
最开始的思路是写一个全局变量cap = cv2.VideoCapture(url),然后在flask的方法里执行cap.read()取出当前的帧,但是发现这样取到的图片不是实时的,基本上是和摄像头建立连接时的截图。原因是,每次执行read时,取到的是上一次截图的下一帧,而不是当前时间里视频流里的图片。
后面改成了每次接收到请求后,都执行一次cap = cv2.VideoCapture(url),然后执行cap.read(),再cap.release()。这样能够取到实时的截图,缺点是每次都需要重新建立一次连接,耗时要1秒左右。
要想解决耗时问题,需要在后台执行一个线程,不停地read视频流,把当前帧记录下来,在接收到请求后,直接返回这个帧。
这里有段代码可以参考 https://www.v2ex.com/t/594221

import threading
import cv2


class NewVideoCapture:
    def __init__(self, url, *args, **kwargs):
        self.frame_receiver_thread = threading.Thread(target=self.recv_frame)
        self._cur_frame = None
        self._reading = False
        if isinstance(url, str) and url.startswith(("rtsp://", "rtmp://")):
            self._reading = True
        else:
            raise ValueError('url格式不对')
        self
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值