我正在尝试编写一个TCP客户端/服务器应用程序来传输包含OpenCv Mat的对象。我想使用JSON序列化这些对象。我找到了一些帮助我这样做的图书馆(rapidjson),但他们当然没有将图像作为对象成员考虑。
您建议在JSON对象中序列化一个cv :: Mat变量?例如,我如何使用RapidJson来实现这一目标?
答案 0 :(得分:2)
imencode
可用于将可视图片(CV_8UC1
或CV_8UC3
像素格式)编码为std::vector<uchar>
。 Link to documentation。
vector<uchar>
将包含相同的字节,就好像 OpenCV已将图像保存为支持的图像文件格式之一(例如JPEG或PNG),然后加载文件字节回到一个字节数组。
imencode
,或者在使用OpenCV 3.x时可以在imgcodecs模块中找到它。
使用vector<uchar>
中的压缩数据,您可以使用Base64编码将其格式化为字符串,然后可以将其作为JSON值添加到JSON对象中。
使用JSON传输大量数据时,请仔细考虑非常指示JSON库发出的字符编码格式。通常,如果大部分数据是Base64,您需要确保以UTF8格式发出JSON。
如果你可以选择发送二进制文件(这需要在网络服务中进行&#34;带外&#34;设计,并不总是可行的话),应该认真考虑。
在考虑图像的不同序列化选择时,应考虑以下因素:
zlib
API。highgui
,imgcodecs
或所选图像格式的图像解码器的可用性。信息来源:几个月前就这样做了。