使用Kinect的3D点进行梯形校正


15

使用XNA,我正在显示一个投影到地板上的简单矩形。投影机可以放置在任意位置。显然,投影的矩形会根据投影机的位置和角度而变形。Kinect会扫描地板以寻找四个角。现在,我的目标是对原始矩形进行变形,以使投影不再因基本对矩形进行预变形而变形。

我的第一种方法是在2D模式下做所有事情:首先计算透视变换(使用OpenCV的 warpPerspective()),从扫描的点到内部矩形的点,然后将逆应用于矩形。这似乎可行,但速度太慢,因为无法在GPU上渲染。

第二种方法是使用3NA进行所有操作,以便使用XNA的渲染功能。首先,我将显示一个平面,使用Kinect扫描其角并将接收到的3D点映射到原始平面。从理论上讲,我可以像在2D方法中一样,将透视变换的逆应用于平面。但是,由于XNA使用视图和投影矩阵,所以我不能只调用诸如之类的函数warpPerspective()并获得所需的结果。我需要为相机的视图和投影矩阵计算新参数。

问题:是否可以计算这些参数并将它们分为两个矩阵(视图和投影)?如果没有,我还有其他方法可以使用吗?


1
XNA使用View和Projection矩阵,但我认为最终结果=矢量*视图*投影。为什么不尝试使视图为单位矩阵并投影逆透视矩阵,看看是否可行?(不是100%肯定这是真的)
Roy T.

1
您是如何精确计算透视变换的warpPespective?我对OpenCV不熟悉,但是阅读文档后,似乎该功能只是视角应用于图像。还是我感到困惑?无论如何,也许在您的第一个实现中添加更多详细信息将有所帮助。
Laurent Couvidou 2012年

您可能想看一下PCL库(pointclouds.org)。从kinect转换深度图像会得到一个点云,相机位于原点,沿z轴指向。然后,您可以使用ransac或其他算法搜索飞机。
2012年

Answers:


1

由于矢量代数对GPU友好,因此可以使用归一化和点积来查找原始平面的四个角,如下所示:

在此处输入图片说明

给定投影仪点(P),投影点(B),包含扭曲矩形(Q)的平面上的一个任意点以及该平面的法向矢量(n),投影点的交点(A)从P到B的直线,则平面由

s = -dot_product(n, P - Q) / dot_product(n, normalized(B - P)) 
A = P + s * normalized(B-P)

来源http://geomalgorithms.com/a05-_intersect-1.html部分线平面相交

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.