2012-07-08 6 views
0

cURL을 사용하여 Amazon S3의 데이터에 액세스하는 데 C++ 라이브러리가 여러 개 있다는 것을 알고 있습니다. 그들을 사용하여 이미지를 로컬 컴퓨터에 다운로드하고 OpenCV로 읽고 원본 파일을 삭제할 수 있습니다.openCV를 사용하여 Amazon S3에서 이미지 읽기

그러나 S3에서 OpenCV로 직접 이미지를 읽을 수 있는지 궁금합니다. 매트 객체.

누구든지이 작업을 수행 할 수 있습니까?

답변

2

메모리에서 매트릭스로 일부 이미지 데이터 (png, jpeg 등)가있는 버퍼를로드하는 cv::imdecode을 사용하십시오.

// Suppose that a std::vector<char> contains the data loaded by Curl. 
std::vector<char> data; 
// The template<typename T> explicit cv::Mat::Mat(const std::vector<T>& vec) 
// constructor gives this vector a cv::Mat header. 
cv::Mat data_mat(data); 
// Now use cv::imdecode to decode the image to a BGR matrix. 
cv::Mat image(cv::imdecode(data_mat)); 
+0

현재 [Poco] (http://www.pocoproject.org) 라이브러리를 사용하여 이미지를 입력 스트림으로 읽어서 Mat 파일로로드하려하지만 성공하지 못했습니다. –

+0

Poco에 익숙하지 않지만 파일로 이미지를 다운로드 할 수있는 경우 먼저 이미지를 메모리에 저장하고 디스크에 기록해야합니다. 당신이해야 할 일은 그 바이트들을 메모리에서 충분히 큰 버퍼로 읽은 다음'cv :: imdecode'를 호출하는 것입니다. –

+0

Poco는 지정된 URI에서 HTTP 응답을 가져옵니다. 나는 그것을 istream로 읽을 수있다. '표준 : : 벡터 raw_data (:;' 그리고, 내가 사용 벡터 로 변환'표준 : : IStream을 & RS는 = session.receiveResponse (응답) : 이 데이터가 IStream을에 얻을하는 방법입니다 (std :: istream_iterator rs)), std :: istream_iterator ())' 이 후, 나머지는'cv :: imdecode'를 사용하고 있습니다 :'cv :: Mat image_data (raw_data); \t \t cv :: Mat image (cv :: imdecode (image_data, 1)); ' 괜찮 으면 컴파일되지만 실행하면'cvGetMat에서 지원되지 않거나 인식 할 수없는 배열 유형 '이라는 오류가 발생합니다. –

0

그렇기 때문에이 부분은 Poco 쪽이됩니다. StreamCopier::copyToString(*pStr.get(), str);

std::auto_ptr<std::istream> pStr(URIStreamOpener::defaultOpener().open(uri));

는 중간 저장하지 않고 문자열 str에 공급 된 URI에서 이미지를 얻을 것입니다. 나머지는 크리스토프가 설명했다.

관련 문제