• Kinect

    Kinect V2 두번째 강좌 - Depth

    twitter facebook

    안녕하세요 드래곤입니다. ^^


    새해 첫 강좌가 되네요 ^^


    두번째 강좌로는 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 파일로 첨부합니다.

     

    많은 도움이 되길바랍니다.


    그럼 다음 강좌에서 뵙겠습니다. ^^