OpenCV视频流截图

本文介绍了如何使用OpenCV进行视频流截图,最初遇到的问题是截图不实时,通过分析发现每次read操作获取的是上一帧。为了解决这个问题,尝试使用多线程后台持续读取视频流并在接收到请求时返回最新帧,但遇到gunicorn的gevent导致的协程执行问题。修改gunicorn配置,避免使用gevent作为worker_class,解决了截图延迟问题。
摘要由CSDN通过智能技术生成

最近做了一个需求是接收到请求后,从摄像头里截取实时的图片。
最开始的思路是写一个全局变量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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值