문제

Windows에서 OpenCV 1.1pre1을 사용하고 있습니다. 네트워크 카메라가 있고 OpenCV에서 프레임을 가져와야합니다. 이 카메라는 HTTP를 통해 RTSP 또는 MJPEG를 통해 표준 MPEG4 스트림을 스트리밍 할 수 있습니다. 나는 많은 스레드가 OpenCV와 함께 FFMPEG를 사용하는 것에 대해 이야기하는 것을 보았지만 작동하게 할 수는 없습니다.

OpenCV로 IP 카메라에서 프레임을 잡는 방법은 무엇입니까?

감사

안드레아

도움이 되었습니까?

해결책

RTSP 프로토콜은 저에게 효과가 없었습니다. MJPEG는 먼저 시도했습니다. 카메라에 내장되어 있다고 가정합니다 (Dlink DCS 900).

여기에 찾은 구문 :http://answers.opencv.org/question/133/how-o-i-access-an-ip-camera/

FFMPG 지원으로 OpenCV를 컴파일 할 필요가 없었습니다.

다른 팁

프레임을 잡기 위해 C ++ 코드를 동봉했습니다. OpenCV 버전 2.0 이상이 필요합니다. 이 코드는 CV :: 매트 구조를 사용하여 오래된 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;
    }   
}

업데이트 H.264 RTSP 스트림에서 프레임을 잡을 수 있습니다. URL 명령을 얻으려면 자세한 내용은 카메라 API를 찾아보십시오. 예를 들어, 축 네트워크 카메라의 경우 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
#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는 FFMPEG 지원으로 컴파일 될 수 있습니다. 에서 ./configure -help:

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

그런 다음 사용할 수 있습니다 cvcreatefilecapture_ffmpeg 카메라 MJPG 스트림의 URL과 함께 CVCapture를 생성합니다.

나는 이것을 사용하여 축 카메라에서 프레임을 잡습니다.

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

난 그냥 이렇게합니다.

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

또한이 DLL이 런타임에 사용할 수 있는지 확인하십시오 CVCreateFileCapture는 NULL을 반환합니다.

opencv_ffmpeg200d.dll

카메라는 일반적으로 웹 인터페이스를 통해 설정된 무단 액세스를 허용해야합니다. MJPEG 형식은 RTSP를 통해 작동했지만 MPEG4는 그렇지 않았습니다.

HTH

ffmpeglib를 사용하여 스트림에 연결하십시오.

이러한 기능은 유용 할 수 있습니다. 그러나 문서를 살펴보십시오

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

완전한 프레임을 얻으려면 약간의 알고가 필요합니다. 여기에서 사용할 수 있습니다.

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

프레임을 얻으면 비디오 데이터 (필요한 경우 각 평면에 대해)를 OpenCV 이미지 객체 인 iplimage에 복사 할 수 있습니다.

같은 것을 사용하여 iplimage를 만들 수 있습니다.

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

iPlimage가 있으면 OpenCV Lib에서 사용할 수있는 모든 종류의 이미지 작업을 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top