Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.08.2015, 15:20

[C++] Kinect Distanzmessung (OpenGL)

Hallo!

Ich beschäftige mich derzeit mit der Kinect (v1) und hänge gerade bei einer Distanzmessung
die ich gern implementieren will.
Dafür hab ich einen DephtStream erstellt, was auch ohne Probleme funktioniert, sowie auch
einen String, der mir die aktuelle Distanz zum kürzesten Pixel (Objekt) ausgeben soll, was
leider nicht funktioniert :( Erstmal ein wenig Code.

Initialisiert habe ich den Sensor folgendermaßen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DWORD nuiFlags = NUI_INITIALIZE_FLAG_USES_DEPTH;
    hr = context->NuiInitialize(nuiFlags);
    if (FAILED(hr))
    {
        std::cout << "Failed to intialize Kinect: " << std::hex << (long)hr << std::dec << std::endl;
        return false;
    }

    hr = context->NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH,
                                    NUI_IMAGE_RESOLUTION_640x480,
                                    NUI_IMAGE_STREAM_FLAG_ENABLE_NEAR_MODE,
                                    2,
                                    NULL,
                                    &depthStreamHandle);
    if (FAILED(hr))
    {
        std::cout << "Unable to create depth stream: " << std::hex << (long)hr << std::dec << std::endl;
        return false;
    }


In der update-Funktion erstelle ich einen neuen DepthFrame

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void update()
{

    NUI_IMAGE_FRAME depthFrame;
    HRESULT hr = context->NuiImageStreamGetNextFrame(depthStreamHandle, 0, &depthFrame);
    if (SUCCEEDED(hr))
    {
        updateImageFrame(depthFrame, true);

        context->NuiImageStreamReleaseFrame(depthStreamHandle, &depthFrame);
    }
    glutPostRedisplay();
}


Und jetzt kommen wir zu meinem Sorgenkind. Der Funktion updateImageFrame:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
void updateImageFrame(NUI_IMAGE_FRAME& imageFrame, bool isDepthFrame)
{
    INuiFrameTexture *nuiTexture = imageFrame.pFrameTexture;
    NUI_LOCKED_RECT lockedRect;
    nuiTexture->LockRect(0, &lockedRect, NULL, 0);
    if (lockedRect.Pitch != NULL)
    {
        const BYTE *buffer = (const BYTE*)lockedRect.pBits;

        for (int i = 0; i<480; ++i)
        {
            const BYTE *line = buffer + i * lockedRect.Pitch;
            const USHORT *bufferWord = (const USHORT*)line;

            for (int j = 0; j < 640; ++j)
            {
                if (!isDepthFrame)
                {
                    std::cout << "No Depth Stream" << std::endl;
                }
                else
                {
                    unsigned char *ptr = depthTexture->bits + (i * 640 + j);
                    *ptr = (unsigned char)NuiDepthPixelToDepth(bufferWord[j]);

                    std::stringstream ss;
                    ss << "Distanz[mm]: Hier sollte eig die Distanz in mm stehen :/ ";
                    Text = ss.str();
                }
            }
        }
        TextureObject* tobj = (depthTexture);
        glBindTexture(GL_TEXTURE_2D, tobj->id);
        glTexImage2D(GL_TEXTURE_2D, 0, tobj->internalFormat, tobj->width, tobj->height,
            0, tobj->imageFormat, GL_UNSIGNED_BYTE, tobj->bits);
    }
    nuiTexture->UnlockRect(0);
}


Im Grunde funktioniert diese Funktion ja eig ganz gut und macht eig genau das, was sie machen
soll. Nur mit dem String habe ich so meine Probleme. Er wird zwar angezeigt (was in der Render
Funktion passiert) aber die Distanz wird nicht korrekt angezeigt und die Framerate geht EXTREM
in den Keller.
Im Internet konnte ich auch schon diverse Berechnungen finde, aber keine führte zum Erfolg.
Die Daten sollten ja eig in *ptr gespeichert sein, aber da bekomm ich nur komische Werte raus.

Anbei noch ein Screenshot zur Veranschaulichung :)
vl hat ja wer einen Tipp/Idee ^^

lg Epi
»Epiphany99« hat folgendes Bild angehängt:
  • Depht.JPG