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

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

我的第一个方法是在2D中做所有事情:首先从扫描的点到内部矩形的点计算透视变换(使用OpenCV的warpPerspective() ),并将矩形的逆应用于矩形。 这似乎工作,但速度太慢,因为它不能在GPU上呈现。

第二种方法是为了使用XNA的渲染function,在3D中做所有事情。 首先,我将显示一个平面,使用Kinect扫描角点,并将接收到的3D点映射到原始平面。 理论上,我可以将透视变换的逆应用到平面上,就像我在2D方法中所做的那样。 但是,由于XNA与视图和投影matrix一起工作,我不能只调用warpPerspective()类的函数并获得所需的结果。 我需要计算相机视图和投影matrix的新参数。

问题:是否可以计算这些参数并将它们分解为两个matrix(视图和投影)? 如果没有,是否有另一种方法可以使用?

由于vector代数是GPU友好的,可以使用标准化和点积来find原始平面的四个角落,如下所示:

在这里输入图像描述

给定投影点(P),投影点(B),包含扭曲矩形(Q)的平面上的任意一点以及该平面的法向vector(n),投影点从P到B的线,飞机是由

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

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