9

I have a numpy array which came from a cv2.imread and so has dtype = np.uint8 and ndim = 3.

I want to convert it to a Cython unsigned int* for use with an external cpp library.

I am trying cdef unsigned int* buff = <unsigned int*>im.data however I get the error Python objects cannot be cast to pointers of primitive types

What am I doing wrong?

Thanks

2
  • The answers to this one probably help: stackoverflow.com/q/3046305/222914 Commented May 23, 2012 at 11:31
  • 2
    Note also that np.uint8 is unsigned char, not unsigned int. Commented May 23, 2012 at 11:40

2 Answers 2

13

The more modern way would be to use a memoryview rather than a pointer:

cdef np.uint32_t[:,:,::1] mv_buff = np.ascontiguousarray(im, dtype = np.uint32)

The [:,;,::1] syntax tells Cython the memoryview is 3D and C contiguous in memory. The advantage of defining the type to be a memoryview rather than a numpy array is

  1. it can accept any type that defines the buffer interface, for example the built in array module, or objects from the PIL imaging library.
  2. Memoryviews can be passed without holding the GIL, which is useful for parallel code

To get the pointer from the memoryview get the address of the first element:

cdef np.uint32_t* im_buff = &mv_buff[0,0,0]

This is better than doing <np.uint32_t*>mv_buff.data because it avoids a cast, and casts can often hide errors.

Sign up to request clarification or add additional context in comments.

Comments

9

thanks for your comments. solved by:

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

2 Comments

you should probably use np.uint instead of np.uint32 (unsigned int might be 64-bit on some systems).
according to github.com/cython/cython/wiki/tutorials-NumpyPointerToC, &np_buff[0,0,0] would be better than <unsigned int*> np_buff.data

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.