在C++中使用JSON序列化OpenCv Mat

Serialize OpenCv Mat using JSON in C++

本文关键字:序列化 OpenCv Mat JSON C++      更新时间:2023-10-16

我正在尝试编写一个TCP客户端/服务器应用程序,该应用程序传输包含OpenCv Mat的对象。我想使用JSON序列化这些对象。我发现了一些库可以帮助我做到这一点(rapidjson),但它们当然不将图像视为对象成员。

您建议如何在JSON对象中序列化cv::Mat变量?例如,我如何使用RapidJson来实现这一点?

imencode可用于将可视图像(采用CV_8UC1CV_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
    • 如果你擅长图像处理和数据压缩理论,你可能会根据自己的需求设计出一种特定于应用程序的压缩方法
    • 请记住,降低图像分辨率可能是减少传输文件大小的一种强大(和超损耗)方法。仔细考虑应用程序实际需要的最低图像分辨率
  • 其他注意事项
    • 二进制或文本
    • 无尽
    • highguiimgcodecs或所选图像格式的图像解码器在接收端的可用性

信息来源:几个月前刚刚这么做