본문 바로가기

Out of Mind/Kinect

Depth 영상 값의 추정.

또 갑자기 Skeleton이 아니라..

왜 갑자기 Depth가 나오는지 참 의아하지만..

잠시 짚고 넘어가야 할 문제가 생겼다.

그건 예제의 차이일까 하는 수준인데,

작년에 OpenNI로 Depth 맵을 가져온 거랑 Kinect SDK for Window(이하 Kinect SDK) 의 Depth가

다르다는 생각이 들었고,

이번엔 Kinect SDK로 작업을 하다보니 수치가 이상하단 생각이 들길래..

Sample과 비교해보기 시작했다.

뭐 어차피 값을 가져오는 부분은 같은데 다른 부분이 뭔가 하니.

unsigned short -> unsigned char 로 변환하는 부분이 다른 것이 느껴졌다.

예전 OpenNI의 sample에서는 취득 되는 값이 1mm당 1로 환산이 되었던걸 기억하고,

그리고 뭐냐.. 자체적으로 Max_Depth를 선정하여 그 값을 기준으로 PDF, CDF 를 해서 2D Texture로 가져왔다.

이번 Kinect SDK 는 16bit를 다양하게 쓰는 듯하다.

일단 변환하는 코드의 일부를 보자.

RGBQUAD CSkeletalViewerApp::Nui_ShortToQuad_Depth( USHORT s )
{
    USHORT RealDepth = NuiDepthPixelToDepth(s);
    USHORT Player    = NuiDepthPixelToPlayerIndex(s);

    // transform 13-bit depth information into an 8-bit intensity appropriate
    // for display (we disregard information in most significant bit)
    BYTE intensity = (BYTE)~(RealDepth >> 4);

    // tint the intensity by dividing by per-player values
    RGBQUAD color;
    color.rgbRed   = intensity >> g_IntensityShiftByPlayerR[Player];
    color.rgbGreen = intensity >> g_IntensityShiftByPlayerG[Player];
    color.rgbBlue  = intensity >> g_IntensityShiftByPlayerB[Player];

    return color;
}  

값이 리턴 되는건 관심이 없고 위의 두개의 일에 집중해보도록 했다.


USHORT RealDepth = NuiDepthPixelToDepth(s);
RealDepth 를 구한다고 한다. 으음??
뒤에 함수가 있는데 다른게 아니고 s>>3 이다.
뒤에 3bit를 버린다는 의미다. 

USHORT Player    = NuiDepthPixelToPlayerIndex(s);
이건 또 뭔가하니 Player를 정한다는 거다.
뭐 하나 보니 s & 7 이다.
뒤에 3bit만을 계산한다는 의미다. 

말로 모른겠다면 그림으로 보자.

먼저 Real Depth  값이다.


그 다음 player 값이다


결국에는 Depth 값을 표현하기엔 13bit 가 필요하고, player index를 위해 3bit를 쓰게 되어있다.

그리고  BYTE intensity = (BYTE)~(RealDepth >> 4);  13bit를 8bit로 계산해주기 위해 뒤에 4개의 bit를 버려준다.

왜냐하면..


일단 기존꺼 이기 때문에 NearMode는 지원하지 않는다.

그럼 측정범위기 0.8m ~ 4m 까지 밖에 되지 않는다. 값은 중요치 않으나~

0~255 Level로 나눠주기 위한 작업니다.

결국엔 2^13의 표현이 가능하다 2^13 = 8192

하지만 8bit Level로 줄이기도 하고 너무 멀다라고 생각하기 때문에 맨 앞의 bit 값은 있으나 마나한 경우다.

따라서 


이렇게 구분이 된다.

이때까지 딴 짓을 너무 많이 해서인지 간과한 부분이 아닐 수 없는 것들이다.

뭐 나머지 밑에 RGBQUAD 같은 경우는 player index 별로 색을 맞춰주기 위한 작업이다.

아직 확인은 해보지 못했지만 사람이 아니다 싶으면 0 으로 R,G,B에 각각 그 값대로 들어가고~

나머지는 영향을 받게 된다.

6명까지라고 알고는 있는데 0~7까지 총 8가지로 색이 나오게끔 되어 있다.

확인은 나중에 되면 포스팅 하려한다.

그럼 오늘도 Depth의 세계로 빠져 본다.