2012-04-29 2 views
0

Я работаю с EmguCV, и я не знаю, как я могу передать массив 2xN, Nx2, 3xN, Nx3 или 1xN (N - количество точек) для точек изображения, таких как документально зарегистрированный here.Как преобразовать List of PointF в IntPtr?

У меня есть метод создания массива float [N, 2], но Marshal.Copy не имеет перегрузок для многомерных массивов, и я не знаю, как я могу передавать значения X и Y как один.

ответ

4

Вы просто вызываете функцию cvCreateMat для создания этих матриц. documentation of the native interface содержит хорошие примеры, которые показывают, как это сделать.

Для того чтобы установить данные, Вы можете использовать cvSet2D. Это не так эффективно, как прямой доступ к указателям, но этого сложнее добиться из управляемого кода.

+0

Большое спасибо. Еще один быстрый вопрос: как мне обновить MCvScalar? Его конструкторы имеют только удвоения. –

+0

Это еще один вопрос. Прямо сейчас я не знаю ответа. Я предполагаю, что вы просто должны использовать двойной и где-то по пути что-то преобразуется в выбранный вами скалярный тип. –

0

Попробуйте это:

float[,] floats = new float[2,3]; 
IntPtr intPtr = Marshal.UnsafeAddrOfPinnedArrayElement(floats, 0); 

Следующий метод может работать, но будет иметь возможные проблемы с GC, так тщательно использовать:

float[,] floats = new float[3, 2]; 

fixed (void* pt = array) 
{ 
    IntPtr intPtr = new IntPtr(pt); 

    CallMethod(intPtr, other parameters...); 
} 

Но вызываемый метод должен каким-то образом знает, что размеры находятся. Возможно, по имени (DoSomething2x3, DoSomething3x2 и т. Д.) Или по параметрам (DoSomething (IntPtr ptr, int width, int height))

+1

Я как-то сомневаюсь, что это будет работать все время, если вообще. – leppie

+0

Вы правы. Я об этом не думал. Просмотрите после редактирования для получения дополнительной информации. – SimpleVar

+0

Неважно, сколько вы отредактируете это, это всегда будет неправильно. Вам нужно создать правильную структуру данных для openCV. Вы не можете придумать свою собственную структуру данных. –

Смежные вопросы