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

标签 c# kinect kinect-sdk

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

然而.. 我继续并想根据真实世界的测量来验证它。 我正在使用原始的 Microsoft SDK(我认为那是适用于 Windows 7 的 1.7)。

然后我注意到,尽管我确实得到了正确的位,但错误率仍然很高,无法处理。请参阅下表,其中我使用(便宜得多的)卷尺工具进行 Kinect 和(真实)世界毫米测量以验证它

(测量是从正面中像素,它不低于物体的角度)

kinect  world    err
 800    800      0
 894    900      6
 987    1000    13
1082    1100    18
1179    1200    21
1271    1300    29
1366    1400    34
1459    1500    41
1550    1600    50
1647    1700    53
1730    1800    70
1831    1900    69
1924    2000    76
2014    2100    86
2112    2200    88
2207    2300    93

通过一些试验和错误,我发现 kinect 深度数据乘以 1,0063 确实给出了更好的结果。现在虽然它改善了一点。我确实想知道是否有一些公式可以更好地工作,因为乘以 1,0063 是很好的..非常线性的数学,也许这应该是指数、对数或 ???。我只是认为错误率不是线性的。

以上数据是我手动获取的(因此它可能包含一些小的人类测量误差)我正在寻找一些数学 这也可以提供可能的偏差正负。 例如距离为 730 毫米,可能在其上方或下方 12 毫米。

我用 C# 编写代码,我是初学者,是新来的。 也许这不是关于 C# 的直接问题,但它有点编码困境,我在这里看到其他主题是人们要求正确的公式(wel 编码是很多)。这里有一个非常强大的 kinect 社区。很可能你在这里知道比我的 1,0063 更好的答案

我可以阅读大约 12 种编码语言,所以如果您知道用其他语言给出的答案,那也很好。 对我没有帮助的事情是使用 Aforge/OpenCV/xyz/Mathlab/etc 当然它们很棒,但如果我只需要 1 个功能,那么我宁愿不使用它们,因为我在自己的库中为这个项目做的所有其他图形 Material 。 (因为我觉得了解这些东西很酷)

---更新 还没有确定,但除了深度 1,0063 它接缝:

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

请注意,我们并不经常得到精确的毫米,我们看到数字在更远的前方以厘米为单位跳跃,在近距离时跳跃 2 毫米到 4 毫米。

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

我们从 A 列中提取了我们的测试结果,并根据您的数学进行了 2 个校正列以比较结果。对于我们使用的范围,我们为每个范围制作了一个小线图,并通过视觉测试了最佳拟合。我们还采用了一些趋势线,但这不太方便。由于在某些特定的时间间隔内,在一定距离处存在更多的不准确性变化,例如随着时间的推移而增长的波浪形状(不是直线)。

另外,由于我们进行了放大校正,这很可能是非线性的。但是我想不通,所以我根据上面的内容修正了一个函数

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

关于c# - 基于原始 SDK 的 kinect 数据需要什么校正数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32595384/

相关文章:

windows - kinect for windows V2.0 Developer Preview,相机工作,深度传感器不工作

kinect - Kinect 如何计算深度?

c++ - OpenGL + Kinect SDK - 如何从单个像素获取深度值?

c# - 具有文化特定缩写字母的时间格式

c# - 错误 1904 - 模块 KinectAudio10.dll 注册失败

c# - Kinect 应用程序的源逆向工程

java - 边界框无法正常工作 -/withkinect

c# - 使用 JSON.Net 序列化包含撇号的字符串

C# 和反射

c# - 复杂 silverlight 游戏的最佳设计模式