OpenCV 中跳过帧并寻找 RTSP 流的末尾

2023-11-21

我在 Raspberry Pi 上的 OpenCV 3.4.2 中捕获并处理 IP 摄像头 RTSP 流。不幸的是,处理需要相当长的时间,每帧大约 0.2 秒,并且流很快就会延迟。

我不介意跳过一些帧,因此我正在寻找一种方法在捕获和处理下一帧之前寻找流的末尾。

vcap = cv2.VideoCapture("rtsp://{IPcam}/12")

while(1):
    ret, frame = vcap.read()
    time.sleep(0.2)              # <= Simulate processing time
    cv2.imshow('VIDEO', frame)
    if cv2.waitKey(1) == 27:
        break
    vcap.seek_to_end()           # <== How to do this?

我怎样才能做到这一点vcap.seek_to_end()赶上流,丢弃丢失的帧,并开始处理最新的帧?

Thanks!


尝试这个:

vcap = cv2.VideoCapture("rtspsrc location=rtsp://{IPcam}/12!decodebin!videoconvert!appsink max-buffers=1 drop=true")

这使用 gstreamer 来抓取您的相机源,并将维护长度为 1 的缓冲区,并在收到新的传入帧时丢弃最旧的缓冲区。然后,每次你打电话vcap.read()你应该得到最新的帧。

如果您发现 CPU 使用率非常高,您还可以尝试在 Raspberry Pi 上使用 OMX 解码器,因为这将在 GPU 上解码视频(假设是 h264):! rtph264depay ! h264parse ! omxh264dec ! appsink max-buffers=1 drop=true

您可能需要重新编译 OpenCV,因为默认情况下它是使用 FFMPEG 支持而不是 gstreamer 编译的。这个很简单,只要通过-D WITH_GSTREAMER=ON -D WITH_FFMPEG=OFF to the cmake命令。确保您已安装 gstreamer 开发库apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV 中跳过帧并寻找 RTSP 流的末尾 的相关文章

随机推荐