Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 将字节字符串转换为cv::mat_String_Opencv_Mat - Fatal编程技术网

String 将字节字符串转换为cv::mat

String 将字节字符串转换为cv::mat,string,opencv,mat,String,Opencv,Mat,我需要实现一个函数,接收包含图像字节的字符串(通过boost套接字连接接收),并将信息转换为OpenCV::Mat 我还知道图像的宽度和高度及其大小(以字节为单位)。我的函数如下所示: void createImageFromBytes(const std::string& name, std::pair<int,int> dimensions, const std::string& data) { int width,height; width = di

我需要实现一个函数,接收包含图像字节的字符串(通过boost套接字连接接收),并将信息转换为OpenCV::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);
}
void createImageFromBytes(常量std::string&name,std::pair维度,常量std::string&data)
{
int宽度、高度;
宽度=尺寸。首先;
高度=尺寸。秒;
//将数据转换为cv::Mat图像
std::string filepng=数据路径“/”+name+“.png”;
imwrite(文件png,图像);
}

哪种方法是最好的?OpenCV是否有一个来自字符串的Mat构造函数?

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

std::vector<byte> vectordata(data.begin(),data.end());
您还需要解码图像(根据OpenCV版本,检查允许哪些类型的文档,png、jpg)

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

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

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

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

这是我改进的javiRoor解决方案,问题是使用向量不是很清楚(字节类型不是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
...
}
int func(char*pfile){
字符串strfile=pfile;
向量向量数据(strfile.begin(),strfile.end());
Mat data_Mat(矢量数据,真);
Mat graySacleFrame=imdecode(数据_Mat,0);//PGM图像
...
}

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

阅读图片

cv::Mat image;
    image = cv::imread("../test/image.png", CV_LOAD_IMAGE_COLOR);
转换为字节(这只是工作代码,没有检查泄漏)

int dataSize=image.total()*image.elemSize();
//转换为字节
std::向量向量向量(dataSize);
memcpy(&vec[0],重新解释(image.data),数据大小;
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);
//测试
cv::Mat data_Mat(高度、宽度、cv_8UC3、常数转换(test2.c_str());
imwrite(“out2.png”,data_mat);

不要吹毛求疵,但高度和行不是一回事吗?我在编译时遇到错误,抱怨没有匹配的构造函数来使用cv::Mat。由于您的帖子破坏了您的解决方案,可能会更新opencv?对此有任何更新吗?
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);