2014-12-03 84 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

你是'深度像素'不断更新?如果他们只更新一次,例如在你的类初始化,然后我希望数据将始终保持不变,可能是默认值(0)。 – 2014-12-03 15:54:43

+0

对于愚蠢的问题,我很抱歉,是否需要在我的sensor_AllFramesReady void中放入代码(depthPixels = new DepthImagePixel [this.sensor.DepthStream.FramePixelDataLength];)。 (不工作)你会如何更新? – simon 2014-12-03 16:00:25

+0

可以放弃它! Disclamer:从未与Kinect合作过。 – 2014-12-03 16:09:44

回答

2

我认为原因可能是您的DepthImagePixel[]未被填充。

你已经证明

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

的代码行初始化数组但不会将任何数据添加到它,所以我希望内为零的所有值。逐字从MSDN - Getting and Displaying Depth Data in C#

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 
     } 
    } 
} 

这被解除(大约):

当你的类被初始化,您应该添加哪些更新此事件:

this.sensor.DepthFrameReady += this.SensorDepthFrameReady; 

并且将其添加到类。

+0

非常感谢!这是我一直在寻找的解决方案! – simon 2014-12-03 16:31:05