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 supportedthis.kinectSensor = KinectSensor.GetDefault();// get the coordinate mapperthis.coordinateMapper = this.kinectSensor.CoordinateMapper;// get the depth (display) extentsFrameDescription colorFrameDescription = this.kinectSensor.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Bgra);FrameDescription frameDescription = this.kinectSensor.DepthFrameSource.FrameDescription;// open multiframereader for depth, color, and bodyindex framesthis.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 framedouble 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 coordinatefloat DepthPosition = csp[(1920 * Convert.ToInt16(y)) + Convert.ToInt16(x)].Z;}}}}}