我有一个线程专门用于从相机读取帧,旨在以特定频率读取(
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)
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
#########################