0

为帖子的长度道歉...

我正在使用 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

知道为什么吗?

4

1 回答 1

1

由于 OpenCV 中的错误而失败:http: //code.opencv.org/issues/1393

您应该能够通过将翻转矩阵乘以 1 来解决此问题:

original = original * 1
于 2012-05-26T13:05:32.390 回答