Kinect For Windows V2 로 특정 좌표 깊이 가져오기

by Taylor
0 comment

Kinect For Windows V2 로 특정 좌표의 Z값(깊이)를 가져오는 코드입니다.

이 코드를 통해 x, y 값으로 z 값을 가져오실수 있습니다.

X, Y 좌표는 ColorFrame 의 해상도인 1920×1080 기준입니다.

Z 값은 Float 으로 리턴되며 키넥트 센서로부터의 미터 거리를 뜻합니다.

먼저 이 코드를 사용하시려면 Kienct for Windows V2 센서와 Kinect SDK 2.0, Visual Studio 2013 이 필요합니다.

이 코드는 WPF 프로그램의 소스 일부이며 사용하실때 자신의 코드에 맞게 수정하시어 사용하시기 바랍니다.

MapColorFrameToCameraSpace() 함수가 아래처럼 매번 프레임이 들어올때마다 실행될 경우 프로그램이 많이 느려지는 영향이 있으므로 주의하시기 바랍니다.

더 자세한 설명은 이 링크에서 영문으로 확인하실수 있습니다.

https://gist.github.com/taylor224/1a534cb9287a4205c91f

public partial class MainWindow : Window
{
private KinectSensor kinectSensor = null;
private CoordinateMapper coordinateMapper = null;
private MultiSourceFrameReader multiFrameSourceReader = null;
public MainWindow()
{
InitializeComponent();
// one sensor is currently supported
this.kinectSensor = KinectSensor.GetDefault();
// get the coordinate mapper
this.coordinateMapper = this.kinectSensor.CoordinateMapper;
// get the depth (display) extents
FrameDescription colorFrameDescription = this.kinectSensor.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Bgra);
FrameDescription frameDescription = this.kinectSensor.DepthFrameSource.FrameDescription;
// open multiframereader for depth, color, and bodyindex frames
this.multiFrameSourceReader = this.kinectSensor.OpenMultiSourceFrameReader(FrameSourceTypes.Depth | FrameSourceTypes.Color | FrameSourceTypes.Body);
this.multiFrameSourceReader.MultiSourceFrameArrived += this.Reader_MultiSourceFrameArrived;
}
private void Reader_MultiSourceFrameArrived(object sender, MultiSourceFrameArrivedEventArgs e)
{
MultiSourceFrame multiSourceFrame = e.FrameReference.AcquireFrame();
if (multiSourceFrame != null)
{
using (DepthFrame depthFrame = multiSourceFrame.DepthFrameReference.AcquireFrame())
{
if (depthFrame != null)
{
// Specified X, Y coordinate
// In 1920 x 1080 color frame
double x = 1000;
double y = 900;
FrameDescription depthFrameDescription = depthFrame.FrameDescription;
depthWidth = depthFrameDescription.Width;
depthHeight = depthFrameDescription.Height;
depthframeData = new ushort[depthWidth * depthHeight];
depthFrame.CopyFrameDataToArray(depthframeData);
CameraSpacePoint[] csp = new CameraSpacePoint[1920 * 1080];
this.coordinateMapper.MapColorFrameToCameraSpace(depthframeData, csp);
// Depth(Z Position) of specified coordinate
float DepthPosition = csp[(1920 * Convert.ToInt16(y)) + Convert.ToInt16(x)].Z;
}
}
}
}
}

Leave a Comment