【问题标题】:Loading an image from a URL into a variable/opencv Mat将图像从 URL 加载到变量/opencv Mat
【发布时间】:2015-05-24 12:35:38
【问题描述】:
bool loadImage(string inputName, Mat &image)
{
  bool from_net = true;

  if (inputName.find("http") != string::npos)
    {
      string URL = inputName;
      if (inputName.find("\"") == 0)
        {
          URL = inputName.substr(1,inputName.length()-2);
        }
      ofstream myfile;
      myfile.open ("test.jpg");
      //  Create a writer to handle the stream

      curl_writer writer(myfile);
      // Pass it to the easy constructor and watch the content returned in that file!
      curl_easy easy(writer);

      // Add some option to the easy handle
      easy.add(curl_pair<CURLoption,string>(CURLOPT_URL,URL));
      easy.add(curl_pair<CURLoption,long>(CURLOPT_FOLLOWLOCATION,1L));
      try {
        easy.perform();
      } catch (curl_easy_exception error) {
        // If you want to get the entire error stack we can do:
        vector<pair<string,string>> errors = error.what();
        // Otherwise we could print the stack like this:
        //error.print_traceback();
      }
      myfile.close();

      string inputname = "test.jpg";
      image = imread(inputname,1);

      if(image.rows == 0 || image.cols == 0)
          from_net = false;
    }  
  else
    {
      image = imread( inputName, 1 );
      if (image.total() < 1)         
          from_net = false;

    }
  return from_net; 
}

如果我将test.txt 更改为test.jpg,这对我的应用程序来说很好。但是,我的应用程序要求我避免创建文件、读取、写入和关闭文件的开销。有没有一种简单直接的方法可以从 URL 中获取图像数据并将其写入 openCV Mat 中?

我还尝试了上述链接中的第三个示例。但是由于某种原因,当我执行receiver.get_buffer() 时,图像仍然是空的。我得到的图像尺寸为0X0

非常感谢任何与此相关的帮助。我以前从未使用过 curlcpp,因此,任何详细的解释都将不胜感激。

谢谢。

【问题讨论】:

  • 请在您的问题中包含所有相关代码。我们不能指望引用一些外部网站来理解您的问题。
  • 我已经编辑了代码以准确显示我想要做什么。

标签: c++ opencv curl opencv-mat


【解决方案1】:

有一个简单的解决方案,我很遗憾没有早点注意到这一点。您可以将数据写入ostringstream。详情请看下面的代码。

bool loadImage(string inputName, Mat &image)
{
  bool from_net;
  from_net = true;


  if (inputName.find("http") != string::npos)
    {
      string URL;
      URL = inputName;
      if (inputName.find("\"") == 0)
        {
           URL = inputName.substr(1,inputName.length()-2);
        }

  std::ostringstream stream;

  curl_writer writer(stream);
  // Pass it to the easy constructor and watch the content returned in that file!
  curl_easy easy(writer);

  // Add some option to the easy handle
  easy.add(curl_pair<CURLoption,string>(CURLOPT_URL,URL));
  easy.add(curl_pair<CURLoption,long>(CURLOPT_FOLLOWLOCATION,1L));

  try {
    easy.perform();
  } catch (curl_easy_exception error) {
    // If you want to get the entire error stack we can do:
    vector<pair<string,string>> errors = error.what();
    // Otherwise we could print the stack like this:
    error.print_traceback();
  }
  string output = stream.str(); // convert the stream into a string
  if (output.find("404 Not Found") != string::npos)
    from_net = false;
  else
  {
      vector<char> data = std::vector<char>( output.begin(), output.end() ); //convert string into a vector 
  if (data.size() > 0)
    {
      Mat data_mat = Mat(data); // create the cv::Mat datatype from the vector
      image = imdecode(data_mat,-1); //read an image from memory buffer
      if(image.rows == 0 || image.cols == 0)
    from_net = false;
    }
  else
    from_net = false;
    }
}
  else
    {
      image = imread( inputName, 1 );
      if (image.total() < 1)         
        from_net = false;   
    }
  return from_net;
}

【讨论】:

    猜你喜欢
    • 2013-04-13
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2017-07-13
    • 2011-05-03
    • 1970-01-01
    相关资源
    最近更新 更多