안녕하세요 드래곤입니다. ^^
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 파일로 첨부합니다.
많은 도움이 되길바랍니다.
그럼 다음 강좌에서 뵙겠습니다. ^^