Question

J'utilise OpenCV 1.1pre1 sous Windows. J'ai une caméra réseau et je dois saisir les cadres de OpenCV. Cette caméra peut diffuser un flux standard MPEG-4 sur RTSP ou MJPEG sur http. J'ai vu beaucoup de discussions parler en utilisant ffmpeg avec OpenCV mais je ne peux pas le faire fonctionner.

Comment puis-je saisir des cadres à partir d'une caméra IP avec OpenCV?

Merci

Andrea

Était-ce utile?

La solution

protocole RTSP ne fonctionne pas pour moi. MJPEG travaillé premier essai. Je suppose qu'il est intégré dans mon appareil photo (DCS 900 Dlink).

Syntaxe trouvée ici: http://answers.opencv.org/ question / 133 / how-do-i-accès-un-ip-caméra /

Je n'ai pas besoin de compiler OpenCV avec le soutien de ffmpg.

Autres conseils

J'enfermai code C ++ pour saisir des cadres. Il nécessite la version 2.0 ou supérieure OpenCV. Le code utilise cv :: structure de tapis qui est préféré ancienne structure 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;
    }   
}

Mise à jour Vous pouvez saisir des cadres de flux H.264 RTSP. Recherchez votre API d'appareil photo pour plus de détails pour obtenir la commande URL. Par exemple, pour une caméra réseau Axis l'adresse URL pourrait être:

// 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 peut être compilé avec le support FFMPEG. De ./ configure --help :

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

Vous pouvez ensuite utiliser cvCreateFileCapture_FFMPEG pour créer un CvCapture avec par exemple l'URL du flux MJPG de l'appareil.

Je l'utiliser pour saisir les cadres d'une caméra AXIS:

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

Je viens de le faire comme ceci:

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

Assurez-vous également que ce dll est disponible lors de l'exécution d'autre cvCreateFileCapture retournera NULL

opencv_ffmpeg200d.dll

La caméra doit permettre un accès non authentifié aussi, généralement fixé via son interface Web. MJPEG travaillé via RTSP mais MPEG4 n'a pas.

HTH

Si

Utilisation ffmpeglib pour se connecter au flux.

Ces fonctions peuvent être utiles. Mais jetez un oeil dans la documentation

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

Vous auriez besoin d'un peu algo pour obtenir une image complète, qui est disponible ici

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

Une fois que vous obtenez une image que vous pouvez copier les données vidéo (pour chaque plan si nécessaire) dans un IplImage qui est un objet d'image OpenCV.

Vous pouvez créer un IplImage en utilisant quelque chose comme ...

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

Une fois que vous avez un IplImage, vous pouvez effectuer toutes sortes d'opérations d'image disponibles dans le répertoire lib OpenCV

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top