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

时间:2015-03-30 16:07:05

标签: c++ json opencv

我正在尝试编写一个TCP客户端/服务器应用程序来传输包含OpenCv Mat的对象。我想使用JSON序列化这些对象。我找到了一些帮助我这样做的图书馆(rapidjson),但他们当然没有将图像作为对象成员考虑。

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

1 个答案:

答案 0 :(得分:2)

imencode可用于将可视图片(CV_8UC1CV_8UC3像素格式)编码为std::vector<uchar>Link to documentation

vector<uchar>将包含相同的字节,就好像 OpenCV已将图像保存为支持的图像文件格式之一(例如JPEG或PNG),然后加载文件字节回到一个字节数组。

使用OpenCV 2.x时可以在highgui模块中找到

imencode,或者在使用OpenCV 3.x时可以在imgcodecs模块中找到它。

使用vector<uchar>中的压缩数据,您可以使用Base64编码将其格式化为字符串,然后可以将其作为JSON值添加到JSON对象中。

使用JSON传输大量数据时,请仔细考虑非常指示JSON库发出的字符编码格式。通常,如果大部分数据是Base64,您需要确保以UTF8格式发出JSON。

如果你可以选择发送二进制文件(这需要在网络服务中进行&#34;带外&#34;设计,并不总是可行的话),应该认真考虑。

在考虑图像的不同序列化选择时,应考虑以下因素:

  • 典型图像尺寸(总像素数)
    • 如果图像很小,尺寸效率就不那么重要了。
  • 像素格式(通道数和精度)
    • 最常见的图像文件格式仅允许8位灰度和24位RGB像素数据。试图将更高精度的像素数据保存到这些图像格式中会导致部分精度损失。
  • 可用的传输带宽(如果它不足以成为一个问题)。随着可用带宽的减少,压缩变得更加重要。
  • 压缩选项。
    • 典型(摄影或合成)图像是高度可压缩的,因为常识是图像太密集&#34;当被人的眼睛看时,将难以理解。
    • 压缩可以是无损或有损的。
    • 压缩的选择可能取决于像素值的统计特征(图像内容)。
    • 如上所述,如果通过编码为某些图像格式来执行压缩,则必须确保图像格式能够满足应用程序的像素值精度要求。
    • 如果现有的图像格式不符合您的要求,并且您仍希望执行无损压缩,请考虑使用集成到OpenCV Core模块中的zlib API。
    • 如果您擅长图像处理和数据压缩理论,您可以根据自己的需要设计特定于应用程序的压缩方法。
    • 请记住,降低图像分辨率可以是一种减少传输文件大小的强大(和超级有损)方法。请仔细考虑您的应用程序实际需要的最低图像分辨率。
  • 其他考虑因素
    • 二进制或文字
    • 字节序
    • 在接收端为highguiimgcodecs或所选图像格式的图像解码器的可用性。

信息来源:几个月前就这样做了。