0

投稿の長さについてお詫びします...

私はcythonを使用して、画像処理用のcppコードをラップしています。

32ビットARGBモードの処理済み画像(つまり、32ビットuint )が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値であり、形状が異なる配列が得られます(height*width, 4)。彼らはこのように見えます:

[ 67 115 138   1]

これらの値がBGRAに対応する場合。

今、私が先に進んでやれば

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 に答える