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 o FFmpeg para abrir la transmisión.
Las transmisiones RTSP generalmente se comprimen con H264. Por lo tanto, su descompresión es sensible a problemas de sincronización, como hilos detenidos por algún tiempo.
Para ejecutar la aplicación, tienes que:
$ 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.
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 RTSPcam.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 16 de main.cpp se abre la secuencia.
cam.Open("rtsp://192.168.178.129:8554/test/");
cam.Open("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.
cam.Open("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.
cam.Open("libcamerasrc ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! videoscale ! video/x-raw, width=640, height=480 ! appsink", cv::CAP_GSTREAMER);
cam.Open("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);
cam.Open(0);
cam.Open(0); //if RaspiCam is not connected
cam.Open(1); //if RaspiCam is connected
cam.Open("James.mp4");
cam.Open("/home/pi/Pictures/Plants");
cam.Open("/home/pi/Pictures/Garden.jpg");
int main ()
{
cv::Mat frame;
RTSPcam cam;
cv::namedWindow ( " Camera " , cv::WINDOW_AUTOSIZE);
cam. Open ( " rtsp://192.168.178.129:8554/test/ " ); // you can dump anything OpenCV eats. (cv::CAP_ANY) BTW,OpenCV first tries FFmpeg
while ( true )
{
if (!cam. GetLatestFrame (frame)){
cout << " Capture read error " << endl;
break ;
}
// place here your time consuming algorithms
// cout << cam.CurrentFileName << endl;
// show frame
cv::imshow ( " Camera " ,frame);
char esc = cv::waitKey ( 2 );
if (esc == 27 ) break ;
}
cv::destroyAllWindows () ;
return 0 ;
}