我正在尝试将我的kinect校准到投影仪。我从微软研究中读到了一些关于他们如何做到这一点的论文。
深度相机必须正确识别四个点 位于投影机图像中,之后我们使用POSIT算法 [6]找到投影机的位置和方向。这个 过程需要焦距和投影中心 投影机。
(这将给出投影机的位置)
但是我真的不熟悉posit算法,当然也不知道如何在这里使用它。 Posit算法的结果是平移向量和旋转矩阵。现在我的问题是如何将它用于交互。
例如,如果我用kinect跟踪一只手,我会得到一些坐标(x,y)。如何使用所述平移和旋转矩阵在投影中找到相应的(x,y)坐标?
答案 0 :(得分:1)
基本上POSIT算法从至少四个非平面对应点估计物体相对于相机的位置。另一方面,投影机可以看作是一台摄像机,因此如果您在投影图像上识别出真实物体的已知点(已知投影焦距),则应该可以计算相对位置。
所以你应该做的是:
确定放置在投影机前面的某个物体上至少有四个点。您可以使用kinect计算点坐标。
然后你应该以与3d点相同的顺序在图像坐标系中识别投影图像上的那些点。
您可以使用OpenCV中的cvPosit函数来计算物体相对于相机的姿势。
比用kinect测量的3d空间中给出一些对象,可以计算应用cvPOSIT计算的变换的图像坐标。
算法使用的点可以满足一些特定的条件,所以 有关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
第4步澄清:
引用原始POSIT文件: “POSIT算法找到平移向量和变换矩阵,将对象变换到摄像机坐标系,使其特征点落在线上 看见图像点“
假设我们在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