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