OpenCV с сетевыми камерами - PullRequest
       46

OpenCV с сетевыми камерами

23 голосов
/ 03 апреля 2009

Я использую openCV 1.1pre1 под Windows. У меня есть сетевая камера, и мне нужно брать кадры из openCV. Эта камера может передавать стандартный поток mpeg4 через RTSP или mjpeg через http. Я видел много потоков, говорящих об использовании ffmpeg с openCV, но я не могу заставить его работать.

Как я могу получить кадры с IP-камеры с openCV?

Спасибо

Andrea

Ответы [ 6 ]

22 голосов
/ 04 января 2012

Я приложил код C ++ для захвата кадров. Требуется OpenCV версии 2.0 или выше. Код использует структуру cv :: mat, которая предпочтительнее старой структуры 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;
    }   
}

Обновление Вы можете получить кадры из потоков RTSP H.264. Посмотрите API камеры для деталей, чтобы получить команду URL. Например, для сетевой камеры Axis адрес 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
10 голосов
/ 20 мая 2011
#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);
}
5 голосов
/ 18 июня 2009

OpenCV может быть скомпилирован с поддержкой FFMPEG. От . / Configure --help :

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

Затем вы можете использовать cvCreateFileCapture_FFMPEG , чтобы создать CvCapture с, например, URL-адрес потока MJPG камеры.

Я использую это для захвата кадров с камеры AXIS:

CvCapture *capture = 
    cvCreateFileCapture_FFMPEG("http://axis-cam/mjpg/video.mjpg?resolution=640x480&req_fps=10&.mjpg");
3 голосов
/ 29 ноября 2012
Протокол

rtsp у меня не работал. mjpeg сработал с первой попытки. Я предполагаю, что он встроен в мою камеру (Dlink DCS 900).

Синтаксис найден здесь: http://answers.opencv.org/question/133/how-do-i-access-an-ip-camera/

Мне не нужно было компилировать OpenCV с поддержкой ffmpg.

3 голосов
/ 11 февраля 2010

Я просто делаю это так:

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

Также убедитесь, что эта dll доступна во время выполнения, иначе cvCreateFileCapture вернет NULL

opencv_ffmpeg200d.dll

Камера также должна разрешать доступ без аутентификации, обычно устанавливаемый через веб-интерфейс. Формат MJPEG работал через rtsp, а MPEG4 - нет.

чч

1011 * Si *

1 голос
/ 03 апреля 2009

Используйте ffmpeglib для подключения к потоку.

Эти функции могут быть полезны. Но посмотрите в документах

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

Вам понадобится маленький алгоритм, чтобы получить полный кадр, который доступен здесь

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

Как только вы получите кадр, вы можете скопировать видеоданные (для каждого самолета, если необходимо) в IplImage, который является объектом изображения OpenCV.

Вы можете создать IplImage, используя что-то вроде ...

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

Получив IplImage, вы можете выполнять все виды операций с изображениями, которые доступны в OpenCV lib

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...