Создайте структуру C # для CvMat.data union или любой способ доступа к ней на C#

#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? , Я попробовал код, интересно, как выглядит ваш код