我有一个来自 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
我究竟做错了什么?
谢谢
2 回答
感谢您的意见 . 解决方法:
更现代的方法是使用内存视图而不是指针:
[:,;,::1]
语法告诉Cython内存视图在内存中是3D和C连续的 . 将类型定义为内存视图而不是numpy数组的优点是它可以接受任何定义缓冲区接口的类型,例如内置数组模块或PIL成像库中的对象 .
可以在不保存GIL的情况下传递Memoryview,这对并行代码很有用
要从memoryview获取指针,请获取第一个元素的地址:
这比做
<np.uint32_t*>mv_buff.data
更好,因为它避免了强制转换,而强制转换通常可以隐藏错误 .