提问者:小点点

将字节字符串转换为CV::MAT


我需要实现一个函数,该函数接收包含映像字节的字符串(通过boost socket连接接收),并将信息转换为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提供了一个构造函数?


共3个答案

匿名用户

OpenCV Mat有一个来自vector的构造函数,但这并不那么直观。 您需要首先以以下方式将字符串转换为向量:

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

然后您可以从Vector:

cv::Mat data_mat(vectordata,true);

您还需要解码图像(根据OpenCV版本,检查允许使用哪些类型的文档,png,jpg)

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

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

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

匿名用户

这里很容易跳转,因为图像可能有null字符,并且任何处理字符串的c函数都将看到null作为字符串结尾

读取图像

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);

匿名用户

如果字符串中的数据是原始像素(而不是JPEG/PNG等),您可以直接创建CV::MAT

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