Преобразование массива numpy uint8 в пользовательский объект (из darknet) с использованием ctypes ...? - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу написать скрипт на python, который использует файл darknet.py, который поставляется с https://github.com/pjreddie/darknet.

В файле darknet.py есть объект Image, определенный следующим образом:

class IMAGE(Structure):
    _fields_ = [("w", c_int),
                ("h", c_int),
                ("c", c_int),
                ("data", POINTER(c_float))]

, который он использует в динамической библиотеке:

lib = CDLL("./libdarknet.so", RTLD_GLOBAL)

Я загружаю изображение из opencv примерно так:

import cv2
image = cv2.imread(src)

Теперь мне нужно преобразовать из массива numpy (в uint8's) что opencv дает мне объект Image, который может использовать darknet.

Вот что я попробовал:

import darknet as dn
import ctypes

dnim = dn.IMAGE()
(dnim.h,dnim.w,dnim.c) = image.shape
#dnim.data = (image.astype(np.float64)/255).flatten().ctypes.data_as(ctypes.POINTER(ctypes.c_float))
#dnim.data.content = dn.c_array( ctypes.c_float, image.astype(np.float64)/255 )

Часть image.shape, кажется, работает как положено.Комментируемые строки - это две разные попытки загрузки элемента данных dn.IMAGE ().Первый вызывает ошибку сегментации, а второй вызывает ошибку: TypeError: only size-1 arrays can be converted to Python scalars

Я знаю, что dnim.data (при загрузке с использованием функции load_image ()) и объект, созданный в первой попытке, похожитипы, в частности: <__main__.LP_c_float object at 0xXXXXXXXXXXXX> но я думаю, я не могу просто назначить один другому?

...