投稿の長さについてお詫びします...
私は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
なぜか?