Frage

Ich bin mit OpenCV 1.1pre1 unter Windows. Ich habe eine Netzwerkkamera und ich brauche Rahmen von OpenCV zu greifen. Das Kamera kann ein Standard-MPEG-4-Stream über RTSP oder MJPEG über HTTP streamen. Ich habe sprechen viele Threads gesehen über ffmpeg mit OpenCV verwenden, aber ich kann es nicht funktionieren.

Wie I-Frames von einer IP-Kamera mit OpenCV greifen kann?

Danke

Andrea

War es hilfreich?

Lösung

RTSP-Protokoll nicht für mich arbeiten. mjpeg gearbeitet ersten Versuch. Ich nehme an, es in meine Kamera (Dlink DCS 900) eingebaut ist.

Syntax finden Sie hier: http://answers.opencv.org/ Frage / 133 / how-do-i-access-an-IP-Kamera /

Ich brauche nicht OpenCV mit ffmpg Unterstützung zu kompilieren.

Andere Tipps

I eingeschlossen C ++ Code für die Ergreifung Frames. Es erfordert OpenCV Version 2.0 oder höher. Der Code verwendet cv :: Mattenstruktur, die an alte IplImage Struktur bevorzugt.

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

Aktualisieren Sie können Rahmen greifen von H.264 RTSP-Streams. Sehen Sie Ihre Kamera-API für Details der URL-Befehl zu erhalten. Zum Beispiel für eine Axis Netzwerk-Kamera kann die URL-Adresse sein:

// 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 mit FFMPEG Unterstützung kompiliert werden. Von ./ configure --help :

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

Sie können dann mit cvCreateFileCapture_FFMPEG einen CvCapture zu schaffen, mit z.B. die URL der MJPG Stream der Kamera.

Ich benutze diese Frames von einer AXIS Kamera zu greifen:

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

Ich mache es wie folgt aus:

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

Vergewissern Sie sich auch diese DLL zur Laufzeit sonst cvCreateFileCapture verfügbar ist, wird NULL zurück

opencv_ffmpeg200d.dll

Die Kamera muss nicht authentifizierten Zugriff ermöglichen, in der Regel über seine Web-Schnittstelle. MJPEG-Format arbeitete über RTSP aber MPEG4 nicht.

hth

Si

Verwenden ffmpeglib zum Stream zu verbinden.

Diese Funktionen können nützlich sein. Aber werfen Sie einen Blick in die Dokumentation

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

Sie möchten gerne ein wenig algo brauchen einen kompletten Rahmen zu bekommen, die verfügbar ist hier

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

Sobald Sie ein Bild, das Sie könnten die Videodaten kopieren (für jede Ebene, wenn erforderlich) in eine IplImage welches ein OpenCV Bildobjekt.

Sie können eine IplImage schaffen etwas mit wie ...

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

Wenn Sie eine IplImage haben, können Sie alle Arten von Bildoperationen in dem OpenCV lib durchführen können

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top