Передача структуры из Python в C ++ ИЛИ передача пустого массива вместо адреса файла в Yolo

Я пытаюсь передать образы из памяти в Yolo, а не адреса файлов.

в исходный код он читает изображение, используя openCV. Так как openCV возвращает формат mat в c ++, он преобразует формат mat в формат изображения, используя mat_to_image(mat im) функция.
Но OpenCV в Python использует numpy.ndarray так что я не могу использовать mat_to_image(),

Поэтому я попытался поместить массив numpy в формат изображения, следуя коду авторов Вот у нас есть:

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

Вот что у меня есть:

import darknet as dn

im = cv2.imdecode(in-memory_bytelike_object, cv2.IMREAD_COLOR)
h,w,c = im.shape
my_image = IMAGE()
my_image.w = ctypes.c_int(w)
my_image.h = ctypes.c_int(h)
my_image.c = ctypes.c_int(c)
my_image.data = im.ctypes.data_as(ctypes.POINTER(ctypes.c_float))

print(dn.detect(net, meta, my_image))

Я тоже поменял detect функционировать таким образом:

def detect(net, meta, image, thresh=.5, hier_thresh=.5, nms=.45):
# im = load_image(image, 0, 0)  //image_address->mat (using cv2)-> image (using mat_to_image) and return image
im = image
...

но когда я запускаю его, я получаю эту ошибку:

ArgumentError: argument 2: <class 'TypeError'>: expected IMAGE instance instead of IMAGE

Думаю, проблема в том, что я неправильно передаю структуру данных, но я не уверен.

Я прочитал некоторые другие ответы о передаче структуры данных между Python и C ++, но я думаю, что в моем случае должно быть более простое решение.

0

Решение

Ну, мне удалось сделать это следующим образом:

Вот как вы можете конвертировать массив NumPy в формат изображения:

import darknet as dn
def array_to_image(arr):
arr = arr.transpose(2,0,1)
c = arr.shape[0]
h = arr.shape[1]
w = arr.shape[2]
arr = (arr/255.0).flatten()
data = dn.c_array(dn.c_float, arr)
im = dn.IMAGE(w,h,c,data)
return im

Используйте модифицированную версию detect функция, как указано в вопросе.

так это выглядит так:

im = cv2.imdecode(in-memory_bytelike_object, cv2.IMREAD_COLOR)
im = array_to_image(arr)
dn.rgbgr_image(im)
print(dn.detect(net, meta, im))

получил функцию отсюда

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]