這是 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