如何在相机 - 投影仪系统中重新投影点(校准后)

nas*_*ass 6 c++ camera opencv projection

我见过很多的博客文章和视频,并源折轴有关如何使用OpenCV的执行相机+投影机标定在互联网上,以生产camera.yml,projector.ymlprojectorExtrinsics.yml文件.

我之后还没有看到有人讨论如何处理这些文件.事实上,我自己做过校准,但我不知道自己应用程序的下一步是什么.

假设我编写的应用程序现在使用相机 - 我校准的投影仪系统来跟踪对象并在其上投影.我将使用contourFind()从移动物体中抓取一些感兴趣的点,现在我想将这些点(从投影仪!)投射到物体上!

我想要做的是(例如)跟踪对象的质心(COM)并在跟踪对象的摄像机视图上显示一个点(在其COM处).然后应该在物体的COM上实时投射一个点.

这似乎projectPoints()是我在加载yml文件后应该使用的openCV函数,但我不确定如何考虑相机和投影仪的所有内在和外在校准值.即,projectPoints()需要作为参数

  • 矢量点重新投射(呃!)
  • 旋转+平移矩阵.我想我可以在这里使用projectorExtrinsics.或者我可以使用composeRT()函数从projectorExtrinsics(我在yml文件中)和cameraExtrinsics(我没有)生成最终旋转和最终翻译矩阵.旁边问题:我不应该保存它们在一个文件??).
  • 内在矩阵.现在这很棘手.我应该在这里使用相机还是投影仪内在函数矩阵?
  • 失真系数.我应该再次使用投影机或相机系数吗?
  • 其他参数......

因此,如果我使用投影仪或相机(哪一个??)内在函数+系数projectPoints(),那么我只会'纠正'2个乐器中的一个.我在哪里/如何使用对方的内在函数?

除了load()yml文件之外我还需要使用 projectPoints()什么?(也许是不成正比的?)

非常感谢任何有关此事的帮助.如果有教程或书籍(不,O'Reilly"学习openCV"也没有谈论如何使用校准yml文件! - 仅关于如何进行实际校准),请指出我的方向.我不一定需要一个确切的答案!

BCo*_*nic 4

首先,您似乎对相机/投影仪模型的一般作用感到困惑:它的作用是将 3D 世界点映射到 2D 图像点。这听起来很明显,但这意味着给定外部参数 R,t(用于方向和位置)、畸变函数 D(.) 和内部参数 K,您可以针对该特定相机推断 3D 点 M 的 2D 投影 m,如下所示: = KD(R.M+t)。对于每个输入 3D 点,该projectPoints函数正是执行此操作(即 3D 到 2D 投影),因此您需要为其提供与希望投影 3D 点的相机关联的输入参数(如果您想要投影仪 2D 坐标,则为投影仪 K&D,相机 K&D(如果您想要相机 2D 坐标)。

其次,当您联合校准相机和投影仪时,您不会估计相机的一组外参 R,t 和投影仪的另一组外参 R,t,而只估计一个 R 和一个 t,它们代表相机和投影仪之间的旋转和平移。坐标系。例如,这意味着假设您的相机的旋转 = 恒等和平移 = 0,并且投影仪的旋转 = R 和平移 = t (或相反,取决于您如何进行校准)。

现在,关于您提到的应用程序,真正的问题是:如何估计给定点的 3D 坐标?

使用两台相机和一台投影仪,这将很容易:您可以跟踪两个相机图像中感兴趣的对象,使用函数使用两个 2D 投影对它们的 3D 位置进行三角测量,最后使用in ordertriangulatePoints在投影仪 2D 坐标中投影这个 3D 点projectPoints了解投影仪在哪里显示内容。

仅使用一台摄像机和一台投影仪,这仍然是可能的,但更加困难,因为您无法仅根据一次观察对跟踪点进行三角测量。基本思想是像稀疏立体视差估计问题一样处理该问题。一种可能的方法如下:

  1. 使用投影仪投射清晰的图像(例如黑白噪声),以便对相机观察到的场景进行纹理化。

  2. 和以前一样,跟踪相机图像中感兴趣的对象

  3. 对于每个感兴趣的对象,将相机图像中其位置周围的小窗口与投影仪图像相关联,以便找到它在投影仪 2D 坐标中的投影位置

stereoRectify另一种方法与上面使用校准参数的方法不同,可以使用和StereoBM::operator()(或gpu::StereoBM_GPU::operator()对于 GPU 实现)进行密集 3D 重建,使用估计的场景深度将跟踪的 2D 位置映射到 3D,最后投影到投影仪使用projectPoints.

无论如何,使用两个摄像头更容易、更准确。

希望这可以帮助。