2009-04-03 16 views
23

Estoy usando openCV 1.1pre1 en Windows. Tengo una cámara de red y necesito tomar marcos de openCV. Esa cámara puede transmitir una secuencia mpeg4 estándar sobre RTSP o mjpeg a través de http. He visto muchos hilos hablando de usar ffmpeg con openCV pero no puedo hacerlo funcionar.OpenCV con cámaras de red

¿Cómo puedo tomar marcos de una cámara IP con openCV?

Gracias

Andrea

+0

También verifique esta respuesta: http://stackoverflow.com/q/6022423/1085483 –

Respuesta

3

rtsp protocol does not work for me. mjpeg funcionó primero intente. Supongo que está integrado en mi cámara (Dlink DCS 900).

Sintaxis encontrar aquí: http://answers.opencv.org/question/133/how-do-i-access-an-ip-camera/

no tenía necesidad de compilar OpenCV con el apoyo ffmpg.

+0

No entiendo cómo funciona mjpeg al primer intento, ¿qué hiciste con los marcos para tener un resultado de mjpeg? – Marine1

1

Uso ffmpeglib para conectar a la corriente.

Estas funciones pueden ser útiles. Pero echar un vistazo en el docs

av_open_input_stream(...); 
av_find_stream_info(...); 
avcodec_find_decoder(...); 
avcodec_open(...); 
avcodec_alloc_frame(...); 

Se podría necesitar un poco de algo para obtener un cuadro completo, que está disponible aquí

http://www.dranger.com/ffmpeg/tutorial01.html 

Una vez que se obtiene un marco que puede copiar los datos de vídeo (para cada plano si es necesario) en una IplImage que es un objeto de imagen OpenCV.

Se puede crear un IplImage usando algo como ...

IplImage *p_gray_image = cvCreateImage(size, IPL_DEPTH_8U, 1); 

vez que tenga una IplImage, puede realizar todo tipo de operaciones de imagen disponibles en el lib OpenCV

+0

He visto en muchos hilos que ffmpeg ya está incluido y se usa dentro de openCV, ¿es así? Tal vez necesito recompilar openCV con soporte ffgmpeg? En este caso, ¿cómo puedo hacer esto en Windows? Gracias – Grifo

+0

No tengo conocimiento de esto. Sin embargo, ffmpeg es una aplicación en la que ffmpeglib es una biblioteca. Si eres nuevo en esto, mira los tutoriales de dranger.com. – Indy9000

5

OpenCV se puede compilar con Soporte FFMPEG. De ./configure --help:

--with-ffmpeg  use ffmpeg libraries (see LICENSE) [automatic] 

A continuación, puede utilizar cvCreateFileCapture_FFMPEG para crear un CvCapture con, por ejemplo la URL de la secuencia MJPG de la cámara.

Lo utilizo para capturar fotogramas de una cámara AXIS:

CvCapture *capture = 
    cvCreateFileCapture_FFMPEG("http://axis-cam/mjpg/video.mjpg?resolution=640x480&req_fps=10&.mjpg"); 
+3

¿Es posible configurar openCV con soporte ffmpeg en Windows? – Grifo

+1

aparentemente, opencv 2.x siempre tiene soporte para ffmpeg en todas las plataformas. – Jim

3

acabo de hacerlo de esta manera:

CvCapture *capture = cvCreateFileCapture("rtsp://camera-address"); 

También asegúrese de que esta DLL está disponible en tiempo de ejecución demás cvCreateFileCapture devolverá NULL

opencv_ffmpeg200d.dll 

La cámara también debe permitir el acceso no autenticado, generalmente configurado a través de su interfaz web. El formato MJPEG funcionaba a través de rtsp, pero MPEG4 no.

hth

Si

+0

¿Estás usando OpenCV 2.0? – Grifo

+0

La versión de la biblioteca dice que está usando openCV 2.0 - esa es la parte '200' en' opencv_ffmpeg200d.dll' – jamuraa

+0

Esta es en mi opinión la respuesta correcta. Estoy usando Windows y tuve que copiar 'opencv_ffmpeg300.dll' a la carpeta de mi proyecto. Para abrir la secuencia estoy usando 'VideoCapture cap (" rtsp: // abc: [email protected]/live0.264 ");' – Anonymous

10
#include <stdio.h> 
#include "opencv.hpp" 


int main(){ 

    CvCapture *camera=cvCaptureFromFile("http://username:[email protected]_address/axis-cgi/mjpg/video.cgi?resolution=640x480&req_fps=30&.mjpg"); 
    if (camera==NULL) 
     printf("camera is null\n"); 
    else 
     printf("camera is not null"); 

    cvNamedWindow("img"); 
    while (cvWaitKey(10)!=atoi("q")){ 
     double t1=(double)cvGetTickCount(); 
     IplImage *img=cvQueryFrame(camera); 
     double t2=(double)cvGetTickCount(); 
     printf("time: %gms fps: %.2g\n",(t2-t1)/(cvGetTickFrequency()*1000.), 1000./((t2-t1)/(cvGetTickFrequency()*1000.))); 
     cvShowImage("img",img); 
    } 
    cvReleaseCapture(&camera); 
} 
+0

gracias, ayudó mucho. – Maysam

+0

@lolong ¿cómo este es el código para un flujo de mjpg, ¿verdad? –

21

I delimitada código C++ para agarrar marcos. Requiere OpenCV versión 2.0 o superior. El código usa la estructura cv :: mat, que es preferible a la antigua estructura de IplImage.

#include "cv.h" 
#include "highgui.h" 
#include <iostream> 

int main(int, char**) { 
    cv::VideoCapture vcap; 
    cv::Mat image; 

    const std::string videoStreamAddress = "rtsp://cam_address:554/live.sdp"; 
    /* it may be an address of an mjpeg stream, 
    e.g. "http://user:[email protected]_address:8081/cgi/mjpg/mjpg.cgi?.mjpg" */ 

    //open the video stream and make sure it's opened 
    if(!vcap.open(videoStreamAddress)) { 
     std::cout << "Error opening video stream or file" << std::endl; 
     return -1; 
    } 

    //Create output window for displaying frames. 
    //It's important to create this window outside of the `for` loop 
    //Otherwise this window will be created automatically each time you call 
    //`imshow(...)`, which is very inefficient. 
    cv::namedWindow("Output Window"); 

    for(;;) { 
     if(!vcap.read(image)) { 
      std::cout << "No frame" << std::endl; 
      cv::waitKey(); 
     } 
     cv::imshow("Output Window", image); 
     if(cv::waitKey(1) >= 0) break; 
    } 
} 

actualización Puede capturar fotogramas de H.264 RTSP arroyos. Busque la API de su cámara para obtener detalles para obtener el comando URL. Por ejemplo, para una cámara de red Axis, la dirección URL podría ser:

// H.264 stream RTSP address, where 10.10.10.10 is an IP address 
// and 554 is the port number 
rtsp://10.10.10.10:554/axis-media/media.amp 

// if the camera is password protected 
rtsp://username:[email protected]:554/axis-media/media.amp 
+0

¿Sabe si esto funciona solo con MJPEG o también con transmisión H.264 RTSP/UDP? – Matthias

+0

@Matthias Funciona también para la transmisión H.264 RTSP. Tengo la versión 2.4.4 de OpenCV y puedo tomar fotogramas de una cámara que transmite con H.264. – Alexey

+0

Gracias por su respuesta rápida. – Matthias

Cuestiones relacionadas