Es un problema conocido con las transmisiones RTSP y los algoritmos que consumen mucho tiempo, como los marcos de aprendizaje profundo. Te estás desincronizando si los fotogramas individuales tardan más que la velocidad de fotogramas de tu transmisión en procesarse. Hay un retraso cada vez mayor entre la realidad y las imágenes captadas.
Hay dos posibles soluciones a este problema.
El código habla por sí solo. Puede usar GStreamer de FFmpeg para abrir la transmisión.
El número de cámaras conectadas no está limitado. Podría ser incluso una sola cámara.
Sin embargo, cuantas más cámaras, más tiempo de CPU se necesita para visitar todos los subprocesos separados.
Para ejecutar la aplicación, tienes que:
Cree la ruta de compilación y el proyecto con cmake de la siguiente manera:
rm -rf build && mkdir -p build && cd build
cmake .. && make
Alternativamente, también puede construir el proyecto usando Code::Blocks en el que necesita instalarlo ( $ sudo apt-get install codeblocks
).
Utilice únicamente una conexión Ethernet por cable para su transmisión RTSP. El Wi-Fi puede ser inestable.
Debido a que el protocolo RTSP es sensible incluso a un solo fotograma faltante, la transmisión puede fallar fácilmente.
Si está utilizando la transmisión en una aplicación de aprendizaje profundo, ajuste la resolución y la velocidad de fotogramas a los requisitos del modelo de aprendizaje profundo.
No es una buena idea enviar una transmisión de 1280x960 a 30 FPS si su modelo tiene una entrada de 416x416 y tarda 200 ms en procesar un solo cuadro. Sólo cuesta memoria adicional y potencia de procesamiento.
Asegúrese de que todas las cámaras tengan la misma resolución. En el ejemplo, el algoritmo de concatenación de OpenCV es sensible a diferentes resoluciones. Lanza una excepción cuando se enfrenta a diferentes anchos o alturas.
Tenga en cuenta que las cámaras no están sincronizadas entre sí mediante los hilos. Es posible que tengan retrasos ligeramente diferentes.
Si desea transmitir UDP o TCP, asegúrese de que las transmisiones funcionen con la línea de comando de antemano. De lo contrario, ciertamente no funcionarán en OpenCV. A menudo los errores se deben a la codificación en la tubería, a las direcciones o a módulos faltantes. Si necesita instalar módulos GStreamer adicionales, ¡también necesitará reconstruir su OpenCV! Para obtener más información, consulte nuestro sitio web.
Para ejecutar la aplicación, cargue el archivo de proyecto MultiThread.cbp en Code::Blocks.
Si está utilizando un Jetson Nano , debe cambiar la ubicación donde OpenCV ha almacenado sus archivos de encabezado a /usr/include/opencv4
En la línea 23 de main.cpp se define la secuencia.
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);
Remitente: RaspiCam con sistema operativo 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
Remitente: RaspiCam con sistema operativo 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
Tenga en cuenta que host=192.168.178.84
es la dirección IP del receptor.
Grb1->Init("tcpclientsrc host=192.168.178.129 port=5000 ! jpegdec ! videoconvert ! appsink", cv::CAP_GSTREAMER);
Remitente: RaspiCam con sistema operativo 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
Remitente: RaspiCam con sistema operativo 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
Tenga en cuenta que host=192.168.178.32
es la dirección IP del remitente.
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