从numpy数组中获取指针以将图像发送到C++

sqxo8psd  于 2023-11-18  发布在  其他
关注(0)|答案(3)|浏览(155)

我正在做一个项目,我必须处理Python和**C++**之间的图像。为了将图像从C发送到Python,我在图像的第一个像素上发送了一个指针(来自OpenCV库的Mat对象),并在Python中使用两个for循环,我使用这个指针创建了一个2D numpy数组。
但是我没有成功地以另一种方式做同样的事情:获取numpy 2D数组(一个图像)的第一个像素的内存地址,并将其传递给C

假设x是我的图像(2D numpy数组),我尝试了这样的解决方案:

  • x.__array_interface__['data'][0],但这给予一个整数,而不是一个地址
  • x.data,每次我调用它时,它都会给给予不同的值,因为它给我的是临时缓冲区的地址,而不是图像本身

提前感谢您的任何建议/帮助。

mw3dktmi

mw3dktmi1#

我找到了一个“简单”的方法来做到这一点:
在**C++**中,函数必须接受一个void * ptr作为参数,像这样,我可以使用从Python发送的指针创建一个Mat对象:

void myCfunction(void* ptr){
    Mat matrix = Mat(sizes, CV_8UC1, (uchar*)ptr);
}

字符串
并且,在Python中,使用__array_interface__来获取内存地址(int类型,奇怪):

mydll.myFunction(myNumpyArray.__array_interface__['data'][0], ...)

fxnxkyjh

fxnxkyjh2#

how to get the memory address of a numpy array for C中也使用__array_interface__,返回的整数是指向数组的 data segment 的指针,没有内存地址:

数据(可选)

一个二元组,其第一个参数是一个整数(如果需要的话,是一个长整数),它指向存储数组内容的数据区。这个指针必须指向数据的第一个元素(换句话说,在这种情况下,任何偏移量都被忽略)。元组中的第二个条目是一个只读标志(true意味着数据区是只读的)。
这个属性也可以是一个公开缓冲区接口的对象,缓冲区接口将用于共享数据。(或返回None),那么内存共享将通过对象本身的缓冲区接口完成。在这种情况下,偏移键可用于指示缓冲区的开始。如果内存中没有数组接口,则对暴露数组接口的对象的引用必须由新对象存储。该地区将得到保障。
默认:无
来源:https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.interface.html
你可以看到__array_interface__返回的整个字典的内容,print x.__array_interface__[]
__array_struct__包含一个指向数组第一个元素的C指针,你可以在C(++)代码中访问它,例如http://blog.audio-tk.com/2008/11/04/exposing-an-array-interface-with-swig-for-a-cc-structure/
`

C-struct访问

数组接口的这种方法允许仅使用一个属性查找和定义良好的C结构来更快地访问数组。
__array_struct__
A:c:type:PyCObject,其voidptr成员包含指向已填充PyArrayInterface结构的指针。结构的内存是动态创建的,PyCObject也是用适当的析构函数创建的,因此该属性的检索器只需在完成时将Py_DECREF应用于该属性返回的对象。此外,要么需要复制数据,或者必须保持对暴露此属性的对象的引用,以确保数据不会被释放。暴露__array_struct__接口的对象也不能在其他对象引用它们时重新分配它们的内存。
PyArrayInterface结构在numpy/ndarrayobject.h中定义为:

typedef struct {
  int two;              /* contains the integer 2 -- simple sanity check */
  int nd;               /* number of dimensions */
  char typekind;        /* kind in array --- character code of typestr */
  int itemsize;         /* size of each element */
  int flags;            /* flags indicating how the data should be interpreted */
                        /*   must set ARR_HAS_DESCR bit to validate descr */
  Py_intptr_t *shape;   /* A length-nd array of shape information */
  Py_intptr_t *strides; /* A length-nd array of stride information */
  void *data;          --------> /* A pointer to the first element of the array */ < ------
  PyObject *descr;      /* NULL or data-description (same as descr key
                                of __array_interface__) -- must set ARR_HAS_DESCR
                                flag or this will be ignored. */
} PyArrayInterface;

字符串
来源:https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.interface.html

72qzrwbm

72qzrwbm3#

我知道有两种方法可以做到这一点:

  • 第一个月
  • hex(x.ctypes.data)

请注意,在这两种情况下,hex函数用于将十进制内存地址转换为十六进制表示。

相关问题