Получить указатель из массива numpy для отправки изображения на C ++ - PullRequest
0 голосов
/ 26 июня 2018

Я работаю над проектом, в котором мне приходится иметь дело с изображениями между Python и C ++ . Чтобы отправить изображение из C ++ в Python, я посылаю указатель на первый пиксель моего изображения (являющийся объектом Mat из библиотеки OpenCV), а в Python с двумя циклами for я использовал этот указатель для создания 2D массив numpy.

Но мне не удается сделать то же самое другим способом: получить адрес памяти первого пикселя массивного двумерного массива (изображения) и передать его в C ++.

Предположим, что x - это мое изображение (двумерный массив), я попробовал решение, например:

  • x.__array_interface__['data'][0] но это дает целое число, а не адрес
  • x.data, которые дают разные значения каждый раз, когда я вызываю его, потому что он дает мне адрес временного буфера, а не само изображение

Заранее благодарю за любой совет / помощь.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Я нашел «простой» способ сделать это:

В C ++ функция должна принимать в качестве аргумента void * ptr, и таким образом я могу создать объект Matиспользуя указатель, отправленный из Python:

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

И, в Python , используйте __array_interface__, чтобы получить адрес памяти (в типе int, странный):

mydll.myFunction(myNumpyArray.__array_interface__['data'][0], ...)
0 голосов
/ 26 июня 2018

in как получить адрес памяти массива numpy для C также используется __array_interface__, возвращаемое целое число - указатель на сегмент данных массива и без адреса памяти:

данные (необязательно)

2-кортеж, первый аргумент которого является целым числом (длинное целое число)при необходимости) указывает на область данных, в которой хранится содержимое массива.Этот указатель должен указывать на первый элемент данных (другими словами, в этом случае любое смещение всегда игнорируется) .Вторая запись в кортеже - это флаг только для чтения (true означает, что область данных доступна только для чтения).

Этот атрибут также может быть объектом, представляющим интерфейс буфера, который будет использоваться для обмена данными.Если этот ключ отсутствует (или возвращает None), то совместное использование памяти будет осуществляться через интерфейс буфера самого объекта.В этом случае клавиша смещения может использоваться для указания начала буфера.Ссылка на объект, представляющий интерфейс массива, должна быть сохранена новым объектом, если необходимо защитить область памяти.

По умолчанию: Нет

source: 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 / выставление-интерфейс-массива-с-swig-for-a-cc-структурой / :

`

C-struct access

Этот подход к интерфейсу массива обеспечивает более быстрый доступ к массиву с использованием только одногопоиск атрибутов и четко определенная 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;

source: https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.interface.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...