#c# #c #data-structures #opencv #emgucv
#c# #c #структуры данных #opencv #emgucv
Вопрос:
Мне нужно получить доступ к свойству ‘data’ EmguCV MCvMat structure. Но это свойство является указателем (IntPtr). Я обнаружил, что структура для этого свойства (данных) является объединением. Это похоже на это:
union Data
{
char* ptr; // Data pointer for an unsigned char matrix
short* s; // Data pointer for a short matrix
int* i; // Data pointer for an integer matrix
float* fl; // Data pointer for a float matrix
double* db; // Data pointer for a double matrix
} Data;
Я попытался создать структуру для этого на C#:
[StructLayout(LayoutKind.Explicit)]
struct MCvMatData
{
[FieldOffset(0)]
public char[] ptr; // Data pointer for an unsigned char matrix
[FieldOffset(0)]
public short[] s; // Data pointer for a short matrix
[FieldOffset(0)]
public int[] i; // Data pointer for an integer matrix
[FieldOffset(0)]
public float[] fl; // Data pointer for a float matrix
[FieldOffset(0)]
public double[] db; // Data pointer for a double matrix
}
А затем преобразуйте ее с помощью Marshel,
MCvMat mat = (MCvMat)Marshal.PtrToStructure(pMat, typeof(MCvMat));
MCvMatData matdata = (MCvMatData)Marshal.PtrToStructure(mat.data, typeof(MCvMatData));
Но это дает мне исключение. Что мне нужно сделать, это:
- Создайте структуру данных в C # для доступа к этому указателю или
- Любой другой способ доступа к свойству MCvMat.data
Ответ №1:
Я опубликовал решение Visual Studio 2010 на SkyDrive. Это указывает на отмену маршалинга такой структуры.
Я попробую использовать атрибут MarshalAs, когда у меня будет больше времени. Обычно в таких ситуациях я бы реализовал уровень адаптера на C , чтобы упростить передачу данных между неуправляемым и управляемым кодом.
Комментарии:
1. Большое спасибо за быстрый ответ, Дэн. Я перепробовал все возможные способы создания структуры, но это не сработало. Если вы можете предложить что-нибудь для этого, это будет большим подспорьем для меня. Еще раз спасибо за ответ.
2. Напишите последовательность псевдокода, а затем я помогу вам реализовать ее на C #.
3. У меня нет псевдокода для этих структур, потому что я использую библиотеку для доступа к ним. Но я смог найти коды. Это структура для CvMat. Ссылка . Мне нужно получить доступ к объединению данных там. Теперь у меня есть указатель (IntPtr) на этот объект CvMat. Я смог отменить маркировку этого указателя на структуру MCvMat (которая является C # версией CvMat). Но на свойство data в этой структуре MCvMat также есть указатель (IntPtr). Теперь мне нужно отменить сопоставление этого указателя данных с объектом, чтобы я мог получить доступ к значениям там. Надеюсь, этой информации достаточно. Большое спасибо.
4. Большое спасибо, Дэн .. 🙂 Смог решить это на вашем замечательном примере.. Большое вам спасибо…
5. У меня точно такая же проблема, можете ли вы помочь мне с этим @Sach? , Я попробовал код, интересно, как выглядит ваш код