2016-06-03 21 views
0

Ich mache einige Cython-Wrapping und es kommt, dass ich einen Zeiger auf ein Array von nicht signierten Zeichen in ein numpy Array konvertieren muss. Keine der Methoden, die ich versucht habe, hat funktioniert. Außerdem würde ich es lieber tun, ohne die Daten tatsächlich zu kopieren, wenn das möglich ist.Pointer in Array von unsignierten Chars zu Numpy Array konvertieren

Hier ist die Funktion in Frage, mit der ich mich beschäftigt habe.

def getImage(self): 
    cdef int size = self.c_cam.getResolution()[0]*self.c_cam.getResolution()[1]*3 

    return np.ctypeslib.as_array(self.c_cam.getImage(), shape=size*sizeof(unsigned char)) 

self.c_cam.getImage() gibt einen Zeiger auf die Array-Daten (als ein Mitglied der Klasse gespeichert c_cam) Jedoch wirft diese

AttributeError: 'str' object has no attribute '__array_interface__' 

bei der Ausführung. Obwohl ich ehrlich gesagt nicht weiß, wie es funktionieren würde, weil nichts den Datentyp angibt.

EDIT: Also habe ich folgendes mindestens Arbeit

cdef unsigned char* data = self.c_cam.getImage() 
    dest = np.empty(size) 
    for i in range(0,size): 
     dest[i] = <int> data[i] 
    return dest 

bekommen aber offensichtlich handelt es sich dabei um die Daten zu kopieren, damit ich noch einen anderen Weg finden wollen würde, dies zu tun.

Antwort

1

Ich glaube, ich habe eine Antwort bekam, die

import ctypes as c 
from libc.stdint cimport uintptr_t[1]*3 
data = <uintptr_t>self.c_cam.getImage()  
data_ptr = c.cast(data, c.POINTER(c.c_uint8)) 
array = np.ctypeslib.as_array(data_ptr, shape=(SIZE,)) 
Kopieren verhindert