Pregunta

Estoy usando OpenCV 1.1pre1 bajo Windows. Tengo una cámara de red y necesito capturar fotogramas de OpenCV. Esa cámara puede transmitir una corriente estándar MPEG4 sobre RTSP o MJPEG sobre HTTP. He visto muchos hilos que hablan sobre el uso de ffmpeg con OpenCV pero no puedo hacer que funcione.

¿Cómo puedo capturar fotogramas de una cámara IP con OpenCV?

Gracias

Andrea

¿Fue útil?

Solución

protocolo RTSP no funcionó para mí. MJPEG trabajó primer intento. Asumo que está integrado en la cámara (Dlink DCS 900).

Sintaxis encontrar aquí: http://answers.opencv.org/ pregunta / 133 / cómo-do-i-acceso-an-ip-cámara /

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

Otros consejos

I delimitada código C ++ para agarrar marcos. Se requiere OpenCV versión 2.0 o superior. El código utiliza la estructura cv :: estera que se prefiere a la estructura IplImage de edad.

#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: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;
    }   
}

Actualizar Puede capturar fotogramas de H.264 RTSP arroyos. Busque su API de cámara para más 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 <stdio.h>
#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 puede ser compilado con soporte FFMPEG. A partir de ./ configure --help

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

A continuación, puede utilizar cvCreateFileCapture_FFMPEG para crear una CvCapture con, por ejemplo la URL de la corriente 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");

Sólo lo hago 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 tiene que permitir el acceso no autenticado también, por lo general establecido a través de su interfaz web. formato MJPEG trabajó a través de RTSP, pero no lo hizo MPEG4.

hth

Si

Uso ffmpeglib para conectarse a la corriente.

Estas funciones pueden ser útiles. Pero echar un vistazo en la documentación

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

Lo que necesitas un poco de algo para obtener un cuadro completo, el cual 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 una imagen objeto OpenCV.

Puede crear una IplImage usando algo como ...

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top