我在 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(使用前将#替换为@)