티스토리 뷰

지난 포스팅에선 XNA에서 ColorStream을 뽑는 예제에 대해서 다뤄봤었는데 이번에는 당연히 DepthStream을 뽑는 작업을 해봐야 하겠지요.

 이번에도 역시 Xna Game Studio Windows Game으로 프로젝트를 하나 생성합니다. 이름은 KinectDepthCam으로 해볼까요? 역시 기본적인 코드의 구조는 거의 동일합니다. 다만 지난번에 ColorStream을 뽑는 부분이 이제는 DepthStream으로 바뀌어야 하겠지요?

맨처음 Kinect Reference를 추가하고 using 지시자로 포함시켜줍니다.
 당연히 KinectSensor 변수를 초기화시켜주는 과정이 초반에 필요하고 LoadContent 부분에서 활성화시키는 것이 필요합니다. 일단 말하자면 기타 Initialize 메서드,Draw 메서드에서 했던 내용은 생략하고자 합니다. 바로 앞 포스팅과 똑같이 하면 됩니다. 변수 설정도 그대로 하면 되고요. 이름만 조금 바꿔주도록 할까요?





이제 DepthFrameReady에 대한 이벤트를 처리해줘야하겠지요. 지난 시간에 언급한 것처럼 GarbageCollection 처리를 해주기 위해서 using 지시자로 Frame 정보를 받아옵니다. 그리고 그전에 DepthData를 초기화시키는 과정이 필요합니다. 물론 ColorData와 다르게 short형 배열로 선언해줘야 하겠지요.
 


이제 DepthFrame을 뿌릴 준비는 했으니까 Depth에 따른 정보를 걸러낼 조건을 만들어내야 합니다. 그전에 지난번에도 DepthData가 넘어오는 과정에 대해서 언급했으나 여기서 잠깐만 다시 언급하고자 합니다.


 기억나시는 분도 나시겠지만 하위 3bit에 대해서는 player index라는 정보로 미리 예약 되어 있습니다. 그래서 우리가 쓸려고 하는 정보는 이런 DepthData를 3bit씩 shift해서 사용해야 합니다. 그래서 어느 순간에는 이런 코드가 들어가야 하겠지요.

int depth = depthData[i] >>3;

그렇게 받은 depth 변수는 이렇게 남아있게 됩니다.

 
그리고 더 알아야 할 정보가 있습니다. 이렇게 사용하는 정보는 13bit인데 Color정보는 8bit입니다. 그래서 depth값을 color로 표현하기 위해서는 또 5bit shift를 해주는 게 필요합니다.

그리고 한가지더! 사용자가 물론 depth정보를 개별적으로 설정하고 지정할 수 있습니다. 그런데 어느 당연한 범위에 대해서는 DepthValue가 정해져 있습니다. 라이브러리 내에서는 UnknownDepth,TooFarDepth,TooNearDepth 로 정의되어 있습니다.

위와 같이 새롭게 안 정보를 지난번 Color에 대입하고 적용시켜서 DepthFrameReady를 마무리합니다.

 


자 결과를 한번 보겠습니다. 
 



ColorStream을 잘 뽑아올 수만 있고 각각의 정보를 잘 설정할 줄만 안다면 그다지 어려움이 없지 않을까 생각합니다.
확실히 XNA에서는 이벤트를 처리하고 컨트롤에 대해서 설정하는게 조금 어렵기 때문에 WPF에서 다뤘던 것보다 조금 난해할 수도 있겠지만 이것도 익숙해지면 괜찮아질거라고 봅니다. 특히 게임에 특화되어 있기 때문에 뭔가 다른 애니메이션과 연동해서 쓰는 걸 원한다면 XNA를 통한 활용이 더 유용하게 쓰일 것 같습니다. 

댓글