在我们目前的项目中,我们使用安装在用户头部顶部的深度相机来识别手指,手和触摸事件。这非常有效,并且已经可以用作新型输入设备。
我们的下一步是使用增强现实眼镜在用户的手掌上显示按钮/控件。对于这一步,我们需要对我们公认的数据(指尖,掌角四角形的角点)进行转换,以将它们显示在增强现实眼镜的正确位置上。 在未来,我们将使用真正的3D输出场景,但是现在我们只是用眼镜显示2D图像。 您可以将整个设置想象为立体视图,深度摄像头和用户眼睛作为摄像头。
为了获得变换矩阵,我们在输出图像上连续显示一个随机点,并且用户必须将他的指尖保持在该位置上。由此,我们得到输入图像(深度相机)和输出图像(增强现实眼镜)之间的点对应关系。我们目前使用其中的20个对应关系,然后使用Emgu的FindHomography()方法获得转换矩阵。
对于我们的第一次努力,这已经可行,但它并不完美。我们应该如何才能获得更好的结果?
我们拥有什么:
我们需要什么:
将相对于我们的深度相机的2D像素坐标或3D坐标映射到输出图像的方法(现在为2D,也可能是以后的3D)。
问题:
我们应该在这里使用什么类型的转型? FindHomography(),GetPerspectiveTransformation(),fundamentalMatrix?,essentialMatrix?
非常感谢任何帮助/建议。提前谢谢!
答案 0 :(得分:0)
Fist,FindHomography(),GetPerspectiveTransformation()是相同的转换,除了前者在Ransac框架中稍后重复尝试。它们匹配平面之间的点,因此不适合您的3D任务。 FundamentalMatrix和essentialMatrix不是转换,它们是你听到的流行语;)。如果您尝试将虚拟对象从相机系统重新投影到眼镜的角度,您只需将3D中的旋转和平移应用到对象坐标,然后重新投影它们。
步骤顺序为:
1.使用立体相机找到地标(比如你的手)的3D坐标;
2.将您的控件靠近3D空间中的地标(某些虚拟按钮?);
3.计算每个护目镜视点w.r.t立体摄像机的相对平移和旋转;例如,您可能会发现右侧护目镜焦点位于立体摄像机右侧3厘米处,并围绕y轴旋转10度;重要的是,左右护目镜焦点将在空间中移动,这会在重新投影期间产生图像差异(深度越大,差异越小),您的大脑将其解释为深度的立体声提示。请注意,还有很多其他深度提示(例如模糊,透视,已知尺寸,眼睛的聚散等),这些提示可能与视差提示一致或不一致。
4.将视点变换的逆应用于虚拟3d对象;例如,如果观察者护目镜向右移动(wrt立体摄像机),它就像一个向左移动的物体;
5.将这些新的3D坐标投影到图像中,如col = xf / z + w / 2和row = h / 2-yf / z;使用openGL有助于使投影看起来更好。