• Kinect

    Kinect V2 첫번째 강좌 - Color

    twitter facebook

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


    Kinect V2 에 대한 기본적인 사용법에 대해서 강좌를 진행하려고 합니다.


    첫 강좌로는 Color 에 대해서 알아 보겠습니다.


    V2는 기존 V1 과는 다른 해상도를 가지고 있습니다.

    V1은 640x480, 1280x960 과 여러개의 해상도를 지원했지만 V2는 현재 1920x1080의 Full HD 의 해상도만 지원하고 있습니다.


    V2 에서는 Source/Reader pattern 방식으로 KinectSensor 에서 data를 보내줍니다.

    V1 과 V2 Data 전송구조를 살펴보면 아래와 같습니다.


    V1: KinectSensor -> stream -> frame -> data

    V2: KinectSensor -> source -> reader -> frame -> data


    V1은 KinectSensor 마다 하나의 Stream으로 Data 를 처리 하는 반면

    V2는 KinectSensor 마다 하나의 Source와 여러개의 Reader를 가지고 Data를 처리합니다.


    V2는 하나의 Source에 다수의 Reader를 처리 하는 방식으로 각각의 color,depth,body index,body 등을 독립적으로 pause/resume 의 처리가 가능합니다. 


    실습을 통해 KinectSensor에서 Color Data 를 받아 화면에 출력하는 프로그램을 만들어 보겠습니다.


    실습환경은 아래와 같습니다.


    OS : Windows 8.1

    SDK : Kinect SDK 2.0 Oct

    Dev Tool : Visual Studio 2013




    Visual Studio 2013 을 실행후 -> File -> New -> Project 를 만듭니다.





    Solution Explorer 에서

    References -> Add Reference 를 선택합니다.



    SDK 가 정상적으로 설치되어 있다면 위에 그림처럼 Kinect  DLL 이 정상적으로 목록에 보여질 것입니다.

    목록에 없다면 Browse를 클릭한후 SDK 설치된 경로에 Kinect DLL 을 불러와서 사용하면 됩니다.


    해당 DLL 을 선택후 OK 하게되면 이제 Kinect V2 Application 을 만들기 위한 기본 구성이 완료 되었습니다.


    KinectSensor 를 사용하기위해서


    using Microsoft.Kinect;


    Mainwindow.xaml.cs 코드 상단에 정의합니다.


    private KinectSensor kinectSensor = null;
     
    기본적으로 Kinect 장치를 PC 에 연결하고 정상적으로 인식 하였다면 SDK에서  KinectSensor의 Object를 생성합니다.

    이 Object 의 주소를 저장하기 위한 변수를 선언합니다.


    private ColorFrameReader colorFrameReader;


    KinectSensor의 Color Data를 받기위해서 ColorFrameReader 를 선언합니다.


    private FrameDescription colorFrameDescription;


    KinectSensor 에서 오는 Image Frame 의 속성을 저장하기 위한 FrameDescription Class 변수를 선언합니다.

    Kinect V2 에서는 KinectSensor 로부터 받는 모든 Data(Color, Depth, infrared 등 )의 속성을 저장하는 FrameDescription Class가 새롭게 추가 되었습니다.  

    http://msdn.microsoft.com/en-us/library/windowspreview.kinect.framedescription.aspx

    MSDN 의 정보를 통해 자세히 살펴보길 바랍니다 .


    private uint bytesPerPixel = 0;


    Pixel 당 바이트를 저장하기 위한 변수를 선언합니다.


    private WriteableBitmap colorBitmap = null;


    Bitmap을 업데이트 하기 위한 WriteableBitmap Class 변수를 사용합니다.


    private byte[] colorPixels = null;


    렌더링 될 pixel 배열을 선언합니다.


    Color Data를 보여주기 위한 기본적인 변수 선언을 해보았습니다.


    그렇다면 이제 PC에 연결된 KinectSensor를 변수에 저장하고 Sensor 로부터 오는 Color Data를 처리 하는 방법을 구현해 보겠습니다.


     kinectSensor = KinectSensor.GetDefault();


    PC에 연결된 KinectSensor의 Object 를 kinectSensor 클래스 변수에 저장을 합니다.

    현재 V2는 Multi Kinect 연결 구성이 지원되지 않습니다.

    향후  SDK 패치를 통해서 Multi Kinect 지원을 하겠다고 MS에서는  이야기 하고 있습니다.


    this.colorFrameReader = this.kinectSensor.ColorFrameSource.OpenReader();


    KinectSensor의 OpenReader()를 사용해 Color Data 를 Open을 합니다.


    this.colorFrameReader.FrameArrived += this.colorFrameReader_FrameArrived;


    KinectSensor로 부터 Color Data가 도착할 때 마다 호출되는 handler를 등록합니다.


    colorFrameDescription = this.kinectSensor.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Bgra);


    FrameDescription 의 정보를 저장합니다.


    this.bytesPerPixel = colorFrameDescription.BytesPerPixel;


    ColorImageFormat.Bgra 의 Byte당 pixel정보를 저장합니다.


    this.colorPixels = new byte[colorFrameDescription.Width * colorFrameDescription.Height * this.bytesPerPixel];


    렌더링 될 버퍼의 공간을 할당합니다.


    this.colorBitmap = new WriteableBitmap(colorFrameDescription.Width, colorFrameDescription.Height, 96.0, 96.0, PixelFormats.Bgr32, null);


    화면에 보여질 Bitamp 를 생성합니다.


    this.kinectSensor.Open();


    KinectSensor를 Open 합니다.


    this.DataContext = this;


    WPF 의 xaml 부분과 cs 부분의 Data binding을 하기위해 DataContext를 사용합니다.


    public ImageSource ImageSource

    {

          get

          {

                 return this.colorBitmap;

           }

    }


    Data Binding 을 하기위한 property를 만들어 줍니다.


    MainWindows.xaml 에

    <Image Source="{Binding ImageSource}"  />

    추가합니다.


    PC에 연결된 KinectSensor 로부터 Color Data를 받게되면 colorFrameReader_FrameArrived handler 를 호출하고

    해당하는  handler 에 ColorFrameArrivedEventArgs 로 Color Data를 저장해서 게 되면


    ColorFrame colorFrame = e.FrameReference.AcquireFrame()


    ColorFrame 클래스 변수에 Color Data를 저장하고


    colorFrame.CopyRawFrameDataToArray(this.colorPixels);


    CopyRawFrameDataToArray 를 사용하여 colorPixels 버퍼에 저장한후에


     this.colorBitmap.WritePixels 을 사용해서 호출되는 Color Data의 정보를 업데이트 하게 됩니다.


    여기까지 잘 구현되었다면 윈도우창 화면에서 Color 영상이 정상적으로 보여지게 됩니다.


    위에서도 언급했듯이 Source/Reader pattern 방식을 사용하기 때문에 Kinect V2는 V1보다 좀 더 효율적으로 프로그램이 구현 가능합니다.


    Sensor에서 Color Data 의 정보를 Pause/Resume  하고 싶다면





    위와 같이 2개의 Button을  만들고 handler 를 연결한후에


    colorFrameReader.isPausd = true or false 를 사용해서 해당 Color 영상의 정보를 Pause/Resume 이 가능합니다.


    이렇게 WPF C#기반의 Kinect V2 Color에 대해서 알아 보았습니다.


    강좌에서 사용되는 코드는 zip 파일로 첨부합니다.


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


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