Opencv读取RTSP进行图像处理延迟高的解决方法

最近的项目需要用Opencv读取rtsp流,然后进行目标检测和跟踪,由于图像处理算法的速度不快,在读取RTSP流后再处理会有非常大的延时(十几秒)。解决方法是创建一个线程专门用于抓取帧

代码如下,主体部分来源于国外某网友,可以根据自己的情况更改

from threading import Thread
import cv2
import time
from mmtrack.apis import inference_mot, init_model  #导入mmtrack进行目标跟踪
from torchvision import transforms

class VideoScreenshot(object):
    def __init__(self, src=0):
        # Create a VideoCapture object
        self.capture = cv2.VideoCapture(src)

        # Take screenshot every x seconds
        self.screenshot_interval = 0.5

        # Default resolutions of the frame are obtained (system dependent)
        self.frame_width = int(self.capture.get(3))
        self.frame_height = int(self.capture.get(4))

        # Start the thread to read frames from the video stream
        self.thread = Thread(target=self.update, args=())
        self.thread.daemon = True
        self.thread.start()

    def update(self):
        # Read the next frame from the stream in a different thread
        while True:
            if self.capture.isOpened():
                (self.status, self.frame) = self.capture.read()

    def show_frame(self):
        # Display frames in main program
        if self.status:
            ## 这一块儿是目标跟踪和显示的代码
            result = inference_mot(model, self.frame, frame_id=self.frame_count)
            new_img = model.show_result(
                self.frame,
                result,
                score_thr=score_thr,
                show=show,
                wait_time=0,
                out_file=None,
                backend=backend)
            cv2.imshow('frame', self.frame)

        # Press Q on keyboard to stop recording
        key = cv2.waitKey(1)
        if key == ord('q'):
            self.capture.release()
            cv2.destroyAllWindows()
            exit(1)

    def save_frame(self):
        # Save obtained frame periodically
        self.frame_count = 0
        def save_frame_thread():
            while True:
                try:
                    cv2.imwrite('pools/frame_{}.png'.format(self.frame_count), self.frame)
                    self.frame_count += 1
                    time.sleep(self.screenshot_interval)
                except AttributeError:
                    pass
        Thread(target=save_frame_thread, args=()).start()

if __name__ == '__main__':
    rtsp_stream_link = 'RTSP链接'
    video_stream_widget = VideoScreenshot(rtsp_stream_link)
    video_stream_widget.save_frame()
    
    ## 这一块是目标跟踪的代码
    checkpoint = 'work_dirs/epoch_28.pth'
    config = 'work_dirs/train_cfg.py'
    score_thr = 0.0
    show = False
    device = 'cuda:0'
    backend = 'cv2'
    model = init_model(config, checkpoint, device=device)


    while True:
        try:
            video_stream_widget.show_frame()
        except AttributeError:
            pass
  • 0
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
树莓派使用OpenCV进行图像处理时,可能会遇到摄像头图像延迟的问题。这种延迟是由于图像采集、传输和处理所需的时间造成的。延迟会导致实时图像处理的效果受到一定影响,特别是在需要实时反馈的应用中。 为了解决树莓派使用OpenCV的图像延迟问题,我们可以采取以下几种方法: 1. 降低分辨率:降低图像的分辨率可以减少处理的数据量,从而减少延迟。通过适当降低分辨率,可以在一定程度上提处理速度和实时性。 2. 优化算法:对于图像处理的算法,可以进行一定的优化。例如,选择更效的算法或者使用并行计算技术,以提处理速度和性能。 3. 使用硬件加速:利用树莓派的GPU进行图像处理所需的运算,可以大大提处理速度。通过使用OpenCV的硬件加速功能,可以减少延迟并提性能。 4. 缓存机制:在图像处理中,可以采用缓存机制来提处理效率。通过对图像数据进行缓存,可以减少传输和处理的时间,从而减少延迟。 5. 多线程处理:在树莓派上可以使用多线程技术进行图像处理。将图像采集和处理分别放在不同的线程中,可以提处理的实时性和性能。 总之,使用树莓派进行图像处理时,我们可以通过降低分辨率、优化算法、使用硬件加速、使用缓存机制和多线程处理等方法解决摄像头图像延迟的问题,从而提图像处理的实时性和性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学CV的老张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值