我们有一个预先发布的大型C/C++图像库,具有预处理图像类型。我们希望它与Python接口。例如,我们知道如何使用SWIG做大多数事情,但是我们希望我们的界面使用NumPy而不是一个自制的结构类型来存储我们的图像。在
有人举个例子吗?web上有一些例子可以将NumPy与裸指针连接起来。我们如何将NumPy接口到现有的C类型结构,如下面所示:
typedef struct xvimage {
int nx, ny, nz, nt ; // dimensions
enum {PIX_UINT8, PIX_INT16, PIX_UINT16, PIX_INT32, PIX_FLOAT, PIX_DOUBLE} ; // type
void *data;
} xvimage;
基本上有三种方法:
从一个数组拷贝到一个数组,反之亦然。当给定C/C++图像时,创建一个NUMPY数组并复制数据,当给定一个NUMPY数组时,创建C/C++图像并复制数据。
NumPy数组作为C数据指针的包装器。使用给定的数据指针创建一个NumPy数组。确保你的C/C++图像保存数据指针的寿命比NUMPY数组更长。NumPy数组的生存期可能更短,因为在这种情况下,它不会尝试删除数据。
这些都可以在SWIG类型映射中实现。在
在任何情况下,您都需要将类型转换为NumPy类型(NPY\u UINT8,…)并将图像维度存储在
npy_intp *
中。在要创建NumPy数组,请使用}(Array API)并指定所需的标志,如Fortran样式的continuous或任何对您方便的标志。您可以使用
PyArray_New
或PyArray_SimpleNew
或{PyArray_New
和PyArray_SimpleNewFromData
提供自己的数据指针。在返回值是一个}(Array API)提取,它返回一个
PyObject*
,它可以安全地转换为PyArrayObject*
(或在前面执行PyArray_Check
),数据指针由{void *
,然后可以将其转换为所需的类型。然后,您可以根据需要执行复制或就地修改。在要添加对Python对象的引用,请使用
Py_INCREF
和Py_DECREF
(doc),以防NumPy数组过早被删除。在如果您希望在Python对象即将被垃圾回收时得到通知,请使用通过
PyWeakref_NewRef
(doc)的弱引用。在相关问题 更多 >
编程相关推荐