Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于SDK的原始kinect数据需要什么校正数学_C#_Kinect_Kinect Sdk - Fatal编程技术网

C# 基于SDK的原始kinect数据需要什么校正数学

C# 基于SDK的原始kinect数据需要什么校正数学,c#,kinect,kinect-sdk,C#,Kinect,Kinect Sdk,我正在用Kinect摄像机获取深度数据。 到目前为止,我的应用程序工作,我得到了13位深度信息,排除了玩家数据。将其放置在24位RGB位图上(我不喜欢rgb656),mdf应用程序看起来很棒,工作正常,在该区域没有问题,没有位移位错误等(并且不需要WPF显示它) 然而。。 我接着说,想用真实世界的测量来验证它。 我使用的是原始的MicrosoftSDK(我认为这是Windows7的1.7版) 然后我注意到,尽管我得到了正确的位,但对于我来说,错误率仍然很高。请参阅下表,我使用(更便宜的)卷尺工具

我正在用Kinect摄像机获取深度数据。 到目前为止,我的应用程序工作,我得到了13位深度信息,排除了玩家数据。将其放置在24位RGB位图上(我不喜欢rgb656),mdf应用程序看起来很棒,工作正常,在该区域没有问题,没有位移位错误等(并且不需要WPF显示它)

然而。。 我接着说,想用真实世界的测量来验证它。 我使用的是原始的MicrosoftSDK(我认为这是Windows7的1.7版)

然后我注意到,尽管我得到了正确的位,但对于我来说,错误率仍然很高。请参阅下表,我使用(更便宜的)卷尺工具将Kinect和(真实)毫米测量值放入其中进行验证

(测量从正面中间像素开始,其与物体的角度不低于此角度)

通过一些尝试和错误,我发现kinect深度数据乘以10063确实会给出更好的结果。现在,虽然它改进了一点。我想知道是否有更好的公式,因为乘以10063是很好的…相当线性的数学,也许这应该是指数,对数,或者???。我只是觉得错误率不是线性的

在上面的数据中,我手动获取了一些数学数据(很可能它也包含了一些小的humman测量误差) 这也可能提供可能的偏差plusminus。 例如,距离为730mm,可能高于或低于该距离12mm

我用C#编写代码,我是新手。 也许这不是一个关于C#的直截了当的问题,但它有点像编码的两难境地,我在这里看到过其他主题,人们要求正确的公式(wel编码就是其中很多)。这里有一个相当强大的kinect社区。最有可能的是你知道一个比我的10063更好的答案

我能读12种编码语言,所以如果你知道另一种语言的答案也可以。 对我没有帮助的事情是使用arge/OpenCV/xyz/Mathlab/等等 当然它们很棒,但如果我只需要一个函数,那么我宁愿不使用它们,就像我在自己的库中为这个项目做的所有其他图形一样。 (因为我觉得了解这些东西很酷)

---更新 还没搞定,但除了深度10063 它指出:

depth = kinectdept * ( kinectdepth - 800 ) * 0,069
也很接近。 奇怪的是,上表中的错误率非常接近

(realDepth-800)/16 

但是我需要更多的样本来验证它,因为这里的人为错误太大了。

当我看到这个错误有多严重时,这里的警铃响了。就我个人而言,我有点惊讶这并没有引起更多的关注。我开始测试,结果略有不同。我猜你写的公式有点小错误。我通过以下方式获得最佳效果:

//Below  1300mm
kinectDepth = kinectDepth + (kinectDepth -800) * 0,05
// range 1350mm 2050mm
kinectDepth = kinectDepth + (kinectDepth -800) * 0,064
// range 2050mm 2850mm
kinectDepth = kinectDepth + (kinectDepth -800) * 0,069
// beyond 2900mm 
kinectDepth = kinectDepth + (kinectDepth -800) * 0,08
// beyond 3500mm
kinectDepth = kinectDepth + (kinectDepth -800) * 0,085
请注意,我们并没有经常得到精确的毫米,我们看到前面越远,数字以厘米为单位跳跃,在近距离跳跃2mm~4mm

我没有机会用其他Kinect测试它,但如果其他人也喜欢分享他们的测试,我们只需使用Excel,输入您的数学,并保留a$B$1以指向单个值(ea 0,05)

我们从A列中提取了测试结果,并用你的数学做了两个校正列来比较结果。对于我们使用的范围,我们为每个范围制作了一个小折线图,并对最佳拟合进行了视觉测试。我们也画了一些趋势线,但这不太方便。因为在一定距离上,在某些特定的时间间隔上会有更多的不精确变化,比如一个形状,它是一个随时间增长的波(不是一条直线)

此外,因为我们有一个放大校正,这可能是非线性的。但我无法理解,所以我根据上面的公式修正了一个函数


我希望更多的人能对此进行测试,以便我们能找到一个真正的解决方案。我的答案不是我认为的解决方案,但我希望有人能够根据我和你的结果改进并发布更好的解决方案。因此,我将此作为“测试”结果解决方案,而不是“最终”解决方案发布。

你刚才听到的声音让我头晕目眩。:)我打字太多了吗?不,只是这是我第一次看到有人问这么高级的问题。我对Kinect深度读数的准确性没有任何期望(你有文件吗?)。尝试绘制误差测量值,它们看起来几乎是线性的。还可以尝试其他照明场景,其他目标。你可能也可以尝试查看。还可以查看哪些参考,其中提到了校准的重要性。啊,事实上,我有一些小的打字错误,需要添加而不是乘法。顺便说一句,测试它的好方法是0.69有点胆量匹配它们…但在一定范围内制动..好主意。你每100毫米采集多少样本,从外观上看,你每50毫米采集一次?是的,我使用了50毫米,注意最后一个校正范围有点小kinect在该范围内不可信。
//Below  1300mm
kinectDepth = kinectDepth + (kinectDepth -800) * 0,05
// range 1350mm 2050mm
kinectDepth = kinectDepth + (kinectDepth -800) * 0,064
// range 2050mm 2850mm
kinectDepth = kinectDepth + (kinectDepth -800) * 0,069
// beyond 2900mm 
kinectDepth = kinectDepth + (kinectDepth -800) * 0,08
// beyond 3500mm
kinectDepth = kinectDepth + (kinectDepth -800) * 0,085