티스토리 뷰

Kinect

[kinect 프로젝트] Working with Depth Data

생각많은 소심남 2012. 2. 6. 11:55
<출처: http://channel9.msdn.com/Series/KinectQuickstart/Working-with-Depth-Data>

 이번시간에는 지난 시간 컬러 정보를 받아오는데 이어서 깊이 정보까지 받아들이는 것을 해보기로 하겠습니다.
 



이번 프로젝트는 기존에 완성되 프로젝트를 따라가면서 어떤 내용인지를 따라가보고자 합니다.
우선 동영상 앞에도 나와있는 것처럼 깊이에 대한 정보입니다.

 
지난 시간에 다뤘던 컬러정보는 bgr32이란 규격을 써서 한 픽셀당 4가지 색에 대한 출력을 표현했었는데 이번 깊이정보는 그렇게 다뤘던 픽셀에서 거리와 키넥트를 사용하는 사용자에 대한 정보를 받아옵니다.  거리에 대한 정보는 바로 뒤에서도 언급하겠지만 최대 8미터까지 인지가능하고, 최소 범위는 40cm입니다. 이는 기존 엑박용 키넥트의 인지범위가 최소 1.5m였다는 점에서 많은 차이를 나타냅니다. 기존에는 컴퓨터 모니터위에 키넥트를 올려놔도 동작시키기 위해서는 멀치감치 떨어져서 동작시켰어야 했습니다. 


최소한 이정도의 거리는 떨어져있어야 했다는 점이 조금 아쉬웠던 점이었습니다.
하지만 이번 윈도용 키넥트에서는 DefaultMode와 NearMode를 제공해서 거리에 따른 인식률 변화를 명시했습니다.


지난 시간에 잠깐 언급했었지만 기본적인 기능으로 제공하고 있습니다. 물론 엑박용 키넥트에서는 비활성화된 상태입니다.


그래서 위와 같은 인지 범위를 제공하는데 NearMode를 사용한다면 기존보다도 PC사용에 효율적인 어플리케이션을 만들 수 있을 거라고 생각합니다. 제가 생각한 어플리케이션으로는 아두이노와 결합시켜서 컴퓨터상의 일정위치에 오랫동안 있을경우 컴퓨터가 자동으로 켜지는 건데요. 물론 좀더 공부해야겠지요.


기본적인 사용형식은 다음과 같습니다. 역시 SDK내에서 DepthImageFrame을 제공해서 사용자는 이를 이용하면 됩니다.

이제 데모를 해보겠습니다. 물론 이번에도 코드로 구현하는 방식과 xaml상에서 구현하는 방식을 둘다 합니다.


위의 것이 이번에 한 코드입니다. 그리고 밑의 것이 지난 시간에 했던 컬러이미지를 받는 코드였습니다.
 우선 여기서 보면 바뀐 것은 


Color가 Depth로 바뀌 것만 차이가 있습니다. 그리고 CopyPixelDataTo 항목이 Depth에서는 없는데 이 부분은 새로운 메서드인 GenerateColoredByte에 들어있습니다.
사실 컬러 정보라는 것은 Depth와 플레이어 정보를 색상으로 바꿔주는 꼴이기 때문에 거기서 다뤘던 내용과 거의 비슷할 수 밖에 없지요.
 


위와 같이 기존엔 AllFrameReady에서 다뤘던 부분이 여기선 따로 생성된 메서드에 포함되어있습니다. 차이가 있을까요? 차이가 있다면 기존 색상 정보를 넣을때 byte형 정보가 들어갔지만 이번 Depth Data는 short형 정보가 들어가기 때문에 그에 따른 DataLength도 달라지는 것이겠지요. 
 

 
이제 각 색상에 대한 Index를 정한후 받아오는 이미지를 pixel단위로 넘겨받는 걸 해야됩니다. 물론 for 루프로 처리해서 (0 0)에서 bgr32에 맞게 한 픽셀당 4색의 정보를 받은 후 다음 픽셀로 넘어가는 형태를 취하겠지요. 그래서 그에 해당하는 player 정보와 거리에 대한 정보를 지정한 겁니다. 밑에 다룰 정보는 거리에 따라 어떤 색을 보여주겠냐를 설정해주는 것이 될겁니다.

첫번째 예제에서는 


와 같이 0.9m 이하, 0.9m에서 2m 사이, 2m이상의 거리에 대한 정보를 각각 B G R에 따라 내보내도록 하였습니다.
(첨부된 파일로 실행하시는 분이 계시다면 밑의 Intensity 항목과 gold 항목을 주석처리해주세요.)
이제 실행시켜보면
 



RGB로 표현된 화면이 나옵니다. ( 첨부파일로 하면 옆에 또다른 이미지가 출력되는데 그건 xaml상에서 한거니까 신경쓰지 마세요.)

아무튼 이렇게 거리에 따라서 색상의 정보가 변하는 것을 확인할 수 있을 겁니다. 저도 없어지네요.
이제 다음으로 할 것은 히스토그램입니다. 앞에서 주석처리한 것중에 Intensity관련 항목이 바로 히스토그램을 보여주는 코드였습니다. 


 위의 코드는 ColoredByte를 생성하는 단계에서 포함되었던 내용이고 밑의 메서드는 깊이에서 Intensity를 구하는 공식이 되겠습니다. 위와 같은 메서드를 사용한다면 돌려주는 값이 회색계열의 색이 되게 됩니다. 

 
 히스토그램은 간단하게 말하면 빛이 사물과 부딪친 후 나오는 반사광의 강도를 표현하는 표가 되겠습니다.물론 더 자세한 내용은 네이버에 물어보시면 쉽게 이해가 될듯하네요.

그 다음은 플레이어 인식입니다. 역시 그다음으로 주석처리된 Gold 부분을 풀어주시면 역시 확인할 수 있습니다.
저는 Skyblue로 바꿔서 실행시켜봤습니다.





 이처럼 정확하지는 않지만 특정 히스토그램을 가진 데이터에 대해서는 이렇게 색상을 입혀서 구분을 할 수도 있습니다.
그런데 이 플레이어를 구분하는 기준이 무엇일까요?

동영상에서 언급한 것은 바로  SkeletonStream입니다. 바로 골격을 인지해서 플레이어 구분을 하는 것이지요. 테스트를 위해서 중간에 있는 SkeletonStream.Enable() 항목을 주석처리하면 플레이어를 인지하지 못하는 것을 확인할 수 있습니다.
 


여기까지가 코드로 구현한 기능이었고 xaml상에서 구현하는 것은 지난 시간과 유사하고 더 쉽습니다. 그냥 해당 기능을 제공하는 tool을 삽입한 후 Data Binding을 실행하면 끝입니다. 우선 이번시간에 쓸 거는 DepthViewer이므로 그 부분을 Toolbox에서 찾아서 MainWindow상에 삽입합니다.

 


그 후에 지난 시간에 한것처럼 Properties 항목을 찾아 Kinect를 Data Binding시키면 됩니다. 여기는 지난 시간에 언급했던 ColorViewer와 동일합니다. 

 
더블 클릭후 xaml상으로도 DepthViewer가 생성된 것을 확인한 후 실행합니다.
 



xaml상에서 나오는 색상은 앞에서 보였던 Distance에 따릅니다.
여기까지가 DepthData를 받아오는 과정이었습니다. 


댓글