Il s'agit d'un problème connu avec les flux RTSP et les algorithmes chronophages tels que les frameworks d'apprentissage en profondeur. Vous êtes désynchronisé si le traitement des images individuelles prend plus de temps que la fréquence d'images de votre flux. Il y a un décalage croissant entre la réalité et les images capturées.
Il existe deux solutions possibles à ce problème.
Le code parle de lui-même. Vous pouvez soit utiliser GStreamer ou FFmpeg pour ouvrir le flux.
Le nombre de caméras connectées n'est pas limité. Il pourrait même s’agir d’une seule caméra.
Cependant, plus il y a de caméras, plus il faut de temps CPU pour visiter tous les threads séparés.
Pour exécuter l'application, vous devez :
Créez un chemin de construction et construisez le projet avec cmake comme suit :
rm -rf build && mkdir -p build && cd build
cmake .. && make
Alternativement, vous pouvez également créer le projet en utilisant Code::Blocks sur lequel vous devez l'installer ( $ sudo apt-get install codeblocks
).
Utilisez uniquement une connexion Ethernet filaire pour votre flux RTSP. Le Wi-Fi peut être instable.
Étant donné que le protocole RTSP est sensible même à une seule trame manquante, le flux peut facilement planter.
Si vous utilisez le flux dans une application d'apprentissage profond, ajustez votre résolution et votre fréquence d'images aux exigences du modèle d'apprentissage profond.
Ce n'est pas une bonne idée d'envoyer un flux 1280x960 à 30 FPS si votre modèle dispose d'une entrée 416x416 et prend 200 mSec pour traiter une seule image. Cela ne coûte que de la mémoire et de la puissance de traitement supplémentaires.
Assurez-vous que toutes les caméras ont la même résolution. Dans l'exemple, l'algorithme de concaténation OpenCV est sensible à différentes résolutions. Il lève une exception lorsqu'il fait face à des largeurs ou des hauteurs différentes.
Veuillez noter que les caméras ne sont pas synchronisées entre elles par les threads. Ils peuvent avoir des décalages légèrement différents.
Si vous souhaitez diffuser du UDP ou du TCP, assurez-vous au préalable que les flux fonctionnent avec l'invite de ligne de commande. Sinon, ils ne fonctionneront certainement pas dans OpenCV. Les erreurs sont souvent causées par le codage dans le pipeline, les adresses ou les modules manquants. Si vous devez installer des modules GStreamer supplémentaires, vous devrez également reconstruire votre OpenCV ! Pour plus d’informations, consultez notre site Web.
Pour exécuter l'application, chargez le fichier projet MultiThread.cbp dans Code :: Blocks.
Si vous utilisez un Jetson Nano , vous devez modifier l'emplacement où OpenCV a stocké ses fichiers d'en-tête en /usr/include/opencv4
À la ligne 23 de main.cpp, le flux est défini.
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);
Expéditeur : RaspiCam avec le système d'exploitation Raspberry Pi Buster
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
Expéditeur : RaspiCam avec le système d'exploitation 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
Notez que host=192.168.178.84
est l'adresse IP du récepteur.
Grb1->Init("tcpclientsrc host=192.168.178.129 port=5000 ! jpegdec ! videoconvert ! appsink", cv::CAP_GSTREAMER);
Expéditeur : RaspiCam avec le système d'exploitation Raspberry Pi Buster
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
Expéditeur : RaspiCam avec le système d'exploitation 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
Notez que host=192.168.178.32
est l'adresse IP de l'expéditeur.
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