Domanda

Sto utilizzando OpenCV 1.1pre1 sotto Windows. Ho una telecamera di rete e ho bisogno di afferrare fotogrammi da OpenCV. Quella telecamera può trasmettere un flusso MPEG4 standard di oltre RTSP o MJPEG su protocollo HTTP. Ho visto molte discussioni parlando usando ffmpeg con OpenCV ma non riesco a farlo funzionare.

Come posso afferrare fotogrammi da una telecamera IP con OpenCV?

Grazie

Andrea

È stato utile?

Soluzione

protocollo RTSP non ha funzionato per me. mjpeg lavorato primo tentativo. Suppongo che è costruito nella mia macchina fotografica (Dlink DCS 900).

Sintassi trovato qui: http://answers.opencv.org/ domanda / 133 / how-do-i-access-un-ip-camera /

non ho bisogno di compilare OpenCV con il supporto ffmpg.

Altri suggerimenti

ho racchiuso codice C ++ per afferrare fotogrammi. Richiede OpenCV versione 2.0 o superiore. Il codice utilizza la struttura cv :: tappetino che è preferito a vecchia struttura 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: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;
    }   
}

Aggiorna È possibile afferrare fotogrammi da flussi H.264 RTSP. Guardate il vostro API della fotocamera per i dettagli per ottenere il comando URL. Ad esempio, per una telecamera di rete Axis potrebbe essere l'indirizzo URL:

// 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 può essere compilato con il supporto FFMPEG. Da ./ configure --help :

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

È possibile quindi usare cvCreateFileCapture_FFMPEG per creare un CvCapture con per esempio l'URL del flusso MJPG della telecamera.

Io lo uso per afferrare fotogrammi da una telecamera AXIS:

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

Io faccio solo in questo modo:

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

Anche assicurarsi che questa dll è disponibile in fase di esecuzione il resto cvCreateFileCapture restituirà NULL

opencv_ffmpeg200d.dll

La fotocamera ha bisogno per consentire l'accesso non autenticato troppo, di solito impostato tramite la sua interfaccia web. formato MJPEG lavorato tramite RTSP ma MPEG4 non lo fece.

hth

Si

Usa ffmpeglib per connettersi al flusso.

Queste funzioni possono essere utili. Ma date un'occhiata nella documentazione

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

Si avrebbe bisogno di un po 'algo per ottenere un quadro completo, che è disponibile qui

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

Una volta che si ottiene una cornice (se necessario per ogni piano) è possibile copiare i dati video in un IplImage che è un oggetto immagine OpenCV.

È possibile creare un IplImage usando qualcosa come ...

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

Una volta che avete un IplImage, è possibile eseguire tutti i tipi di operazioni di immagine disponibili nel lib OpenCV

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top