У меня есть функция C, которая управляет камерой, я пытаюсь отправить буфер изображения на Python через Ctypes, который будет использоваться в графическом интерфейсе.Pass C массив на python через ctypes
Я могу захватить буфер, но я застрял в основном, как заставить это работать, я полагаю, я мог бы смотреть в numpy-c api, но это выглядит очень запутанным.
До сих пор я попытался следующее:
Создайте массив С (я предполагаю, что это является ссылкой указатель), что-то вроде:
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++)
{
...
}
}
UPDATE:
Оказывается, мне нужно присвоить указатель на мой массив, но это UInt16 в C. Когда Я пытаюсь получить массив в массив 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>
Вы освободили массив, прежде чем возвращать его? Не могли бы вы получить недействительный адрес в этот момент? – Santa
Действительно, это была типичная ошибка на этом посту, хороший улов. Но у меня нет этой проблемы в фактическом коде. Благодаря! – user2221667
Что не работает? Какая ошибка вы получаете? Что вы пытаетесь сделать, что не знаете, как это сделать? Преобразование в массив c_ubyte выглядит корректно для меня. Из вопроса здесь неясно, в чем проблема, которая у вас есть. –