【问题标题】:Convert a string of bytes to cv::mat将一串字节转换为 cv::mat
【发布时间】:2012-12-04 14:50:12
【问题描述】:

我需要实现一个接收包含图像字节的字符串(通过boost套接字连接接收)并将信息转换OpenCV的函数cv::Mat.

我还知道图像的宽度和高度以及它的大小(以字节为单位)。我的函数如下所示:

void createImageFromBytes(const std::string& name, std::pair<int,int> dimensions, const std::string& data)
{
   int width,height;
   width = dimensions.first;
   height = dimensions.second;
   //convert data to cv::Mat image

   std::string filepng = DATA_PATH"/" + name +".png";
   imwrite(filepng, image);
}

执行此操作的最佳方法是什么? OpenCV 是否有来自字符串的 Mat 构造函数?

【问题讨论】:

  • 这个有什么更新吗?

标签: string opencv mat


【解决方案1】:

OpenCV Mat 有一个来自vector&lt;byte&gt; 的构造函数,但这并不那么直观。您需要先通过这种方式从字符串转换为向量:

std::vector<byte> vectordata(data.begin(),data.end());

然后你可以从向量中创建一个 cv::Mat:

cv::Mat data_mat(vectordata,true);

您还需要对图像进行解码(查看文档以了解哪些类型是允许的,png、jpg,具体取决于 OpenCV 版本)

cv::Mat image(cv::imdecode(data_mat,1)); //put 0 if you want greyscale

现在您可以检查生成的图像大小是否与您发送的相同:

cout<<"Height: " << image.rows <<" Width: "<<image.cols<<endl;

【讨论】:

    【解决方案2】:

    这里很容易出错,因为图像可能有空字符,并且任何处理字符串的 c 函数都会将空字符视为字符串结尾

    阅读图片

    cv::Mat image;
        image = cv::imread("../test/image.png", CV_LOAD_IMAGE_COLOR);
    

    转换为字节(这只是工作代码,未检查泄漏)

    int dataSize = image.total() * image.elemSize();
    //convert to bytes
    std::vector<char> vec(dataSize);
    memcpy(&vec[0], reinterpret_cast<char *>(image.data), dataSize);
    std::string test2(vec.begin(), vec.end());
    

    测试并查看转换是否有效

    //test
    cv::Mat data_mat(height,width,CV_8UC3,const_cast<char*>(test2.c_str()));
    imwrite("out2.png", data_mat);
    

    【讨论】:

      【解决方案3】:

      如果字符串中的数据是原始像素(而不是 Jpeg/png 等),您可以直接创建 cv::mat

      // assuming an RGB image in bytes              
      cv::Mat mat(height,width,CV_8UC3,string.data());   
      

      【讨论】:

      • 不要吹毛求疵,但高度和行不是一回事吗?
      • 我在编译时遇到错误,抱怨没有匹配的构造函数可用于 cv::Mat。由于您的帖子破坏了您的解决方案,可能会更新 opencv?
      【解决方案4】:

      这是我改进的Jav_Rock解决方案,问题是不清楚使用vector(c++中没有定义字节类型,我没有发现),而不是那个,使用vector,这是一个示例代码

      int func(char * pfile){
      string strfile = pfile;
      std::vector<unsigned char> vectordata(strfile.begin(),strfile.end());
      Mat data_mat(vectordata, true);
      Mat graySacleFrame = imdecode(data_mat, 0); //PGM image
      ...
      }
      

      【讨论】:

        猜你喜欢
        • 2013-02-18
        • 1970-01-01
        • 2012-12-29
        • 2014-05-07
        • 2011-06-07
        • 2016-04-13
        • 2011-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多