2014-12-03 2 views
2

저는 Kinect로 프로젝트를 시작하고 있습니다.kinect에서 마우스 클릭으로 깊이를 얻으십시오.

내가하고 싶은 프리스트는 사용자가 객체를 클릭하게하고 프로그램은 해당 객체가 kinect에서 얼마나 멀리 떨어져 있는지를 반환합니다.

내 코드 :

private void colorImg_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    double distance; 
    System.Windows.Point position = Mouse.GetPosition(colorImg); 
    distance = position.X + (position.Y * 640); 
    int af = (int)distance; 
    int depth = depthPixels[af].Depth; 
    System.Windows.Forms.MessageBox.Show("" + depth); 
} 

그러나 항상 0 반환 문제는 deptPixels의 깊이 속성이 항상 처음부터 0 것입니다. 중단 점을 사용하여이 줄을 확인했으며 모든 픽셀에 대해 깊이는 0입니다. 하지만 왜?

this.depthPixels = new DepthImagePixel[this.sensor.DepthStream.FramePixelDataLength]; 

도움이되었습니다.

+0

'depthPixels'이 (가) 지속적으로 업데이트되고 있습니까? 광고가 한 번만 업데이트되면 귀하의 클래스 초기화에 다음 데이터가 항상 동일하고 아마 기본 (0)을 유지할 것이라고 기대했다. –

+0

바보 같은 질문에 유감스럽게 생각합니다. 내 sensor_AllFramesReady void에 코드 (depthPixels = new DepthImagePixel [this.sensor.DepthStream.FramePixelDataLength];)를 넣어야합니까? (작동하지 않음) 어떻게 업데이트 하시겠습니까? – simon

+0

전에 줄 수 있어요! Disclamer : Kinect와 함께 일한 적이 없습니다. –

답변

2

이유는 귀하의 DepthImagePixel[]이 채워지지 않을 수 있습니다.

당신이

this.depthPixels = new DepthImagePixel[this.sensor.DepthStream.FramePixelDataLength]; 

표시 한 코드의 라인은 배열을 초기화하지만 모든 데이터를 추가하지 않습니다, 그래서 제로가하는 내의 모든 값을 기대. 클래스가 초기화 될 때

,이를 업데이트하는 이벤트를 추가해야합니다 :

this.sensor.DepthFrameReady += this.SensorDepthFrameReady; 

및 클래스에이 추가

private void SensorDepthFrameReady(object sender, DepthImageFrameReadyEventArgs e) 
{ 
    using (DepthImageFrame depthFrame = e.OpenDepthImageFrame()) 
    { 
     if (depthFrame != null) 
     { 
      depthFrame.CopyDepthImagePixelDataTo(this.depthPixels); 
     } 
     else 
     { 
      // depthFrame is null because the request did not arrive in time 
     } 
    } 
} 

는 해제되었다 (약) 그대로 MSDN - Getting and Displaying Depth Data in C#에서.

+0

고맙습니다!이 솔루션을 찾고있었습니다! – simon

관련 문제