当我想将float32 numpy转换为uint8 numpy然后将其转换为ctypes.Pointer(c_ubyte)时,为什么numpy.astype不起作用?

时间:2019-08-21 02:25:25

标签: numpy ctypes

我想利用python.ctypes将图像numpy传输到C ++函数中。但是C ++函数的输入与该图像numpy并不完全相同。特定的数据转换:numpy.float32-numpy.uint8 --ctypes.Pointer(ctypes.c_ubyte)。 代码:

color_in = np.asarray(color,dtype=np.uint8).ctypes.data_as(ctypes.POINTER(ctypes.c_uint8))

然后我打印color_in.contents,它显示“ c_ubyte(144)”,而color [0,0,0] = 92.0。值已更改。似乎numpy.float32没有成功转换为numpy.uint8。我很困惑。

然后我将代码分成两行,如下所示。

color_wb = np.asarray(color,dtype=np.uint8)
color_in = color_wb.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte))

'print(color_in.contents)'的结果是'c_ubyte(92)'。

然后,我尝试了一些测试。

a = np.asarray(color[0:2,0:2,:],dtype=np.uint8).ctypes.data_as(ctypes.POINTER(ctypes.c_uint8))
print(a.contents)
b = np.asarray(color[0,:,:],dtype=np.uint8).ctypes.data_as(ctypes.POINTER(ctypes.c_uint8))
print(b.contents)
b = np.asarray(color[:,0,:],dtype=np.uint8).ctypes.data_as(ctypes.POINTER(ctypes.c_uint8))
print(b.contents)
c = np.asarray(color[:,:,0],dtype=np.uint8).ctypes.data_as(ctypes.POINTER(ctypes.c_uint8))
print(c.contents)
d = np.asarray(color[:,:,:],dtype=np.uint8).ctypes.data_as(ctypes.POINTER(ctypes.c_uint8))
print(d.contents)

结果是:

>>>c_ubyte(92)
c_ubyte(92)
c_ubyte(92)
c_ubyte(192)
c_ubyte(144)

如果我先把这个矩阵的两个维度都考虑进去,那么np.asarray(matrix,dtype = xx)将不起作用。我很困惑。

===============================
python版本:python2.7

0 个答案:

没有答案