将一串字节转换为cv::mat

10

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


1
这个有任何更新吗? - Sleeba Paul
4个回答

18

OpenCV Mat可以从vector<byte>构造函数中创建对象,但这不是很直观。您需要首先按照以下方式将字符串转换为向量:

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

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

cv::Mat data_mat(vectordata,true);
你还需要解码图像(查看文档以了解允许使用的类型,例如png、jpg,取决于OpenCV版本)。

你还需要解码图像(查看文档以了解允许使用的类型,例如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;

什么是 byte?它是 std::byte 吗? - Константин Ван

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

1
如果字符串中的数据是原始像素(而不是Jpeg/png等格式),您可以直接创建cv::mat。
// assuming an RGB image in bytes              
cv::Mat mat(height,width,CV_8UC3,string.data());   

5
不是挑刺,但“height”和“rows”不是同一个意思吗? - trianta2
我在编译时遇到错误,提示此处使用的cv::Mat没有匹配的构造函数。可能是自您发布后opencv进行了更新,导致您的解决方案出现问题? - Mike Lawrence

0

这是我改进的Jav_Rock解决方案,问题在于使用向量不够清晰(在C++中未定义字节类型,我没有找到它),因此请使用向量。以下是示例代码:

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
...
}

std::byte 中哭泣 - Константин Ван

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接