2012-07-08 181 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而没有任何中间存储。剩下的就像克里斯托夫解释的那样。