Я пытаюсь передать образы из памяти в 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 ++, но я думаю, что в моем случае должно быть более простое решение.
Ну, мне удалось сделать это следующим образом:
Вот как вы можете конвертировать массив 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))
Других решений пока нет …