[c++] OpenCV mit Netzwerkkameras


2 Answers

Ich habe C ++ - Code für das Framing von Frames eingefügt. Es erfordert OpenCV Version 2.0 oder höher. Der Code verwendet die cv :: mat-Struktur, die der alten IplImage-Struktur vorgezogen wird.

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

Update Sie können Frames aus H.264 RTSP-Streams abrufen. Suchen Sie in Ihrer Kamera-API nach Einzelheiten, um den URL-Befehl zu erhalten. Bei einer Axis-Netzwerkkamera könnte die URL 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 ich muss Frames von openCV greifen. Diese Kamera kann einen Standard mpeg4-Stream über RTSP oder mjpeg über HTTP streamen. Ich habe viele Threads gesehen, die über die Verwendung von ffmpeg mit openCV sprechen, aber ich kann es nicht funktionieren lassen.

Wie kann ich Bilder von einer IP-Kamera mit openCV holen?

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 vollständigen 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, falls benötigt) in ein IplImage kopieren, das ein OpenCV-Bildobjekt ist.

Sie können ein IplImage mit etwas wie ... erstellen

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

Sobald Sie ein IplImage haben, können Sie alle Arten von Bildoperationen durchführen, die in der OpenCV-Bibliothek verfügbar sind




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 z. B. der URL des MJPG-Streams der Kamera zu erstellen.

Ich benutze dies, um Bilder von einer AXIS-Kamera zu holen:

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



Related