我想编写一个利用https://github.com/pjreddie/darknet附带的darknet.py文件的python脚本。
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)
现在我需要从opencv给我的numpy数组(在uint8中)转换为darknet可以使用的Image对象。
这是我尝试过的:
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>
,但我想我不能只分配一个另一个?