我正在做一个项目,我必须处理Python和**C++**之间的图像。为了将图像从C发送到Python,我在图像的第一个像素上发送了一个指针(来自OpenCV
库的Mat
对象),并在Python中使用两个for循环,我使用这个指针创建了一个2D numpy数组。
但是我没有成功地以另一种方式做同样的事情:获取numpy 2D数组(一个图像)的第一个像素的内存地址,并将其传递给C。
假设x是我的图像(2D numpy数组),我尝试了这样的解决方案:
x.__array_interface__['data'][0]
,但这给予一个整数,而不是一个地址x.data
,每次我调用它时,它都会给给予不同的值,因为它给我的是临时缓冲区的地址,而不是图像本身
提前感谢您的任何建议/帮助。
3条答案
按热度按时间mw3dktmi1#
我找到了一个“简单”的方法来做到这一点:
在**C++**中,函数必须接受一个
void * ptr
作为参数,像这样,我可以使用从Python发送的指针创建一个Mat对象:字符串
并且,在Python中,使用
__array_interface__
来获取内存地址(int类型,奇怪):型
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
中定义为:字符串
来源:https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.interface.html
72qzrwbm3#
我知道有两种方法可以做到这一点:
hex(x.ctypes.data)
个请注意,在这两种情况下,
hex
函数用于将十进制内存地址转换为十六进制表示。