我正在尝试将我的kinect校准到投影仪上。我已经阅读了Microsoft研究的几篇论文,介绍了它们如何做到这一点。



(这将给出投影仪的位置)

但是我真的不熟悉posit算法,当然也不熟悉它的用法。 Posit算法的结果是平移 vector 和旋转矩阵。现在我的问题是如何将其用于交互。

例如,如果我用Kinect跟踪一只手,我会得到一些坐标(x,y)。我如何使用所说的平移和旋转矩阵在投影中找到相应的(x,y)坐标?

最佳答案

基本上,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

    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
    

    10-08 11:49