레이블이 IP Camera인 게시물을 표시합니다. 모든 게시물 표시
레이블이 IP Camera인 게시물을 표시합니다. 모든 게시물 표시

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