【发布时间】:2012-08-07 04:35:40
【问题描述】:
有没有人知道我应该使用什么技术来使显示视频向左、向右、向上和向下移动,如下面的视频所示?我想用 Kinect 来实现这一点,但想法不同。
提前致谢。
【问题讨论】:
-
嘿,等一下,我记得你。这是你学校的最后一个项目吗?如果是这样,那就太棒了。
-
哦,你好。是的。它的目的是做广告。你认为它有效吗?
标签: kinect
有没有人知道我应该使用什么技术来使显示视频向左、向右、向上和向下移动,如下面的视频所示?我想用 Kinect 来实现这一点,但想法不同。
提前致谢。
【问题讨论】:
标签: kinect
编辑:
现在我已经醒了,我将详细介绍这件事(显然我花了一周的时间才醒来)。
因此,Winscape 项目通过将窗口从现实世界连接到虚拟世界来连接现实世界和虚拟世界。这样做的方式就像现实世界是虚拟世界的一部分一样,然后更改监视器的显示(伪装成窗口)以复制一个人应该看到的视图,如果他们存在于虚拟世界中。
想象你的虚拟世界。它不一定有尽头,但有一点你会停止尝试将内容渲染到其中,所以假设世界包含在一个包含所有渲染元素的盒子中。现在,Winscape 所做的就是让虚拟世界看起来真实存在于现实世界中,并且您可以通过监视器看到它。
第一步显然是创建您的虚拟世界。对于初学者,我建议只创建一个文字框。使每面墙都具有不同的颜色,或在墙上放置颜色渐变。做一些简单的事情。如果您还没有决定使用 3D 框架来处理这个问题,我建议您使用 XNA。它是 C#,可与 Kinect SDK 配合使用,并且它有大量在线教程可以帮助您。一旦你创建了你的世界,使用 XNA 在盒子里放置一个摄像头并添加一些简单的控件来旋转摄像头。这将允许您从内部查看框,以确保渲染按预期工作。
完成此操作后,您需要决定将窗户放在哪里。这些将成为您的 3D 场景的视点。为了演示这个概念,这是我从XNA camera tutorial 拍摄的一张照片。
请注意,如果您阅读实际教程,他们不会说与我完全相同的内容,因为我只是在劫持图片以证明我的意思。所以,(0,0,0) 点就是你的“眼睛”所在的位置。粉红色的矩形将代表您的窗口。看着窗户,从眼睛到粉红色窗户的角落画了四条线。这四条线向前延伸,直到它们与背景碰撞,形成绿色矩形。这将是您的眼睛可以透过窗户看到的矩形。
请注意,XNA 实际上会为您处理很多此类问题。你只需要在你的虚拟场景中创建一个摄像头并移动它,做一些数学运算将它直接对准你的窗户。您会希望该摄像机以代表您在现实世界中的位置的方式出现在虚拟空间中。为此,您可以使用 Kinect 获取与自身相关的真实世界坐标,然后配置您的应用程序以了解 Kinect 相对于窗口的位置。结合这些数据,您可以获得与现实世界中的监视器相关的眼睛位置,并且由于监视器由虚拟世界中的窗口表示,您可以确定您在虚拟世界中的位置。因此,将虚拟摄像头放置在虚拟世界中您的头部所在的位置,将其指向窗户,然后做一些魔术以确保摄像头只能看到窗户。
原始的半清醒咆哮:
好的,我要试一试(现在快凌晨 1 点了,所以如果我做得不够出色,请告诉我,我醒来后会回来做的)。
首先,它会涉及到相当多的数学知识,我将略过。基本上,你有三层。
人物----“Windows”(监视器)----场景
当然,这个场景并不真正存在。你必须将这个人融入一个虚拟世界,其中的场景实际上只是一个平面图像,存在于墙后面。该人可以看到所述场景的唯一方法是通过墙上的窗户,实际上这是由监视器伪造的。
所以,数学来了。 Kinect 可以计算出你站在房间的哪个位置,更重要的是,可以计算出你的头在哪里。由此您可以大致了解您的眼睛在哪里。您需要抓住这一点(您的眼睛)并将其转换为您在虚拟世界中使用的坐标。然后,计算这些眼睛应该能够通过虚拟窗口看到什么。您可以通过将线条从眼睛投射到窗口的每个角落,一直到它碰到“场景”图片来做到这一点。每个窗口将对应背景图片上的一个矩形区域。这个矩形是需要绘制到屏幕上的。
最棘手的部分是设置虚拟世界以几乎完美地模仿现实世界。本质上,很多配置(“好吧,这个窗口在 Kinect 上方 1.5 米处.. 并且在其左侧 0.25 米处..”)。我也不确定你应该把场景图片放多远。如果我想到了什么,我会回到这个,但你当然可以尝试一下,找出适合你的设置的距离。
哦,等等,现在我知道为什么我无法计算出距离了。这是因为该示例使用的是 3D 模拟。很漂亮。所以你只需要弄清楚你想在模拟中在哪里播放你的窗口或诸如此类。
【讨论】:
有多种技术取决于您要使用的设置(KinectDSK、libfreenect、OpenNI 等)以及您想要的准确度。
例如,OpenNI 有一个名为GetCoM 的函数,它可以返回用户的质心(此时不需要跟踪骨架),可以使用该函数。看起来视频中使用了 OpenNI,但他们仍然使用旧版本。较新的版本允许在没有 'psi'(ψ) 姿势的情况下进行骨骼跟踪。
请注意,它看起来不像用户的头部方向。例如,身体可以指向一个方向,而头部可以指向另一个方向。 G.Fanelli and his team 在该领域做了相当多的研究。对于 Kinect,请查看 Real Time Head Pose Estimation from Consumer Depth Cameras
我使用了 KinectSDK 和 Kinect for Windows,发现其中包含一个 Face Tracker。
最后,根据您希望跟踪的松散或精确程度、理想设置(覆盖的最大距离、使用的内容等),您可以确定最适合您的 SDK/库。另外,我想这也取决于你的编程经验,在这种情况下,还要寻找更容易处理的包装器(例如 Unity、MaxMSP/Jitter、Processing、openFrameworks 等)
【讨论】: