Python 将存储的ndarray转换为使用C+;中的cPickle to cv::Mat创建的二进制文件+;
我有一个Python 将存储的ndarray转换为使用C+;中的cPickle to cv::Mat创建的二进制文件+;,python,c++,opencv,numpy,pickle,Python,C++,Opencv,Numpy,Pickle,我有一个ndarray保存numpy.float64数据,该数据使用dump()方法以二进制格式存储到文件中 from cPickle import dump, HIGHEST_PROTOCOL with open(filePath, 'wb') as f: dump(numpyArray, f, protocol=HIGHEST_PROTOCOL) 在撰写本文时,HIGHEST_协议使用了cPickle,但似乎没有多少关于该协议具体工作原理的文档 我试图做的是读取这个文件并用数据创建
ndarray
保存numpy.float64
数据,该数据使用dump()
方法以二进制格式存储到文件中
from cPickle import dump, HIGHEST_PROTOCOL
with open(filePath, 'wb') as f:
dump(numpyArray, f, protocol=HIGHEST_PROTOCOL)
在撰写本文时,HIGHEST_协议
使用了cPickle,但似乎没有多少关于该协议具体工作原理的文档
我试图做的是读取这个文件并用数据创建一个cv::Mat
对象(),这被证明是非常困难的
在这一点上,我希望能够尽快完成工作,而且我不太担心性能、存储空间和效率。然而,这些因素以后可能会变得很重要
因此,我的问题是,将此文件中的数据转换为cv::Mat
对象的最简单方法是什么?如果你认为最简单的方法不一定是最有效的方法,那么我也想听听你对此的想法。请注意,我可以使用不同的存储格式,可能只是一个文本文件,如果它能使Python和C++之间的互操作更容易。
我必须将
numpy
数组存储到磁盘上,因为我需要能够在移动设备(iOS和Android)上打开和读取此文件,而使用网络调用获取数据目前还不在桌面上。Pickle可能不是将数据传输到Python以外语言的方便方法
事实上,我认为Pickle根本不适合用于数据存储,因为:
- 它需要Python
- 如果使用比当前使用的Python版本更高的Python版本保存,则可能无法正常工作
- 如果不信任数据源,则不安全
- 二进制格式,使用
。这可能是追求速度和尺寸的方法,而且不太难做到tofile
- CSV文件,可能已压缩(用于1D/2D阵列)。您可以使用
savetxt
- JSON,可能是压缩的,带有
和tolist()
。这将是缓慢的,并产生大文件,但它将是可移植的,它将适用于任何维度,甚至不相等的行/列长度转储文件
- 如果你可以使用熊猫,它支持
- 将小整数的二维数组另存为无损灰度图像。或者更努力地使用3种颜色和alpha通道来存储单个精度浮点数组
- 使用(Fortan)无格式数据(,),这实际上相当有效地利用了空间,但受到许多可移植性问题的困扰
- 作为b64(b85表示额外点数)编码字符串。如果您知道矩阵布局,那么它是非常可移植的(反正是b64),并且可能比纯文本(比如csv)小
在工作中,我们避免了酸洗,而是使用numpy中的原始字节数组。我们得到字节数组,用lz4压缩它,然后用其他语言重建数组就很容易了。我们使用MUGODB来存储LZ4压缩字节数组。谢谢这个建议,但是最后我决定把<代码> NDAREX < /C> >作为CSV,然后加载到C++中。我知道这不是最有效的解决方案,但就目前而言,它是有效的。