我正在尝试将我的kinect校准到投影仪上。我已经阅读了Microsoft研究的几篇论文,介绍了它们如何做到这一点。
(这将给出投影仪的位置)
但是我真的不熟悉posit算法,当然也不熟悉它的用法。 Posit算法的结果是平移 vector 和旋转矩阵。现在我的问题是如何将其用于交互。
例如,如果我用Kinect跟踪一只手,我会得到一些坐标(x,y)。我如何使用所说的平移和旋转矩阵在投影中找到相应的(x,y)坐标?
最佳答案
基本上,POSIT算法从至少四个非平面对应点估计对象相对于相机的位置。另一方面,可以将投影仪看作是一台摄像机,因此,如果您在投影图像上识别出真实物体的已知点(已知投影焦距),则应该可以计算相对位置。
因此,您应该做的是:
算法使用的积分可能会满足一些特定条件,因此
请参阅以下内容以更深入地了解POSIT:
http://www.cfar.umd.edu/~daniel/daniel_papersfordownload/Pose25Lines.pdf
以下是指向opencv posit相关文档的链接:
http://opencv.willowgarage.com/documentation/camera_calibration_and_3d_reconstruction.html#posit
http://opencv.willowgarage.com/documentation/camera_calibration_and_3d_reconstruction.html#createpositobject
http://opencv.willowgarage.com/documentation/camera_calibration_and_3d_reconstruction.html#releasepositobject
步骤4的说明:
引用原始POSIT论文:
“POSIT算法找到将对象转换到相机坐标系上的平移 vector 和转换矩阵,以使其特征点落在直线上
图像点的视线”
假设我们在Kinect坐标系中有n个3d点(kPoints),我们具有POSIT的旋转(r [3] [3])和平移(t [3]),投影机图像平面的焦距,最后我们知道与POSIT一起使用的第一个3D点的坐标(kOrigin)。
然后我们需要将点转换为POSIT坐标系:
kPoints[i] = kPoints[i] - kOrigin;
kPoints[i] = Rotate(kPoints[i], r);
kPoints[i] = kPoints[i] + t;
imagePoint[i].x = focalLength * kPoints[i].x/kPoints[i].z
imagePoint[i].y = focalLength * kPoints[i].y/kPoints[i].z