今日学习:openCV 拉流

本文介绍了如何在OpenCV中利用`cv2.VideoCapture`从网络流(如RTSP或HTTP)拉取视频,并通过队列机制实现线程安全和内存管理,同时展示了如何处理队列中的帧并显示处理后的视频。
摘要由CSDN通过智能技术生成

在openCV中,可以用cv2.VideoCapture 方法来从各种源拉取视频流,包括本地文件,摄像头,以及网络流(如RTSP,HTTP).下面是一个简单的方法,说明如何使用openCV从网络中拉取视频.

额外学习:中间添加了队列,添加队列对线程安全,内存控制等方面有多个好处.

#引用

import cv2

from que import Queue

##创建一个队列,我这里最大容量为2

frame_queue = Queue(maxsize=2)

#定义拉流函数

def capture_stream(stream_url):

        cap = cv2.VideoCapture(stream_url)

        while True:

                ret,frame =cap.read()

                if not ret :

                        print("Faild to grab frame")

                        break

              #  如果队列已满,丢弃最旧的帧(即队列里的第一帧)

                if frame_queue.full():

                        frame_queue.get() 

              #放入新帧

                frame_queue.put(frame)

                if cv2.waitKey(1) &0xFF == ord('q'):

                        break

        cap.release()

        cv2.destroyAllWindows()   

 #定义处理队列中帧的函数

def process_frame():

        while True:

                if not frame_queue.empty():

                #获取队列中的帧进行处理

                frame = frame_queue.get()

                #这里处理帧

                #       '''         

                #显示帧

                cv2.imshow('Processed Frame',frame)

                

                if cv2.waitKey(1) & 0xFF == ord('q'):
                        break

#整体代码:

import cv2
from queue import Queue

# 创建一个最大容量为2的队列
frame_queue = Queue(maxsize=2)

# 定义拉流函数
def capture_stream(stream_url):
    cap = cv2.VideoCapture(stream_url)
    while True:
        ret, frame = cap.read()
        if not ret:
            print("Failed to grab frame")
            break
        
        # 如果队列已满,丢弃最旧的帧(即队列中的第一帧)
        if frame_queue.full():
            frame_queue.get()
        
        # 放入新帧
        frame_queue.put(frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

# 定义处理队列中帧的函数
def process_frames():
    while True:
        if not frame_queue.empty():
            # 获取队列中的帧进行处理
            frame = frame_queue.get()
            # 这里处理帧
            # ...
            # 显示帧
            cv2.imshow('Processed Frame', frame)

            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

 

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值