为帖子的长度道歉...
我正在使用 cython 来包装一些用于图像处理的 cpp 代码。
在返回我处理的 32 位 ARGB 模式的图像时 - 即 32 位 uint where r = (buff[0] >> 16) & 0xFF; g = (buff[0] >> 8) & 0xFF; g = buff[0] & 0xFF
,我使用此处手册中建议的 python 对象将数据读入 ndarray:http: //docs.scipy.org /doc/numpy/user/c-info.how-to-extend.html使用以下类:
cdef class DataPointer:
cdef void* data_ptr
cdef int size
cdef set_data(self, int size, void* data_ptr):
self.size = size
self.data_ptr = data_ptr
def __array__(self):
return np.PyArray_SimpleNewFromData(2, [self.size,4], np.NPY_UINT8, self.data_ptr)
和以下电话:
cdef np.ndarray image
data = DataPointer()
data.set_data(height*width, <void*>im_buff)
image = np.array(data, copy=False)
image.base = <PyObject*> data
Py_INCREF(data)
这给了我一个数组,其中每一行都是单独的 ARGB 值,因此有 shape (height*width, 4)
。它们看起来像这样:
[ 67 115 138 1]
这些值对应于 BGR A。
现在如果我继续做
original = np.delete(image, 3, 1).reshape((height, width, 3)
cv2.imshow('out', original)
它工作正常,但是 RGB 值被反转为 BGR,因此图像看起来很有趣。
但是,当我尝试像这样翻转值时:
original = np.fliplr(np.delete(image, 3, 1)).reshape((height, width, 3))
print original [0, :3]
cv2.imshow('out', original)
我打印了以下正确的 RGB 值,但来自 cv2.imshow() 的错误消息
[[138 115 67]
[138 114 68]
[136 110 64]]
OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file /Users/Tom/Desktop/OpenCV-2.4.0/modules/core/src/array.cpp, line 2482
知道为什么吗?