2012-07-08 101 views
0

我知道有多個C++庫可以使用cURL從Amazon S3訪問數據。使用它們,我可以將圖像下載到本地機器,將其讀入OpenCV,然後刪除原始文件。使用openCV從Amazon S3讀取圖像

但是,我想知道是否有可能直接從S3讀入OpenCV的圖像,就像是一個Mat對象。

任何人都可以幫助我完成這件事嗎?

回答

2

使用cv::imdecode,它會從內存中加載一個緩衝區,其中包含一些圖像數據(png,jpeg等)到一個矩陣中。

// 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文件中,但我不太成功。 – 2012-07-08 15:58:14

+0

我對Poco並不熟悉,但是,如果您可以將圖像作爲文件下載,它必須先存儲在內存中,然後寫入磁盤。你應該做的是將這些字節讀入內存中足夠大的緩衝區,然後調用'cv :: imdecode'。 – 2012-07-08 16:20:26

+0

Poco從給定的URI獲取HTTP響應。我能夠將它讀入一個流水。 這是怎樣的數據,獲得到的IStream:'的std :: istream的&RS = session.receiveResponse(響應);' 然後,我將其轉換成使用矢量: '的std ::矢量 raw_data( (std :: istream_iterator rs)),std :: istream_iterator ());' 之後,我使用'cv :: imdecode'作爲其餘部分:'cv :: Mat image_data(raw_data);編譯好,但是當我運行它時,我得到一個錯誤,說'cvGetMat'中不支持或無法識別的數組類型。 – 2012-07-08 16:22:53

0

所以,這就是我所要做的,就波科方面而言。

std::auto_ptr<std::istream> pStr(URIStreamOpener::defaultOpener().open(uri)); StreamCopier::copyToString(*pStr.get(), str);

這將獲得從所提供的URI的圖像到字符串str而沒有任何中間存儲。剩下的就像克里斯托夫解釋的那樣。