Ini adalah masalah umum pada aliran RTSP dan algoritme yang memakan waktu seperti kerangka pembelajaran mendalam. Anda menjadi tidak sinkron jika setiap frame membutuhkan waktu lebih lama daripada kecepatan frame streaming Anda untuk diproses. Ada peningkatan penundaan antara kenyataan dan gambar yang diambil.
Ada dua kemungkinan solusi untuk masalah ini.
Kode tersebut berbicara sendiri. Anda dapat menggunakan GStreamer dari FFmpeg untuk membuka streaming.
Jumlah kamera yang terhubung tidak dibatasi. Bahkan bisa jadi hanya satu kamera.
Namun, semakin banyak kamera, semakin banyak waktu CPU yang diperlukan untuk mengunjungi semua thread terpisah.
Untuk menjalankan aplikasi, Anda harus:
Buat jalur pembangunan dan bangun proyek dengan cmake sebagai berikut:
rm -rf build && mkdir -p build && cd build
cmake .. && make
Alternatifnya, Anda juga dapat membangun proyek menggunakan Code::Blocks yang Anda perlukan untuk menginstalnya ( $ sudo apt-get install codeblocks
).
Gunakan hanya koneksi Ethernet kabel untuk streaming RTSP Anda. Wi-Fi bisa jadi tidak stabil.
Karena protokol RTSP sensitif terhadap satu frame saja yang hilang, streaming dapat dengan mudah crash.
Jika Anda menggunakan streaming di aplikasi pembelajaran mendalam, sesuaikan resolusi dan kecepatan frame dengan persyaratan model pembelajaran mendalam.
Mengirim streaming 1280x960 pada 30 FPS bukanlah ide yang baik jika model Anda memiliki input 416x416 dan memerlukan 200 mSec untuk memproses satu frame. Ini hanya memerlukan memori ekstra dan daya pemrosesan.
Pastikan semua kamera memiliki resolusi yang sama. Dalam contoh ini, algoritma gabungan OpenCV sensitif terhadap resolusi yang berbeda. Ini memunculkan pengecualian ketika menghadapi lebar atau tinggi yang berbeda.
Harap dicatat bahwa kamera tidak disinkronkan satu sama lain melalui utas. Mereka mungkin memiliki kelambatan yang sedikit berbeda.
Jika Anda ingin melakukan streaming UDP atau TCP, pastikan streaming tersebut berfungsi dengan prompt baris perintah sebelumnya. Jika tidak, pastinya tidak akan berfungsi di OpenCV. Seringkali kesalahan disebabkan oleh pengkodean dalam pipeline, alamat, atau modul yang hilang. Jika Anda perlu menginstal modul GStreamer tambahan, Anda juga perlu membangun kembali OpenCV Anda! Untuk informasi lebih lanjut, lihat situs web kami.
Untuk menjalankan aplikasi, muat file proyek MultiThread.cbp di Code::Blocks.
Jika Anda menggunakan Jetson Nano , Anda harus mengubah lokasi tempat OpenCV menyimpan file headernya ke /usr/include/opencv4
Pada baris 23 di main.cpp aliran ditentukan.
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);
Pengirim: RaspiCam dengan Raspberry Pi Buster OS
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
Pengirim: RaspiCam dengan OS Raspberry Pi Bullseye
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
Catatan, host=192.168.178.84
adalah alamat IP penerima.
Grb1->Init("tcpclientsrc host=192.168.178.129 port=5000 ! jpegdec ! videoconvert ! appsink", cv::CAP_GSTREAMER);
Pengirim: RaspiCam dengan Raspberry Pi Buster OS
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
Pengirim: RaspiCam dengan OS Raspberry Pi Bullseye
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
Catatan, host=192.168.178.32
adalah alamat IP pengirim.
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