tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
594
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von kuhlmaehn
    kuhlmaehn kuhlmaehn ist offline Mitglied Platin
    Registriert seit
    May 2003
    Beiträge
    634
    Hi,
    ich spiele gerade etwas mit dem CL NUI Treiber für Kinect rum und komme dort jetzt seit zwei Tagen nicht weiter.
    Es geht mir speziell um einen dll-Aufruf, den ich nicht verarbeitet bekomme.
    Der Import in C sieht wie folgt aus:
    Code :
    1
    
    IMPORT(bool) GetNUICameraDepthFrameRAW(CLNUICamera cam, PUSHORT pData, int waitTimeout = 2000);
    In C# dagegen so:
    Code :
    1
    2
    
    [DllImport("CLNUIDevice.dll", EntryPoint = "GetNUICameraDepthFrameRAW", CallingConvention = CallingConvention.Cdecl)]
    public static extern bool GetCameraDepthFrameRAW(IntPtr camera, IntPtr data, int timeout);
    Mit Angabe von camera und timeout werden die Daten dann also in den IntPtr data geladen.
    Da die Auflösung 640x480 ist, habe ich mir nun zunächst einen IntPtr erzeugt und ihm Speicherplatz zugewiesen:
    Code :
    1
    
    IntPtr pout = Marshal.AllocHGlobal(640 * 480 * sizeof(uint));
    Ohne das allozieren habe ich zwar keinen Fehler bekommen, allerdings enthielt pout dann auch keinen Pointer. Jetzt müsste ich doch, angefangen bei der Adresse von pout, 640 * 480 * sizeof(uint) viele Pointer haben, die ich nun alle dereferenzieren könnte, um an die Daten zu kommen. Hier bin ich allerdings nicht weitergekommen
    Gibt es denn vielleicht in C# einen besseren Weg um an die Ausgabe einer dll zu gelangen?
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von kuhlmaehn Beitrag anzeigen
    In C# dagegen so:
    Code :
    1
    2
    
    [DllImport("CLNUIDevice.dll", EntryPoint = "GetNUICameraDepthFrameRAW", CallingConvention = CallingConvention.Cdecl)]
    public static extern bool GetCameraDepthFrameRAW(IntPtr camera, IntPtr data, int timeout);
    Mit Angabe von camera und timeout werden die Daten dann also in den IntPtr data geladen.
    Da die Auflösung 640x480 ist, habe ich mir nun zunächst einen IntPtr erzeugt und ihm Speicherplatz zugewiesen:
    Code :
    1
    
    IntPtr pout = Marshal.AllocHGlobal(640 * 480 * sizeof(uint));
    Ohne das allozieren habe ich zwar keinen Fehler bekommen, allerdings enthielt pout dann auch keinen Pointer. Jetzt müsste ich doch, angefangen bei der Adresse von pout, 640 * 480 * sizeof(uint) viele Pointer haben, die ich nun alle dereferenzieren könnte
    Warum sollten da Zeiger drin sein? Soweit ich verstehe sind da Pixel drin die du untersuchen kannst. Warum verwendest du denn uint statt ushort?
    Zitat Zitat von kuhlmaehn Beitrag anzeigen
    Gibt es denn vielleicht in C# einen besseren Weg um an die Ausgabe einer dll zu gelangen?
    Wenn die Größe des Arrays immer gleich ist, kannst du auch direkt ein Array übergeben:
    Code csharp:
    1
    2
    3
    
    [DllImport("CLNUIDevice.dll", EntryPoint = "GetNUICameraDepthFrameRAW", CallingConvention = CallingConvention.Cdecl)]
    public static extern bool GetCameraDepthFrameRAW(IntPtr camera, 
     [MarshalAs(UnmanagedType.LPArray, SizeConst=640*480)] ushort[] data, int timeout);
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Avatar von kuhlmaehn
    kuhlmaehn kuhlmaehn ist offline Mitglied Platin
    Registriert seit
    May 2003
    Beiträge
    634
    Hey super, dank dir. Das ist natürlich sehr elegant
    Das uint hatte ich fälschlicher Weise von DepthFrameRGB32 genommen, weil dort PDWORD steht. Außerdem hatte ich das "StartCamera()" zu dicht vor dem Aufruf, sodass dann mit einem timeout von 0 offenbar zu wenig Zeit für eine Ausgabe vergangen war.
    Ich hab jetzt versucht, dass ColorFrameRGB32 analog umzusetzten, allerdings bekomme ich hier nur wieder nullen als Ausgabe.
    Hier sind mal die weiteren imports:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    // Camera video frame image data retrieval
    IMPORT(bool) GetNUICameraColorFrameRAW(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
    IMPORT(bool) GetNUICameraColorFrameRGB24(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
    IMPORT(bool) GetNUICameraColorFrameRGB32(CLNUICamera cam, PDWORD pData, int waitTimeout = 2000);
     
    // Camera depth frame image data retrieval
    IMPORT(bool) GetNUICameraDepthFrameRAW(CLNUICamera cam, PUSHORT pData, int waitTimeout = 2000);
    IMPORT(bool) GetNUICameraDepthFrameCorrected12(CLNUICamera cam, PUSHORT pData, int waitTimeout = 2000);
    IMPORT(bool) GetNUICameraDepthFrameCorrected8(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
    IMPORT(bool) GetNUICameraDepthFrameRGB32(CLNUICamera cam, PDWORD pData, int waitTimeout = 2000);
    Lieg ich denn bei GetCameraColorFrameRGB32 mit einem uint[] bzw. UInt32[] richtig? Das hat beides nicht funktioniert.
    Irgendwo hatte ich allerdings gelesen, dass UInt32 dem DWORD entspricht.
    Danke!
     

Ähnliche Themen

  1. verarbeiten von XML Daten
    Von herr-stromberg im Forum Coders Talk
    Antworten: 1
    Letzter Beitrag: 22.10.07, 21:45
  2. XML-Daten trotz Fehlern verarbeiten
    Von Pendergast im Forum PHP
    Antworten: 2
    Letzter Beitrag: 01.04.06, 11:00
  3. Button-->Daten verarbeiten-->Problem
    Von BIAsTeR im Forum PHP
    Antworten: 1
    Letzter Beitrag: 26.09.05, 16:20
  4. xml daten verarbeiten...
    Von rottenapple im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 1
    Letzter Beitrag: 27.05.04, 23:36
  5. Perl Daten in PHP verarbeiten
    Von noisy im Forum PHP
    Antworten: 4
    Letzter Beitrag: 11.09.03, 13:17