안녕하세요 드래곤입니다. ^^
설 명절에 회사 이전에 바쁜일이 겹치다 보니 강좌가 많이 늦었네요 ^^;
네번째 강좌로는 BodyIndex 에 대해 알아보겠습니다.
BodyIndex는 Kinect 의 유효범위내에서 Kinect 를 사용하고 있는 사람의 수를 확인할 수 있습니다.
Kinect V1에서는 Depth 2Byte의 상위 13bit를 detpth Data로 사용하고 하위 3bit를 PlayerIndex로 사용자의 수를 확인하는데 사용을 하였습니다.
하지만 Kinect V2에서는 PlayerIndex라는 개념은 사라지고 BodyIndex라는 새로운 기능을 추가하였습니다.
또한 Kinect V1에서는 Depth를 받아와서 Data와 사용자의 수를 분리해야 했지만
ex) DepthInfo = DepthData >> 3;
PlayerIndex = DepthData & 7;
Kinect V2에서는 BodyIndex를 Open 하여 독립적으로 사용하시면 됩니다.
BodyIndex는 Depth 와 동일한 Resolution(512 X 424)을 가지고 있으면 BodyIndexFrame Data의 크기를 1Byte입니다.
1Byte의 픽셀 값을 읽어들여 0 부터 5 까지의 값이 존재한다면 사용자의 수가 있다는것을 알수가 있습니다.
Body tracking에 의해서 사람으로 결정된 정보들을 0부터 5까지로 분리하여 1Byte(0-255 )의 크기에 담아 보내줍니다.
예를 들어 1이라는 정보가 있을때 그 해당하는 1을 전부 화면에 그려준다면 사용자의 형태가 화면에 그려지게 됩니다.
0000000
0001000
0011100
0111110
0011100
0001000
0000000
(1을 둘러싼 0들은 Kinect 상에서는 255의 값들로 전달됩니다.)
위에 표현은 의미상으로만 이해를 해주시길 바랍니다.
저렇게 해당하는 0부터5 까지의 숫자중 하나를 화면에 저런식으로 그려주신다면 Kinect에 의해서 tracking 된 형태를 보실수 있습니다.
하지만 0 부터 5까지라고 해서 0이 첫번째 사용자라는 것은 아닙니다.
ex) 1이 있다고 해서 0이 존재하는건 아닙니다. 값은 0 부터 5사이에서 랜덤하게 사용자의 수만큼 채워집니다.
그럼 한번 BodyIndex를 사용해 보도록 하겠습니다.
실습환경은 아래와 같습니다.
OS : Windows 8.1
SDK : Kinect SDK 2.0 Oct
Dev Tool : Visual Studio 2013
개발 프로젝트 세팅은 이전 강좌를 참고 하시길 바랍니다.
http://cafe.naver.com/kindplayer/3457
private BodyIndexFrameReader bodyIndexFrameReader = null;
BodyIndex Data를 받기위한 BodyIndexFrameReader 변수를 선언합니다.
private FrameDescription bodyIndexFrameDescription = null;
BodyIndexFrame을 저장하기 위해서 FrameDescription Class를 사용합니다.
private byte[] bodyIndexBuffer = null;
BodyIndexFrame Data는 1Byte 입니다.
kinectSensor = KinectSensor.GetDefault();
변수에 Kinect Object 를 연결하고
bodyIndexFrameDescription = kinectSensor.BodyIndexFrameSource.FrameDescription;
bodyIndexFrameReader = kinectSensor.BodyIndexFrameSource.OpenReader();
bodyIndexFrameReader.FrameArrived += bodyIndexFrameReader_FrameArrived;
FrameDescription 저장 및 KinectSensor의 OpenReader()를 사용해 BodyIndexFrame Data 를 Open 하고 handler를 등록합니다.
MainWindows.xaml 에
<Image x:Name="ImageBodyIndex" Width="512" Height="424"/>
추가합니다.
등록된 BodyIndexFrame Data가 저삭적으로 호출된다면 BodyIndexFrameArrivedEventArgs 를 통해서 해당 정보를 받을 수가 있습니다.
var bodyIndexFrame = e.FrameReference.AcquireFrame()
bodyIndexFrame.CopyFrameDataToArray(bodyIndexBuffer);
해당하는 BodyIndexFrame Data를 배열에 복사하여 원하는 형태로 사용을 하시면 됩니다.
WPF C#기반의 Kinect V2 BodyIndex 에 대해서 알아 보았습니다.
강좌에서 사용되는 코드는 zip 파일로 첨부합니다.
많은 도움이 되길바랍니다.
그럼 다음 강좌에서 뵙겠습니다. ^^