안녕하세요 드래곤입니다. ^^
새해 첫 강좌가 되네요 ^^
두번째 강좌로는 Depth에 대해서 알아 보겠습니다.
Kinect V1은 Depth Data 2Byte를 기준으로 상위 13bit 를 Depth 로 사용하였고 하위 3bit를 PlayerIndex 로 사용하였습니다.
Kinect V2에서는 Depth Data 2Btye를 Depth로 사용하며 PlayerIndex는 사라지고 BodyIndex 라는 새로운 기능을 추가 시켰습니다.
BodyIndex는 추후에 다시 다루도록 하겠습니다.
Depth Data에는 Kinect Depth Camera 를 통해 얻은 물체의 거리를 밀리미터 단위로 값을 채워줍니다.
이런 Depth Data를 사용하여 우리는 물체의 거리를 확인할 수 있습니다.
실습을 통해 KinectSensor에서 Depth Data 를 받아 화면에 출력하는 프로그램을 만들어 보겠습니다.
실습환경은 아래와 같습니다.
OS : Windows 8.1
SDK : Kinect SDK 2.0 Oct
Dev Tool : Visual Studio 2013
개발 프로젝트 세팅은 이전 강좌를 참고 하시길 바랍니다.
http://cafe.naver.com/kindplayer/3457
private DepthFrameReader depthFrameReader = null;
KinectSensor의 Depth Data를 받기위해서 DepthFrameReader 를 선언합니다
private FrameDescription depthFrameDescription = null;
Image Frame 의 속성을 저장하기 위한 FrameDescription Class 변수를 선언합니다.
이전 강좌에서도 다루었듯이 Kinect 모든 Data는 FrameDescription Class을 사용합니다.(중요)
private WriteableBitmap depthBitmap = null;
Bitmap을 업데이트 하기 위한 WriteableBitmap Class 변수를 사용합니다.
private ushort[] depthBuffer;
저장될 Depth Data 배열을 선업합니다.
Depth Data를 사용하기 위한 변수 선언을 해보았습니다.
이전 Color 강좌를 잘 이해하고 따라해보셨다면 약간의 변수들과 Color 에서 Depth 의 변경 뿐 큰 변화는 없다는걸 아실수 있습니다.
kinectSensor = KinectSensor.GetDefault();
변수에 Kinect Object 를 연결하고
depthFrameDescription = kinectSensor.DepthFrameSource.FrameDescription;
depthFrameReader = kinectSensor.DepthFrameSource.OpenReader();
depthFrameReader.FrameArrived += depthFrameReader_FrameArrived;
FrameDescription 저장 및 KinectSensor의 OpenReader()를 사용해 Depth Data 를 Open 하고 handler를 등록합니다.
depthBitmap = new WriteableBitmap(depthFrameDescription.Width, depthFrameDescription.Height,
96, 96, PixelFormats.Gray16, null);
depthBuffer = new ushort[depthFrameDescription.LengthInPixels];
depthRect = new Int32Rect(0, 0, depthFrameDescription.Width, depthFrameDescription.Height);
depthStride = (int)(depthFrameDescription.Width * depthFrameDescription.BytesPerPixel);
ImageDepth.Source = depthBitmap;
Depth Data 저장 공간 할당 및 화면에 보여질 Bitmap 생성, Depth Data Rect 정보, xaml Image Element Data binding을 구현합니다.
MainWindows.xaml 에
<Image x:Name="ImageDepth" />
추가합니다.
정상적으로 구현되었다면 KinectSensor로 부터 Depth Data가 들어올 때 마다 depthFrameReader_FrameArrived handler 가
호출되며 DepthFrameArrivedEventArgs를 통해서 해당 Detpth Data를 받아올수 있습니다.
var depthFrame = e.FrameReference.AcquireFrame()
depthFrame.CopyFrameDataToArray(depthBuffer);
Depth Data 정보를 배열에 저장 합니다.
이렇게 WPF C#기반의 Kinect V2 Depth 에 대해서 알아 보았습니다.
강좌에서 사용되는 코드는 zip 파일로 첨부합니다.
많은 도움이 되길바랍니다.
그럼 다음 강좌에서 뵙겠습니다. ^^