[C++] OpenCV mit Netzwerkkameras


Answers

Ich habe C ++ - Code für das Ergreifen von Frames beigefügt. Es erfordert OpenCV Version 2.0 oder höher. Der Code verwendet die cv :: mat-Struktur, die gegenüber der alten IplImage-Struktur bevorzugt ist.

#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 Frames von H.264 RTSP-Streams erfassen. Schlagen Sie in Ihrer Kamera-API nach, um weitere Informationen zum URL-Befehl zu erhalten. Für eine Axis-Netzwerkkamera könnte die URL-Adresse beispielsweise lauten:

// 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
Question

Ich benutze openCV 1.1pre1 unter Windows. Ich habe eine Netzwerkkamera und muss mir Frames von openCV holen. Diese Kamera kann einen Standard-MPEG4-Stream über RTSP oder MJPEG über http streamen. Ich habe viele Threads über die Verwendung von ffmpeg mit openCV sprechen gesehen, aber ich kann es nicht zum Laufen bringen.

Wie kann ich mit openCV Frames von einer IP-Kamera erfassen?

Vielen Dank

Andrea




Verwenden Sie ffmpeglib, um eine Verbindung zum Stream herzustellen.

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 benötigen ein wenig Algo, um einen kompletten Rahmen zu erhalten, der hier verfügbar ist

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

Sobald Sie einen Rahmen erhalten haben, können Sie die Videodaten (für jede Ebene bei Bedarf) in ein IplImage kopieren, das ein OpenCV-Bildobjekt ist.

Sie können ein IplImage erstellen, indem Sie ...

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

Sobald Sie ein IplImage haben, können Sie alle möglichen Bildoperationen in der OpenCV-Bibliothek ausführen.




OpenCV kann mit FFMPEG-Unterstützung kompiliert werden. Von ./configure --help :

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

Sie können dann cvCreateFileCapture_FFMPEG verwenden , um ein CvCapture mit zB der URL des MJPG-Streams der Kamera zu erstellen.

Ich verwende das, um Frames von einer AXIS-Kamera zu erfassen:

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