8

我需要实现一个函数,该函数接收包含图像字节的字符串(通过 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 构造函数?

4

4 回答 4

16

OpenCV Mat有一个来自 的构造函数vector<byte>,但这不是那么直观。您需要先以这种方式从字符串转换为向量:

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

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

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;
于 2012-12-04T14:56:59.650 回答
2

在这里很容易绊倒,因为图像可能包含空字符,并且任何处理字符串的 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);
于 2018-07-30T05:42:41.683 回答
1

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

// assuming an RGB image in bytes              
cv::Mat mat(height,width,CV_8UC3,string.data());   
于 2012-12-04T15:48:58.863 回答
0

这是我对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
...
}
于 2016-07-24T03:57:02.557 回答