这是 RTSP 流和深度学习框架等耗时算法的一个已知问题。如果单个帧的处理时间比流的帧速率长,您就会失去同步。现实与捕捉到的图像之间的延迟越来越大。
该问题有两种可能的解决方案。
代码本身就说明了一切。您可以使用 FFmpeg 的 GStreamer 打开流。
连接的摄像机数量不受限制。它甚至可能只是一台相机。
然而,摄像头越多,访问所有单独线程所需的 CPU 时间就越多。
要运行该应用程序,您必须:
创建构建路径并使用 cmake 构建项目,如下所示:
rm -rf build && mkdir -p build && cd build
cmake .. && make
或者,您也可以使用需要安装的 Code::Blocks 来构建项目( $ sudo apt-get install codeblocks
)。
仅对 RTSP 流使用有线以太网连接。 Wi-Fi 可能不稳定。
由于 RTSP 协议对哪怕只是一帧丢失都很敏感,因此流很容易崩溃。
如果您在深度学习应用程序中使用流,请根据深度学习模型的要求调整分辨率和帧速率。
如果您的模型具有 416x416 输入并且需要 200 毫秒处理单个帧,那么以 30 FPS 发送 1280x960 流并不是一个好主意。它只需要额外的内存和处理能力。
确保所有相机具有相同的分辨率。在示例中,OpenCV 连接算法对不同的分辨率很敏感。当它面对不同的宽度或高度时,它会抛出异常。
请注意,相机之间并不通过线程同步。它们的滞后可能略有不同。
如果您想要流式传输 UDP 或 TCP,请确保流事先在命令行提示符下工作。如果没有,它们肯定无法在 OpenCV 中工作。错误通常是由管道中的编码、地址或丢失的模块引起的。如果您需要安装额外的 GStreamer 模块,您还需要重建 OpenCV!欲了解更多信息,请访问我们的网站。
要运行应用程序,请在 Code::Blocks 中加载项目文件 MultiThread.cbp。
如果您使用的是Jetson Nano ,则必须将 OpenCV 存储头文件的位置更改为/usr/include/opencv4
在 main.cpp 的第 23 行定义了流。
Grb1->Init("rtsp://192.168.178.129:8554/test/");
Grb1->Init("udpsrc port=5200 ! application/x-rtp, media=video, clock-rate=90000, payload=96 ! rtpjpegdepay ! jpegdec ! videoconvert ! appsink", cv::CAP_GSTREAMER);
发送者:带有 Raspberry Pi Buster操作系统的 RaspiCam
gst-launch-1.0 -v v4l2src device=/dev/video0 num-buffers=-1 ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! jpegenc ! rtpjpegpay ! udpsink host=192.168.178.84 port=5200
发送者:带有 Raspberry Pi Bullseye操作系统的 RaspiCam
gst-launch-1.0 -v libcamerasrc ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! jpegenc ! rtpjpegpay ! udpsink host=192.168.178.84 port=5200
注意, host=192.168.178.84
是接收方的 IP 地址。
Grb1->Init("tcpclientsrc host=192.168.178.129 port=5000 ! jpegdec ! videoconvert ! appsink", cv::CAP_GSTREAMER);
发送者:带有 Raspberry Pi Buster操作系统的 RaspiCam
gst-launch-1.0 -v v4l2src device=/dev/video0 num-buffers=-1 ! video/x-raw,width=640,height=480, framerate=30/1 ! videoconvert ! jpegenc ! tcpserversink host=192.168.178.32 port=5000
发送者:带有 Raspberry Pi Bullseye操作系统的 RaspiCam
gst-launch-1.0 -v libcamerasrc ! video/x-raw,width=640,height=480, framerate=30/1 ! videoconvert ! jpegenc ! tcpserversink host=192.168.178.32 port=5000
请注意, host=192.168.178.32
是发件人的 IP 地址。
Grb1->Init("libcamerasrc ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! videoscale ! video/x-raw, width=640, height=480 ! appsink", cv::CAP_GSTREAMER);
Grb1->Init("v4l2src device=/dev/video0 ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! videoscale ! video/x-raw, width=640, height=480 ! appsink", cv::CAP_GSTREAMER);
Grb1->Init(0);
Grb1->Init(0); //if RaspiCam is not connected
Grb2->Init(1); //if RaspiCam is connected