티스토리 뷰

Kinect

[Kinect 프로젝트] depthStream 뽑아내기.

생각많은 소심남 2012. 2. 22. 12:25
지난 포스팅까지 ColorStream을 통해서 이미지를 뽑아오는 작업을 했습니다.

하지만 ColorStream을 뽑아오는 것 자체로는 Player를 인식할 수 없습니다. 우리 눈으로 들어오다시피 2D로 들어오기 때문이지요. 그래서 필요한게 바로 이 depthStream입니다. 물체와 센서간의 거리를 측정할 수 있기 때문에 이를 바탕으로 Player를 인지할 수도 있는 거지요. 만약 ColorStream에 이 Depthstream을 필터형식으로 입힐수만 있다면 컬러에서도 사용자만 인식하는게 가능하겠지요?

우선 예제로 들어가겠습니다. 프로젝트를 생성하고 필요한 참조파일을 삽입합니다. 이번에도 삽입해야할 요소는 Image입니다.  

 
역시 xaml상에도 image1이란 항목으로 생겼습니다.

사실 DepthStream을 뽑아내는 구조는 ColorStream과 거의 동일합니다. 쓰는 클래스가 다를뿐이지요. 코드에서도 기존이랑 거의 비슷합니다. 다른거라면 이벤트처리나 InitializeNui() 부분이 Color가 아닌 Depth가 되는겁니다.
 


여기서 탭탭을 해주면 자동으로 이벤트가 형성됩니다. 그러고 나서 마지막으로 nui.Start()을 통해서 동작을 시켜줘야 합니다.
 


위 코드가 DepthStream을 뽑아내는 이벤트입니다. 전의 ColorStream을 뽑는 것과 차이를 느끼시나요? 밑줄로 표시해놨습니다. 우선 저번부터 종료시에 뿜어내도 NullReferenceException 오류가 저렇게 해결됩니다. 아예 이미지를 안 받았을때도 그냥 return을 시키는 것이지요.

그리고 Color에서 byte형 배열로 받던 정보가 Depth에서는 short형으로 받습니다. 1byte로 받던 데이터가 여기서는 2byte로 받게 됩니다. 그리고 마지막에 기존에 bgr32 방식으로 쓰던 것을 이번에는 Gray16으로 바꿨습니다. 기존에 쓰던 방식으로 그대로 쓰면 ArgumentException 오류가 발생하기 때문에 그레이스케일로써 깊이를 표현하게끔 했습니다.

이제 마지막으로 종료시의 이벤트만 작성해줍니다.
xaml로 돌아가서 Closing event를 생성하고 거기에 해당하는 코드를 짜주면 되겠지요. 

 
다음이 실행 결과입니다.


이번 부터는 제 얼굴이 안 나오겠군요. 여기서 흰색으로 표시되는 부분이 인식을 못하는 겁니다. 지금 손을 가까이 했을때는 인식하지 못하고, 또한 레이저가 반사했을때 되돌아가지 않는 부분도 흰색으로 표시됩니다. 이런걸 응용하면 실질상으로 거리에 따른 구분을 할 수 있겠지요. 이 부분에 대해서는 다음 포스팅에서 다루도록 하겠습니다.
 

댓글