我知道有多个C++库可以使用cURL从Amazon S3访问数据。使用它们,我可以将图像下载到本地机器,将其读入OpenCV,然后删除原始文件。使用openCV从Amazon S3读取图像
但是,我想知道是否有可能直接从S3读入OpenCV的图像,就像是一个Mat对象。
任何人都可以帮助我完成这件事吗?
我知道有多个C++库可以使用cURL从Amazon S3访问数据。使用它们,我可以将图像下载到本地机器,将其读入OpenCV,然后删除原始文件。使用openCV从Amazon S3读取图像
但是,我想知道是否有可能直接从S3读入OpenCV的图像,就像是一个Mat对象。
任何人都可以帮助我完成这件事吗?
使用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));
所以,这就是我所要做的,就波科方面而言。
std::auto_ptr<std::istream> pStr(URIStreamOpener::defaultOpener().open(uri));
StreamCopier::copyToString(*pStr.get(), str);
这将获得从所提供的URI的图像到字符串str
而没有任何中间存储。剩下的就像克里斯托夫解释的那样。
我目前正在将图像读入输入流(使用[Poco](http://www.pocoproject.org)库)并尝试将其加载到Mat文件中,但我不太成功。 – 2012-07-08 15:58:14
我对Poco并不熟悉,但是,如果您可以将图像作为文件下载,它必须先存储在内存中,然后写入磁盘。你应该做的是将这些字节读入内存中足够大的缓冲区,然后调用'cv :: imdecode'。 – 2012-07-08 16:20:26
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