python - 将存储的 ndarray 转换为使用 cPickle 创建的二进制文件到 C++ 中的 cv::Mat

标签 python c++ opencv numpy pickle

我有一个 numpy ndarray 保存 numpy.float64 数据,使用 cPickle's 以二进制格式存储到文件中dump() 方法。

from cPickle import dump, HIGHEST_PROTOCOL
with open(filePath, 'wb') as f:
    dump(numpyArray, f, protocol=HIGHEST_PROTOCOL)

在撰写本文时,HIGHEST_PROTOCOL 使用 cPickle 的 protocol version 2但似乎没有太多文档说明该协议(protocol)究竟是如何工作的。

我想做的是读取这个文件并用数据创建一个 cv::Mat 对象 ( see here ),事实证明这很难做到。

在这一点上,我希望尽快让一切正常运行,我不太担心性能、存储空间和效率。但是,这些因素以后可能会变得很重要。

因此,我的问题是,将此文件中的数据转换为 cv::Mat 对象的最简单方法是什么?如果您认为最简单的方法不一定是最有效的方法,那么我也很想听听您的想法。请注意,我愿意使用不同的存储格式,可能只是一个文本文件,如果它可以使 Python 和 C++ 之间的互操作性更容易的话。

我必须将 numpy 数组存储到磁盘,因为我需要能够在移动设备(iOS 和 Android)上打开和读取此文件并使用网络调用获取数据目前还没有真正摆在桌面上。

最佳答案

Pickle 可能不是将数据传输到 Python 以外的语言的便捷方式。

事实上,我认为 Pickle 根本不适合数据存储,因为:

  • 它需要 Python
  • 如果使用比您使用的更高版本的 Python 保存它可能无法工作
  • 不信任数据源是不安全的

这并不是说它没有用途:它对于缓存、个人脚本或进程之间的数据通信等用途很方便。

不过其他人可能不同意这种观点。

那么你会用什么?以下是一些想法:

  • 二进制格式,使用tofile。这可能是追求速度和尺寸的方法,而且并不难 load .
  • CSV 文件,可能是压缩的(对于一维/二维数组)。您可以使用 savetxt
  • JSON,可能已压缩,带有 tolist()dumps。这会很慢并且会生成大文件,但它是可移植的并且适用于任何维度,甚至适用于不相等的行/列长度。
  • 如果你可以使用 Pandas,它支持 many formats .

还有一些只是为了好玩:

  • 将二维小整数数组保存为无损灰度图像。或者更努力地使用 3 种颜色和 alpha channel 来存储单精度 float 组。
  • 使用 (Fortan) 未格式化的数据( pythonC ),这实际上是相当有效地利用空间,但受到许多可移植性问题的困扰。
  • 作为 b64(b85 加分)编码的字符串。如果您知道矩阵布局,则非常便携(无论如何都是 b64),并且可能比纯文本(如 csv)小。

编辑:here is a benchmark for various methods :

array storage benchmark

关于python - 将存储的 ndarray 转换为使用 cPickle 创建的二进制文件到 C++ 中的 cv::Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32359734/

相关文章:

c++ - 移植到不同架构的潜在问题

c++ - 在 Linux C++ 中按任意键继续

python - 在 Python 中为 OpenCV 视频对象指定压缩质量

python - TypeError: 'NoneType' 类型的参数在 if 语句后不可迭代

python - python中的while循环,输入和字符串有问题

python - 相当于 GNU coreutils/bin/date 输出与 Python2(时区)

c++ - 是否有 C++ 等价于逻辑 when?

python - OpenCV:AttributeError:模块 'cv2' 没有属性 'face'

python - 在一个窗口中重复交替显示两个图像

Python pandas 计算每列中的出现次数