OpenCV con cámaras de red

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.

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

Gracias

Andrea

El protocolo rtsp no funcionó para mí. mjpeg trabajó primero, intente. Supongo que está integrado en mi cámara (Dlink DCS 900).

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

No necesité comstackr OpenCV con soporte ffmpg.

Incluí el código de C ++ para capturar fotogtwigs. 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  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, eg "http://user:pass@cam_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 tomar cuadros de las transmisiones H.264 RTSP. 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:password@10.10.10.10:554/axis-media/media.amp 
 #include  #include "opencv.hpp" int main(){ CvCapture *camera=cvCaptureFromFile("http://username:pass@cam_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); } 

OpenCV se puede comstackr con soporte FFMPEG. Desde ./configure –help :

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

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

Lo uso para tomar cuadros de una cámara AXIS:

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

Simplemente lo hago así:

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

También asegúrese de que este dll esté disponible en tiempo de ejecución; de lo contrario, 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

Use ffmpeglib para conectarse a la transmisión.

Estas funciones pueden ser útiles. Pero eche un vistazo en los documentos

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

Necesitarías un pequeño algoritmo para obtener un cuadro completo, que está disponible aquí

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

Una vez que obtenga un marco, puede copiar los datos de video (para cada plano si es necesario) en una IplImage que es un objeto de imagen OpenCV.

Puede crear una imagen Ipl usando algo como …

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

Una vez que tiene una imagen Ipl, puede realizar todo tipo de operaciones de imagen disponibles en la biblioteca OpenCV