【问题标题】:Array data is traversed in a wrong way Python/Matlab数组数据以错误的方式遍历Python/Matlab
【发布时间】:2018-02-02 13:25:27
【问题描述】:

我正在将二进制 OpenCV Mat 保存到 HDF5 文件中。
在 OpenCV Mat 文件中,第一个索引通道存储在内存中,第二个索引是 x 坐标,第三个索引是 y 坐标,因此地址访问如下所示:

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 更改数据访问,而不重新排序数据?
提前致谢。

编辑:
我将所有内容存储在 hdf5 文件中的 rank 3 数据集中,其中维度 1 是通道,维度 2 是 x 坐标,维度 3 是 y 坐标。
如果我读取该数据集并使用 C++ 中的 OpenCV 对其进行处理,则会显示正确的图像。由于错误,python 中的 OpenCV 不起作用:(-206) 函数 cvGetMat 中的数组类型无法识别或不受支持

【问题讨论】:

  • 你是如何将它读入 Python 的?您可以创建一个自定义的 numpy dtype 来读入。我最近参加的一个聚会讨论了使用自定义 numpy 数据类型读取任意数据,您可以查看 here。也许这会有所帮助。

标签: python c++ matlab opencv hdf5


【解决方案1】:

我可以通过改变数组的形状和步幅来解决python中的问题,数组的计算方式错误:
如果我有一个 3*1280*720 uint8 图像,其中 3 是通道号,1280 是 x 坐标,720 是 y 坐标,我必须分配形状,所以它看起来像 data.shape = (720, 1280 , 3) 并且步幅必须更改为 data.strides = (3*1280,3,1)。

此链接解释了 numpy 数组如何在内存中工作:
Numpy doc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多