2014년 12월 5일 금요일

ip camera (cctv) 에서 1frame (Single Grab) 얻기

 보통은 네트워크 카메라를 사용할때, mpeg 경로에서 1frame씩 가져와서 처리를 한다. 카메라의 종류에 따라 jpeg 로 single grab(1frame)을 할 수 있도록 제공하는것 같다. 그런데 내가 사용해본 카메라에서는 따로 sdk를 통해 jpeg를 접근할 수가 없었다. http 주소로 웹 브라우저에서는 가능했기 때문에, Web의 영상을 가져오는 방식으로 네트워크 카메라에서 single grab을 하였다.

header 파일
[-] Collapse
#pragma once

#include "Poco/URIStreamOpener.h"
#include "Poco/StreamCopier.h"
#include "Poco/URI.h"
#include "Poco/Net/HTTPStreamFactory.h"
#include <memory>
#include <iostream>
#include <stdio.h>
#include <malloc.h>
#include "opencv2/opencv.hpp"


using Poco::URIStreamOpener;
using Poco::StreamCopier;
using Poco::URI;
using Poco::Net::HTTPStreamFactory;
using namespace std;
using namespace cv;

static bool factoryLoaded = false;

class CWebImageLoader
{
public:
    static Mat loadFromURL(string url);
};

cpp 파일
[-] Collapse
#include "StdAfx.h"
#include "WebImageLoader.h"


cv::Mat CWebImageLoader::loadFromURL(string url)
{
    //Don't register the factory more than once
    if(!factoryLoaded){
        HTTPStreamFactory::registerFactory();
        factoryLoaded = true;
    }

    //Specify URL and open input stream
    URI uri(url);

    auto_ptr<istream> pStr(URIStreamOpener::defaultOpener().open(uri));
    string str;
    StreamCopier::copyToString(*pStr.get(), str);
    vector<char> data( str.begin(), str.end() );
    Mat data_mat(data);
    Mat image(imdecode(data_mat,1));
    return image;
}

댓글 없음:

댓글 쓰기