在C++中使用JSON序列化OpenCv Mat
Serialize OpenCv Mat using JSON in C++
我正在尝试编写一个TCP客户端/服务器应用程序,该应用程序传输包含OpenCv Mat的对象。我想使用JSON序列化这些对象。我发现了一些库可以帮助我做到这一点(rapidjson),但它们当然不将图像视为对象成员。
您建议如何在JSON对象中序列化cv::Mat变量?例如,我如何使用RapidJson来实现这一点?
imencode
可用于将可视图像(采用CV_8UC1
或CV_8UC3
像素格式)编码为std::vector<uchar>
。指向文档的链接。
vector<uchar>
将包含相同的字节,就好像OpenCV将图像保存为支持的图像文件格式之一(如JPEG或PNG),然后将文件字节加载回字节数组中一样。
使用OpenCV 2.x时,imencode
可以在highgui模块中找到,使用OpenCV 3.x时,可以在imgcodecs模块中找到。
使用vector<uchar>
中的压缩数据,可以使用Base64编码将其格式化为字符串,然后将其作为JSON值添加到JSON对象中。
当使用JSON传输大量数据时,请非常仔细地考虑JSON库被指示发出的字符编码格式。通常,如果大部分数据将是Base64,则需要确保JSON是以UTF8发出的。
如果您可以选择以二进制形式发送(这需要在web服务中进行"带外"设计,但这并不总是可行的),那么应该认真考虑。
当考虑图像的不同序列化选择时,应该考虑以下因素:
- 典型图像大小(像素总数)
- 如果图像较小,则不太关心尺寸效率
- 像素格式(通道数量和精度)
- 大多数常见的图像文件格式将只允许8位灰度和24位RGB像素数据。试图将更高精度的像素数据保存到这些图像格式中会导致部分精度损失
- 可用的传输带宽(如果它足够稀缺,值得关注)。随着可用带宽的减少,压缩变得更加重要
- 压缩选项。
- 典型的(摄影或合成)图像是高度可压缩的,因为常识是,太"密集"的图像在人眼观看时会太难理解
- 压缩可以是无损的,也可以是有损的
- 压缩的选择可以取决于像素值(图像内容)的统计特性
- 如上所述,如果压缩是通过编码成某些图像格式来执行的,则必须确保图像格式能够满足应用程序的像素值精度要求
- 如果没有现有的图像格式满足您的要求,并且您仍然希望执行无损压缩,请考虑使用集成到OpenCV Core模块中的
zlib
API - 如果你擅长图像处理和数据压缩理论,你可能会根据自己的需求设计出一种特定于应用程序的压缩方法
- 请记住,降低图像分辨率可能是减少传输文件大小的一种强大(和超损耗)方法。仔细考虑应用程序实际需要的最低图像分辨率
- 其他注意事项
- 二进制或文本
- 无尽
highgui
、imgcodecs
或所选图像格式的图像解码器在接收端的可用性
信息来源:几个月前刚刚这么做
相关文章:
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 自定义对象的dlib序列化在gcc中失败
- C++boost序列化多态性问题
- 增强基于 XML class_id的反序列化
- 提升反序列化对象具有 nan 或 -nan 值
- 在 cpp 中的平面缓冲区中序列化对象
- 每次进行继承时都需要提升::序列化::base_object吗?
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 提升序列化 1:73 的向后兼容性问题
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 如何反序列化数组?
- 如何使用提升序列化?
- C++中的对象序列化,用于存储 OpenCV 的 SVM 对象 [OpenCV 3.1.0]
- 在C++中使用JSON序列化OpenCv Mat