优化实时视频帧捕获Python/cv2

问题描述 投票:0回答:1

我有一个线程专门用于从相机读取帧,旨在以特定频率读取(

self.target_fps
)。因此,我需要每隔
self.target_frequency = 1 / self.target_fps
执行一次读取。

视频线程运行一个循环,无论目标频率 (target_fps) 如何,它都会在每次迭代时读取数据,以清空 VideoCapture 缓冲区(当 self.target_fps 较低时特别有用,例如 1 fps)。读取后,我只想在正确的时间将帧添加到队列中,即,如果已经过了等于 self.target_Frequency 的时间间隔。 “

start
”计时器帮助我确定 何时需要将帧放入队列以及何时不需要 。是否有更好的方法来有效地从 RTSP 相机读取帧并实现合理的准确帧速率?

            self.target_fps = 7
            self.target_frequency = 1 / self.target_fps

            start = time.time()

            while not self.stop_video_thread.is_set():
                success, frame = cap.read()

                interval = time.time() - start

                if interval >= self.target_frequency:
                    start = time.time()

                    if success:
                        frame_queue.put_nowait(frame)
python multithreading opencv video-capture
1个回答
0
投票
  • 您可以使用
    set
    VideoCapture
    方法来调整相机的帧率。例如,
    cap.set(cv2.CAP_PROP_FPS, self.target_fps)
    会将帧速率设置为您想要的值。这样就不需要每次读一帧都检查间隔了。
  • 您可以使用
    threading.Timer
    对象来安排定期读取帧。例如,
    timer = threading.Timer(self.target_frequency, read_frame)
    将创建一个计时器,每隔
    read_frame
    秒调用
    self.target_frequency
    函数。比 while 循环更好
  • 您可以使用
    multiprocessing.Queue
    而不是
    queue.Queue
    在进程之间共享帧。因此您可以避免 酸洗和取消酸洗框架的开销。
import cv2
import threading
import multiprocessing as mp

def read_frame(cap, frame_queue):
    success, frame = cap.read()
    if success:
        frame_queue.put(frame)
    timer = threading.Timer(self.target_frequency, read_frame, args=(cap, frame_queue))
    timer.start()

def main():
    # Create a video capture object and set the frame rate
    cap = cv2.VideoCapture('rtsp_address')
    cap.set(cv2.CAP_PROP_FPS, self.target_fps)

    frame_queue = mp.Queue()

    timer = threading.Timer(self.target_frequency, read_frame, args=(cap, frame_queue))
    timer.start()

    while True:
        frame = frame_queue.get()
        # Process the frame here
        #########################
© www.soinside.com 2019 - 2024. All rights reserved.