C++ 如何提取opencv Mat头文件?
您好,我想将OpenCV Mat图像发送到ftp服务器,我的ftp功能的输入是C++ 如何提取opencv Mat头文件?,c++,opencv,C++,Opencv,您好,我想将OpenCV Mat图像发送到ftp服务器,我的ftp功能的输入是uchar* 我可以使用.data方法访问Opencv图像的数据部分,但我不知道如何访问要放在.data前面的标题信息,并将整个图像作为完整图像发送。所以我需要提取OpenCV Mat结构的头信息 我还需要在标题中添加一些关于图像的信息,并将整个标题+数据更改为uchar*,以便我可以发送它。我需要这样的东西: cv::Mat Myimage(100,100,CV_8UC1,cv::Scalar::all(0)); u
uchar*
我可以使用.data方法访问Opencv图像的数据部分,但我不知道如何访问要放在.data前面的标题信息,并将整个图像作为完整图像发送。所以我需要提取OpenCV Mat结构的头信息
我还需要在标题中添加一些关于图像的信息,并将整个标题+数据更改为uchar*,以便我可以发送它。我需要这样的东西:
cv::Mat Myimage(100,100,CV_8UC1,cv::Scalar::all(0));
uchar * Myimagedata = Myimage.data;
uchar * Myimageheader = Header_Extractor(Myimage);
uchar * Complete_Image = Myimageheader + Myimagedata;
SEND_FTP(Complete_Image);
为什么不发送png或jpg?与当前方法相比,您应该更喜欢这种方法,原因如下:
- 它已经有了一个内置的协议
- 请不要通过网络发送未压缩的像素
- 你可怜的ftp服务器会用cv::Mat做什么
向量缓冲区;
imencode(“.png”,MyImage,缓冲区);
发送FTP(&(缓冲区[0]);
嗯,等等,那需要一个发送函数,你也可以传递长度。您的SEND_FTP func可能会尝试strlen,它无法处理二进制数据。(顺便说一句,你最初的想法也有同样的问题)
此外,您还必须将ftp连接切换到二进制模式
我非常怀疑,您是否真的希望将cv::Mat序列化到ftp服务器(甚至在另一端如何保存?),但如果您希望发送cv::Mat,最好不要发送完整的Mat标头(这是一个复杂的beast),而是发送更简单的内容,如行、列、类型、数据(并确保Mat是连续的()) 为此,使用您自己的简单协议会容易得多——发送一个包含行数、列数和opencv数据类型的结构,然后发送原始字节。在接收端从这个重建
Mat
会更容易。完美的答案,我在另一个项目中使用了这个imencode函数,但我忘了在这个项目中使用它。非常感谢贝拉克:)
vector<uchar> buffer;
imencode(".png", MyImage, buffer);
SEND_FTP(&(buffer[0]));