我有一个来自cv2.imread
的numpy数组,因此有dtype = np.uint8
和ndim = 3
。
我想将其转换为Cython unsigned int*
,以便与外部cpp库一起使用。
我正在尝试cdef unsigned int* buff = <unsigned int*>im.data
但是我收到错误Python objects cannot be cast to pointers of primitive types
我做错了什么?
由于
答案 0 :(得分:7)
感谢您的评论。解决方法:
cdef np.ndarray[np.uint32_t, ndim=3, mode = 'c'] np_buff = np.ascontiguousarray(im, dtype = np.uint32)
cdef unsigned int* im_buff = <unsigned int*> np_buff.data
答案 1 :(得分:0)
更现代的方式是使用memoryview而不是指针:
cdef np.uint32_t[:,:,::1] mv_buff = np.ascontiguousarray(im, dtype = np.uint32)
[:,;,::1]
语法告诉Cython,内存视图在内存中是3D和C连续的。将类型定义为memoryview而不是numpy数组的优点是
要从memoryview获取指针,请获取第一个元素的地址:
cdef np.uint32_t* im_buff = &mv_buff[0,0,0]
这比做<np.uint32_t*>mv_buff.data
更好,因为它避免了强制类型转换,并且强制类型转换通常可以隐藏错误。