Transmisión y decodificación MJPEG

Quiero recibir imágenes JPEG de una cámara IP (a través de RTSP). Por esto, intenté cvCreateFileCapture_FFMPEG en OpenCV. Pero ffmpeg parece tener algún problema con el formato MJPEG de la transmisión (ya que intenta detectar automáticamente la información de la transmisión) y termino con el siguiente error

mjpeg: unsupported coding type

Entonces, decidí usar live555 para la transmisión. Hasta ahora, puedo establecer con éxito la transmisión y la captura de imágenes (no decodificadas) a través de openRTSP.

La pregunta es cómo puedo hacer esto en mi aplicación, por ejemplo, en OpenCV. ¿Cómo puedo usar openRTSP en OpenCV para obtener imágenes y guardarlas en formato JPEG?

Escuché que los datos de openRTSP se pueden enviar a un búfer (o una tubería con nombre) y luego leer en OpenCV IplImage. Pero no sé cómo hacer esto.

Realmente agradeceré cualquier ayuda / sugerencia sobre este problema. Necesito respuestas a cualquiera de las siguientes preguntas:

  1. ¿Cómo puedo deshabilitar la detección automática de información de flujo de ffmpeg y especificar mi propio formato (mjpeg), o
  2. ¿Cómo puedo usar openRTSP en OpenCV?

Saludos,

preguntado el 16 de mayo de 11 a las 19:05

1 Respuestas

¿Es esta una cámara IP de Axis? De cualquier manera, la mayoría de las cámaras IP que ofrecen MPEG4 Secuencia RTSP que se puede decodificar usando OpenCV usando cvCreateFileCapture_FFMPEG. Sin embargo, el decodificador ffmpeg MJPEG El códec tiene problemas sin resolver ampliamente conocidos. Estoy seguro de que habrías recibido un error similar a

[ingenient @ 0x97d20c0]Could not find codec parameters (Video: mjpeg)

Opción 1: uso de opencv, libcurl y libjpeg

Para ver la secuencia mjpeg en opencv, eche un vistazo a la siguiente implementación

http://www.eecs.ucf.edu/~rpatrick/code/onelinksys.c or http://cse.unl.edu/~rpatrick/code/onelinksys.c

Opción 2: uso de gstreamer (sin opencv)

Recomendaría mirar gstreamer si su objetivo es simplemente ver o guardar imágenes jpeg

A VER El flujo MJPEG uno puede ejecutar la cadena de canalización de medios de la siguiente manera

gst-launch -v souphttpsrc location="http://[ip]:[port]/[dir]/xxx.cgi" do-timestamp=true is_live=true ! multipartdemux ! jpegdec ! ffmpegcolorspace ! autovideosink

Para RTSP

gst-launch -v rtspsrc location="rtsp://[user]:[pass]@[ip]:[port]/[dir]/xxx.amp" debug=1 ! rtpmp4vdepay ! mpeg4videoparse ! ffdec_mpeg4 ! ffmpegcolorspace! autovideosink

Para trabajar con la API de C, consulte

http://wiki.maemo.org/Documentation/Maemo_5_Developer_Guide/Using_Multimedia_Components/Camera_API_Usage

Para obtener un ejemplo simple, eche un vistazo a mi otra publicación sobre rtsp para construir el canal de medios de la API de gstreamer C (esto es lo mismo que la cadena de lanzamiento de gst pero más bien implementado como una API de C)

Jugando RTSP con python-gstreamer

A ahorrar MJPEG fluye como múltiples imágenes de la tubería (pongamos un giro vertical BIN y conecta el ALMOHADILLAS al anterior y al siguiente Bandejas para hacerlo más elegante)

gst-launch souphttpsrc location="http://[ip]:[port]/[dir]/xxx.cgi" do-timestamp=true is_live=true ! multipartdemux ! jpegdec !  videoflip method=vertical-flip ! jpegenc !  multifilesink location=image-out-%05d.jpg

También quizás valga la pena echarle un vistazo gst-opencv

ACTUALIZACIÓN:

Opción 3: uso de gstreamer, Named Pipe y opencv

En Linux, uno puede obtener el flujo mjpeg y convertirlo a mpeg4 y alimentarlo a una tubería con nombre. Luego lea los datos de la tubería nombrada en opencv

Paso 1. Cree una tubería con nombre

mkfifo stream_fifo

Paso 2. Cree opencvvideo_test.c

// compile with gcc -ggdb `pkg-config --cflags --libs opencv` opencvvideo_test.c -o opencvvideo_test
#include <stdio.h>
#include "highgui.h"
#include "cv.h"


int main( int argc, char** argv){

IplImage  *frame;
    int       key;

    /* supply the AVI file to play */
    assert( argc == 2 );

    /* load the AVI file */
    CvCapture *capture = cvCreateFileCapture(argv[1]) ;//cvCaptureFromAVI( argv[1] );

    /* always check */
    if( !capture ) return 1;    

    /* get fps, needed to set the delay */
    int fps = ( int )cvGetCaptureProperty( capture, CV_CAP_PROP_FPS );

    int frameH    = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
    int frameW    = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);

    /* display video */
    cvNamedWindow( "video", CV_WINDOW_AUTOSIZE );

    while( key != 'q' ) {

    double t1=(double)cvGetTickCount();
    /* get a frame */
    frame = cvQueryFrame( capture );
    double t2=(double)cvGetTickCount();
    printf("time: %gms  fps: %.2g\n",(t2-t1)/(cvGetTickFrequency()*1000.), 1000./((t2-t1)/(cvGetTickFrequency()*1000.)));

    /* always check */
    if( !frame ) break;

    /* display frame */
    cvShowImage( "video", frame );

    /* quit if user press 'q' */
    key = cvWaitKey( 1000 / fps );
    }

    /* free memory */
    cvReleaseCapture( &capture );
    cvDestroyWindow( "video" );

    return 0;
}

Paso 3. Prepárese para convertir de MJPEG a MPEG4 usando gstreamer (la tasa de fotogramas entrantes es crítica)

gst-launch -v souphttpsrc location="http://<ip>/cgi_bin/<mjpeg>.cgi" do-timestamp=true is_live=true ! multipartdemux ! jpegdec ! queue ! videoscale ! 'video/x-raw-yuv, width=640, height=480'! queue ! videorate ! 'video/x-raw-yuv,framerate=30/1' ! queue ! ffmpegcolorspace ! 'video/x-raw-yuv,format=(fourcc)I420' ! ffenc_mpeg4 ! queue ! filesink location=stream_fifo

Paso 4. Mostrar flujo en OpenCV

  ./opencvvideo_test stream_fifo

contestado el 23 de mayo de 17 a las 14:05

¿Puedo usar gsteamer para crear un video a partir de las imágenes que se están guardando? ¿Gstreamer me da acceso a las etiquetas EXIF? - praxmon

@PrakharMohanSrivastava Utilice el complemento multifilesrc para crear videos a partir de imágenes gstreamer.freedesktop.org/data/doc/gstreamer/head/… - entusiasta friki

@PrakharMohanSrivastava Leer más en EXIF gstreamer.freedesktop.org/data/doc/gstreamer/head/… - entusiasta friki

@tod Creo que la persona eliminó el enlace. Por favor mira cse.unl.edu/~rpatrick/code/onelinksys.c - entusiasta friki

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.