Kinect-SDK: richten Sie Tiefe und Farbe Rahmen

Arbeite ich mit dem Kinect-sensor und ich bin versucht zu richten an Farbe und Tiefe frames, so dass ich Sie retten kann, als Bilder, die "fit" in jeder anderen. Ich habe viel Zeit damit verbracht, gehen durch die msdn-Foren und bescheidene Dokumentation des Kinect SDK und ich bin immer absolut nirgendwo.

Basiert auf diese Antwort: Kinect: die Umwandlung von RGB-Koordinaten Tiefe-Koordinaten

Habe ich die folgende Funktion, wo depthData und colorData sind, die aus NUI_LOCKED_RECT.pBits und mappedData ist die Ausgabe, die neue Farbe-Rahmen, abgebildet in der Tiefe, Koordinaten:

bool mapColorFrameToDepthFrame(unsigned char *depthData, unsigned char* colorData, unsigned char* mappedData)
{
    INuiCoordinateMapper* coordMapper;

    //Get coordinate mapper
    m_pSensor->NuiGetCoordinateMapper(&coordMapper);

    NUI_DEPTH_IMAGE_POINT* depthPoints = new NUI_DEPTH_IMAGE_POINT[640 * 480];

    HRESULT result = coordMapper->MapColorFrameToDepthFrame(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, NUI_IMAGE_RESOLUTION_640x480, 640 * 480, reinterpret_cast<NUI_DEPTH_IMAGE_PIXEL*>(depthData), 640 * 480, depthPoints);
    if (FAILED(result))
    {
        return false;
    }    

    int pos = 0;
    int* colorRun = reinterpret_cast<int*>(colorData);
    int* mappedRun = reinterpret_cast<int*>(mappedData);

    //For each pixel of new color frame
    for (int i = 0; i < 640 * 480; ++i)
    {
        //Find the corresponding pixel in original color frame from depthPoints
        pos = (depthPoints[i].y * 640) + depthPoints[i].x;

        //Set pixel value if it's within frame boundaries
        if (pos < 640 * 480)
        {
            mappedRun[i] = colorRun[pos];
        }
    }

    return true;
}

Alle bekomme ich bei Ausführung dieses Codes wird eine unveränderte Farbe Rahmen mit entfernt (weiß) alle Pixel, wo depthFrame hatten keine Informationen.

  • Haben Sie überprüft, aus der Green-Screen-Beispiel in der Kinect für Windows-Codierung Beispiele? kinectforwindows.codeplex.com. Es bringt Farbe und Tiefe.
  • Ja das habe ich. Es wird nicht in der neuen INuiCoordinateMapper, aber eine ältere Methode INuiSensor::NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution. Ich habe es ausprobiert und es funktioniert nicht für mich (ich bekomme weißes Bild). Irgendwie ist das array Tiefe Werte, die Sie bekommen, USHORT (16 bit) und meiner ist 32-bit, mit der mögliche Grund dafür ist, dass ich initialisieren meinen Kinect sensor mit verschiedenen Parametern (Tiefe nur keine Spieler-index). Auch wenn ich erstellen Sie ein array von 16 bit-Tiefe Werte aus der 32-bit-des-Funktion funktioniert nicht für mich.
  • ähnliches wurde hier gelöst: stackoverflow.com/a/19905805/2521214 Kinect-SDK enthält Funktionen für allign die Bilder, aber Sie hat nicht für mich gearbeitet haben (eine sehr alte version von kinect), also ich habe mich ... in diesem link ist mein kinect-calibration-Daten für Ihre Sie haben, um es Messen sich
  • Es ist nicht das gleiche, da es den Blick genommen werden, die von der gleichen Kamera. Zuordnung RGB zu Tiefe nicht genau, wie die Bilder stammen aus verschiedenen Sichtweisen und kann somit auch nicht das gleiche sehen (stellen Sie sich ein Blatt Papier findet zwischen den Kameras - jede Kamera wird sehen, auf der anderen Seite des Papiers und werden nicht ausrichten die andere Ansicht, egal was). Dieses Problem ist für die Objekte "weit Weg von den Kameras" Kamera-Kalibrierung und reprojection, nicht so ein einfaches problem (aber Spaß, zu lösen). Ich würde empfehlen, mit einer Funktion aus einer SDK (siehe Beiträge unten).
  • Haben Sie eine gute Antwort dafür?
  • hast du Quelle jedes funktionierende Lösung? vielleicht ein paar Hinweise?

InformationsquelleAutor jaho | 2013-04-10
Schreibe einen Kommentar