티스토리 뷰

지난 시간에는 DepthStream을 이용해서 다양한 테스트를 해봤는데 혹시 아시나요? SpecialValue를 잘 활용하면 손가락트래킹도 가능하다는 걸 말입니다. 아마 키넥트 개발을 하시는 분 대부분이 SDK에서는 정밀한 처리가 불가능하기 때문에 OpenNI로 개발하실 겁니다. 

이를 SDK에서 해결하기 위해서는 다양한 방식이 나오고 있는데 그중 한 방법을 소개하고자 합니다.

 진행방식은 바로 지난 포스팅에서 했던 DepthCam과 거의 동일합니다. 다만 ClosestByte라는 변수가 등장하게됩니다.
언급은 지난번에 했었지만 DepthValue중에 특별히 지정된 값들이 있습니다. TooFarDepth나 TooNearDepth,UnknownDepth같은 값들 말입니다. 이런 값을 표현하다 보면 경계가 분명 존재할겁니다. 그중에서 TooNearDepth와 인식범위 간의 오차도 존재할 것이고요. 사람이 Depth로 처리될 때 보면 분명 그 경계를 지난 포인트가 있을 것이고 그걸 손가락별로 따지면 이게 곧 손가락 트래킹이 되는 것이지요.

우선 Kinect 레퍼런스를 삽입하고 Using 지시자를 통해서 포함시켜줍니다. 그 후에 지난 번처럼 변수들을 선언하고 초기화하는 과정이 필요하겠지요.


LoadContent 부분도 역시 지난번과 동일하게 nui를 활성화 시키는 코드를 작성합니다.


 Draw도 역시 마찬가지로 해줍니다. 그냥 도화지에 이미지를 그린다는 식으로 보시면 되겠지요.
 


이제 처리해야 될 부분은 미리 만들어두었던 DepthFrameReady 이벤트입니다. 물론 이것도 Copy하는 과정까지는 똑같습니다.
 


참 앞에서 변수 지정했던 DepthByte도 쓸 수 있겠끔 처리해주는게 좋겠지요.
 


이제 여기서 앞에서 언급했던 ClosestByte가 등장합니다. 여기에 덧붙여서 거리에 대한 정보를 다음과 같이 처리해줍니다.




3bit을 시프트하는 것과 5bit을 시프트하는 내용은 XNA를 통한 DepthStream 구현시 설명했었기에 넘어갑니다.

(시프트순서는 유념하시길 바라겠습니다.)우선 각 영역의 경계에 대한 정보, 즉 TooFarDepth와 TooNearDepth 같은 특정Value가 존재하는 거리에서는 그냥 까맣게 표현되게 합니다. 그리고 어차피 DepthByte를 Color로 표현해야 하기에 이에 대한 값을 5bit shift하면서 저장했습니다. 물론 이렇게 받은 값중에 ClosestByte의 값과 비교해서 그 보다 작으면 그 작은 값으로 ClosestByte 값이 설정되는 겁니다. 
결론적으로 말하자면 closestByte 값은 초기 255에서 시작해서 이렇게 거리를 측정하는 이미지를 볼 때 가장 최소의 값으로 계속 Mapping이 되겠지요. 즉 이 점이 키넥트와 사람간의 가장 가까운 거리가 될겁니다. 
 
여기에 색을 입히는 코드야 지난번과 동일합니다. 다만 그 가장 가까운 거리를 표시하는 조건문을 삽입해주면 되겠지요. 이부분은 파란색으로 표현해보겠습니다. 


만약 그 가까운 포인트를 다른색으로 표현하고 싶다 하시는 분이라면 같을때의 Bitmap의 색상을 조절하시면 됩니다.

마지막으로 Texture를 만들고 지금까지의 Bitmap Data를 넣어줘야 되겠지요.

--------------------------
Update : 2014.08.21
중간 조건문에  DepthData를 closestByte로 비교하는 구문이 있는데 이 부분은 사실 if (DepthByte[i] == closestByte) 로 고쳐져야 정상적으로 가장 가까운 점을 찾을 수 있습니다. 참고하시기 바랍니다.


완성입니다. 결과물은 다음과 같습니다.


손가락도 인식하는 거 보이시나요? 이제 여기에 원하나만 입히면 손가락도 트래킹할 수 있는 겁니다. 이 부분은 다음포스팅에서 언급해보도록 하겠습니다.

댓글