2017-08-24 36 views
0

我正在将二进制OpenCV Mat保存到HDF5文件。
在OpenCV的垫文件存储在与第一索引信道存储器中,第二个索引是X坐标和第三索引是Y坐标,所以一个地址访问的样子:
以错误的方式遍历数组数据Python/Matlab

address = M.data + M.step[0]*y + M.step[1]*x + ch 

凡M.step [0 ] = NUM​​_X * NUM_CH和M.step [1] = MAX_CH

我遇到的问题是,Matlab和Python以错误的方式解释数据。
尽管读取数据的尺寸设置正确(通道,x,y),但当我查看我看到的数据存储时, numpy向后读取数据,这意味着首先y递增,然后x和最后的通道数,这意味着它假定通道数据的平面配置,而它实际上是交织的。这导致图像显示错误。
有没有办法告诉numpy/Matlab改变数据访问,而不重新排序数据?
在此先感谢。

编辑:
我存储一切在秩3的数据集在HDF5文件,其中维度1是信道,尺寸2是x坐标和尺寸3是y坐标。
如果我读取该数据集并使用C++中的OpenCV处理该数据集,则会显示正确的图像。在功能cvGetMat通过改变阵列,它已在一个被计算出的形状和步幅(-206)无法识别的或不支持的阵列型

+0

你是如何读入的Python?你可以创建一个自定义numpy dtype来读入。我最近参加的一个聚会上有一个关于使用自定义numpy数据类型来读取任意数据的讨论,你可以在[这里]查看它(https://github.com/desertpy/presentations/blob/master/numpy-datatypes -godber/Numpy_Dtypes.ipynb)。也许这会有所帮助。 –

回答

0

我能解决的问题在python:OpenCV的在Python不因为错误的工作错误的方式:
如果我有一个3 * 1280 * 720 uint8图像3是通道号,1280是x坐标和720是y坐标,我将不得不分配形状,所以它看起来像data.shape =(720,1280,3),步幅必须改为data.strides =(3 * 1280,3,1)。

此链接介绍如何numpy的阵列中存储工作:
Numpy doc