有没有人知道我应该使用什么技术让显示视频左右,上下移动,如下面的视频?我希望用Kinect实现这个目标但是有不同的想法。
提前致谢。
答案 0 :(得分:3)
编辑:
现在我已经醒了,我会更详细地了解这一点(显然我花了一周时间才醒来)。
因此,Winscape项目通过将来自现实世界的窗口提供给虚拟世界来连接真实世界和虚拟世界。它实现这一点的方式就像现实世界是虚拟世界的一部分,然后改变监视器的显示(伪装成看起来像窗户),以复制一个人在虚拟世界中存在时应该看到的视图。
想象一下你的虚拟世界。它并不一定会结束它,但是有一点你不再尝试将东西渲染到它中,所以让我们把这个世界包含在一个包含所有渲染元素的框中。现在,Winscape所做的就是让虚拟世界真正存在于现实世界中,并且您可以通过监视器看到它。
显然,第一步是创建您的虚拟世界。对于初学者,我建议只创建一个文字框。使每个墙都有不同的颜色,或在墙上放置颜色渐变。做一些简单的事。如果您还没有决定使用3D框架来处理这个问题,我建议使用XNA。它是与Cinect SDK一起使用的C#,它在线提供了大量的教程来帮助您。一旦你创建了你的世界,使用XNA将相机放在盒子里,并添加一些简单的控件来旋转相机。这将允许您从内部环顾框,以确保渲染按预期工作。
完成后,您需要决定将窗户放在哪里。这些将是您的3D场景的观点。为了演示这个概念,这里是我从XNA camera tutorial拍摄的一张照片。
请注意,如果您阅读实际教程,他们不会说与我完全相同的事情,因为我只是劫持图片来展示我的意思。所以,(0,0,0)点是你的眼睛"是。粉红色矩形代表你的窗口。看着窗户,从眼睛到粉红色窗户的角落画出四条线。这四条线向前延伸,直到它们与背景碰撞,形成绿色矩形。这将是您的眼睛可以透过窗户看到的矩形。
请注意,XNA实际上会为您处理很多这样的事情。您只需在虚拟场景中创建一个摄像头并移动它,进行一些数学运算直接将其对准您的窗口。您希望该摄像机以一种代表您在现实世界中的位置的方式进入虚拟空间。您可以使用Kinect获取与自身相关的真实世界坐标,然后配置应用程序以了解Kinect与窗口的关系。通过梳理这些数据,您可以获得与现实世界中的监视器相关的眼睛位置,并且由于监视器由虚拟世界中的窗口表示,因此您可以找出虚拟世界中存在的位置。因此,将虚拟摄像头放置在虚拟世界中的头部,将其指向窗口,并做一些魔术以确保摄像机仅查看窗口。
原始的半清晰咆哮:
好的,我要去拍这个(这差不多凌晨1点,所以让我知道如果我的工作不那么出色,我会回来的时候我醒了。)
首先,它涉及到我将要撇去的相当多的数学运算。你基本上有三层。
人----" Windows" (监视器)----场景
当然,这个场景并不存在。你必须将这个人融入虚拟世界,在这个虚拟世界中,场景(实际上只是一个平面图像)存在于墙后。人们可以看到所述场景的唯一方式是通过墙上的窗户,实际上是由显示器伪造的。
所以,数学来了。 Kinect可以计算出你在房间里的位置,更重要的是,你的头部在哪里。从这里你可以大致了解你的眼睛在哪里。您需要抓住这一点(您的眼睛)并将其转换为您在虚拟世界中使用的坐标。然后,计算那些眼睛应该能够通过虚拟窗口看到的内容。您可以通过从眼睛到窗口的每个角落投射线条来完成此操作,直到它到达场景"图片。每个窗口将对应于背景图片上的矩形区域。这个矩形是需要绘制到屏幕上的。
最棘手的部分是建立虚拟世界,几乎完全模仿现实世界。从本质上讲,很多配置("好吧,这个窗口在Kinect上方1.5米处......左边是0.25米......")。我也不确定你应该放多远的场景图片。如果我想到了什么,我会回过头来看看,但你可以尝试一下,找出适合你设置的距离。
等等,现在我知道为什么我无法弄清楚距离。这是因为该示例正在使用3D模拟。很漂亮。所以你只需要弄清楚你想在模拟中玩窗户的位置或其他什么。答案 1 :(得分:2)
根据您要使用的设置(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等)。