Как ссылаться на данные, хранящиеся в объекте System.Reflection.Pointer .Net в Matlab? - PullRequest
1 голос
/ 08 февраля 2012

Мы обращаемся к объекту .NET из matlab. Это какое-то программное обеспечение для захвата изображений, и мы хотим скопировать данные изображения в Matlab.

У нас есть два варианта получения этих данных. Во-первых, это создать объект изображения, который имеет в своем конструкторе аргумент типа unsigned char *, который, когда вы смотрите здесь на веб-страницу «Ограничения .net»: http://www.mathworks.com/help/techdoc/matlab_external/brpb5k6-1.html#brpb58f-1 кажется, указывает на то, что вы не можете передать указатель на библиотеку .NET таким способом. (Даже если мы можем создать соответствующий указатель, используя функцию libpointer matlab.

Вторая мысль заключается в том, что если мы используем конструктор по умолчанию в этой библиотеке, который под капотом управляет памятью и создает буфер, буфер становится доступным через объект System.Reflection.Pointer. Но как мы можем получить данные из этого указателя и скопировать их в массив matlab?

Не могу понять это. Любые мысли будут оценены. Скорость для этого шага не критична, поэтому медленная работа у нас.

спасибо

Ответы [ 2 ]

0 голосов
/ 20 января 2014

Вам потребуется создать библиотеку-оболочку .NET для приведения неуправляемого массива в управляемый массив, к которому может обращаться Matlab.

Возможно, вы используете C ++ / CLI для создания вашего .NET, который позволяет вам использовать неуправляемый массив, что может быть причиной того, что вы получаете указатель отражения (я думаю, что если вы используете C #, все вашимассивы будут управляться и отображаться из Matlab).

Просто создайте новую библиотеку классов в Visual Studio (ether C # или C ++ / CLI).Затем добавьте свою библиотеку .NET в качестве ссылки.Затем напишите статический метод, который скопирует массив, к которому вы хотите получить доступ, в управляемый массив .NET.Тогда Matlab сможет увидеть его, и вы можете просто преобразовать его в Matlab, используя, например, uint8 (dotNetArray).

Кроме того, вы также можете изменить исходный проект .NET и написать метод, который копируетнеуправляемый массив в управляемый.Предполагая, что originalimgsize - это int, содержащий размер вашего изображения, а originalimg - это unsigned char *, в C ++ / CLI это будет что-то вроде

array<unsigned char> ^img = gcnew array<unsigned char>(originalimgsize); 
for (int i=0; i<originalimgsize; i++) 
    img[i] = originalimg[i];
0 голосов
/ 17 февраля 2012

Это кажется невозможным, основываясь на внеплановых разговорах с математическими работами и другими.

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