opencv — передача данных из Unity3D в C ++ dll и наоборот

В настоящее время я работаю над своей диссертацией (MSc Computer Science), которая представляет собой проект дополненной реальности, использующий OpenCV C ++, интегрированный с Unity3D (для части рендеринга). Чтобы интегрировать OpenCV с Unity3D, я экспортировал код OpenCV (c ++) как dll, а затем импортирую эту dll в Unity3D для доступа к методам dll и т. Д. Кроме того, университет дал мне немного денег, чтобы купить OpenCV для Unity (это реализован в C # с использованием OpenCV для Java), и я использую его также в Unity3D. Проблема в том, что он не поддерживает SURF Feature Extractor, и поэтому я не реализую свой код C ++ напрямую в C # с использованием этого ресурса.

Поэтому я хочу передать кадр (Mat) из Unity3D (C #) в dll C ++, затем выполнить некоторые вычисления и после этого вернуть некоторые объекты Mat, например матрицу вращения, вектор перевода и позу камеры. Самое главное, что я не знаю, как передать кадр Mat из Unity3D в dll C ++.

Может кто-нибудь объяснить мне, как этого добиться, а также вы можете опубликовать пример кода?

РЕДАКТИРОВАТЬ: Актив Unity3D, который я использую, можно найти здесь: OpenCV для Unity3D

3

Решение

Я только что нашел решение (ооооооооооооо) 🙂

Прежде всего мне нужно было преобразовать мой C # Mat (frame) в массив байтов. Затем я создал указатель, чтобы указать на массив байтов адреса (который является данными изображения). После этого я вызвал метод C ++ dll и передал указатель в качестве аргумента (а также ширину и высоту изображения). Наконец, в C ++ dll я реконструировал C ++ Mat, используя массив байтов из C #.

Код в Unity3D (C #):

        //frame is the C# Mat and byte_array our array of byes

//to initialize the size of our byte array (image pixels * channels)
byte_array= new byte[frame.cols () * frame.rows () * frame.channels ()];
//copy the frame data to our array
Utils.copyFromMat (frame,byte_array);
//initialize a pointer with the apropriate size (array size)
IntPtr pointer = Marshal.AllocHGlobal(byte_array.Length);
Marshal.Copy (byte_array, 0, pointer , byte_array.Length);
//here i call the C++ method (I imported a C++ dll)
myCplusplusMethod(pointer ,frame.height(),frame.width());
//free the pointer
Marshal.FreeHGlobal(pointer );

Теперь, чтобы восстановить изображение в C ++, используя переданные данные из C #:

void myCplusplusMethod(unsigned char* data,int height,int width){
//btw you have to get the correct type. In my situation I use debug from C# and I found out that my image is CV_8UC3 type.
Mat constructed= Mat(height, width, CV_8UC3, data);
//..do whatever using the image.. (calculations , etc)..
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector