在opencv的cython中翻转ndarray的顺序 - OpenCV错误

时间:2012-05-26 11:58:45

标签: python opencv numpy cython

道歉的长度......

我正在使用cython来包装一些用于图像处理的cpp代码。

返回处理后的32位ARGB模式的图像 - 即32位uint r = (buff[0] >> 16) & 0xFF; g = (buff[0] >> 8) & 0xFF; g = buff[0] & 0xFF,我按照手册中的建议使用python对象将数据读入ndarray:{ {3}}使用以下类:

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值,因此形状为(height*width, 4)。它们看起来像这样:

[ 67 115 138   1]

这些值对应于B G R 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

知道为什么吗?

1 个答案:

答案 0 :(得分:1)

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

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

original = original * 1