gpt4 book ai didi

python - 通过 ctypes 将 C 数组传递给 python

转载 作者:行者123 更新时间:2023-11-30 15:29:51 28 4
gpt4 key购买 nike

我有一个控制相机的 C 函数,我试图通过 Ctypes 将图像缓冲区发送到 Python,以便在 GUI 中使用。

我可以抓取缓冲区,但我基本上不知道如何让它工作,我想我可以研究 numpy-c api,但它看起来很困惑。

到目前为止,我已经尝试过以下方法:

创建一个 C 数组(我猜它是通过指针引用),类似于:

   UINT16 * MyFunction()
{

...grab image... and return Buffer

size = 2088 * 2080 * sizeof( UINT16);
array = (BYTE*) malloc(size);
API_Write_to_buffer(Buffer, 0, array, size);

API_Free_Buffer(Buffer);


return array;
}

我可以尝试在python中获取数组的返回:

Data = MyFunction() 
array = (c_ubyte * size).from_address(addressof(Data.contents))

其中 MyFunction() 如下所示:

def MyFunction():

MyFunction= lib.MyFunction
MyFunction.restype = POINTER(c_ubyte)
img_arr = MyFunction()
return img_arr

另一种选择是使用指针逐行读取:

for(i=0;i<Width;i++)
{
Ptr = (UINT16*)(bufferPointer + i*bufferWidth);
for(j=0;j<Height;j++)
{
...
}
}

更新:

事实证明,我需要为我的数组分配一个指针,但它是 C 语言中的 UINT16。当我尝试将数组转换为 numpy 数组时,python 崩溃了。我可以将其作为包装函数的返回:

def Grab(nframes):

Grab= 2112 * 2088 * 8 (size of frame width * height * pixelDepth)
Grab= lib.MyFunction
Grab.argtypes = [c_uint32]
Grab.restype = POINTER(c_uint16 * array_length)
r = Grab(nframes)
return r

调用该函数如下所示:

Data = Grab(1)
print Data

这会返回:

<__main__.LP_c_ushort_Array_4409856 object at 0x000000000436FE48>

最佳答案

假设您有一个 c_ubyte 数组 img_buffer,它有一个 宽度高度,因为它是一个图像。我假设您已经拥有了它,因为它看起来就像您在代码中所做的那样。

c_ubyte 数组的转换应如下所示:

img_buffer = (c_ubyte * (height * bytes_per_pixel) *
(width * bytes_per_pixel)).from_address(addressof(data.contents))

您可以使用 numpy 将其转换为 ndarray:

import numpy as np

img = np.ndarray(buffer=img_buffer, dtype=np.uint16, shape=(width, height, 1))

获得 ndarray 后,您可以使用 PIL 或 matplotlib 或 OpenCV 来显示它。

编辑:看到您的图像是 16 位,所以我更改了数据类型。

关于python - 通过 ctypes 将 C 数组传递给 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26002815/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com