또 갑자기 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를 다양하게 쓰는 듯하다.
일단 변환하는 코드의 일부를 보자.
값이 리턴 되는건 관심이 없고 위의 두개의 일에 집중해보도록 했다.
말로 모른겠다면 그림으로 보자.
먼저 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의 세계로 빠져 본다.
왜 갑자기 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의 세계로 빠져 본다.
'Out of Mind > Kinect' 카테고리의 다른 글
[게시판 미사용] 더 이상 업데이트 되지 않습니다. (0) | 2013.11.04 |
---|---|
급 발표를 준비하다가.. (0) | 2012.02.08 |
v1.0 Beta2 -> v1.0 바뀐부분 정리 (0) | 2012.02.02 |
3. RGB + Depth 영상 띄우기 (6) | 2012.02.02 |
2. Kinect Install (0) | 2012.02.02 |