我需要实现一个函数,接收包含图像字节的字符串(通过boost套接字连接接收),将信息转换为 OpenCV CV ::垫
我也知道图像的宽度和高度及其大小(以字节为单位)。我的功能如下:
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的构造函数?
答案 0 :(得分:12)
OpenCV Mat 有vector<byte>
的构造函数,但这不是那么直观。您需要首先以这种方式从字符串转换为向量:
std::vector<byte> vectordata(data.begin(),data.end());
然后你可以从vector:
创建一个cv :: Matcv::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;
答案 1 :(得分: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);
答案 2 :(得分:1)
如果字符串中的数据是原始像素(而不是Jpeg / png等),则可以直接创建cv :: mat
// assuming an RGB image in bytes
cv::Mat mat(height,width,CV_8UC3,string.data());
答案 3 :(得分: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
...
}