我遇到了一个问题,一些numpy数组无法使用cv.fromarray()转换为cvMat。似乎每当numpy数组被转置时就会出现问题。
import numpy as np
import cv
# This works fine:
b = np.arange(6).reshape(2,3).astype('float32')
B = cv.fromarray(b)
print(cv.GetSize(B))
# But this produces an error:
a = np.arange(6).reshape(3,2).astype('float32')
b = a.T
B = cv.fromarray(b)
print(cv.GetSize(B))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "test_err.py", line 17, in <module>
B = cv.fromarray(b)
TypeError: cv.fromarray array can only accept arrays with contiguous data
有什么建议吗?我的许多数组都在某个时刻被转置了,所以错误经常出现。
我在MacOS X Lion上使用Python2.7,从MacPorts安装了NumPy1.6.2和OpenCV 2.4.2.1。
您可以使用flags.contiguous
属性检查数组,如果不是,则使用copy()
:
>>> a = np.arange(16).reshape(4,4)
>>> a.flags.contiguous
True
>>> b = a.T
>>> b.flags.contiguous
False
>>> b = b.copy()
>>> b.flags.contiguous
True
当您请求转置时,numpy实际上并不转置数据,只转置用于访问数据的步幅,除非您特别使用copy()
触发复制。