【问题标题】:how do I re-project points in a camera - projector system (after calibration)如何重新投影相机中的点 - 投影仪系统(校准后)
【发布时间】:2014-04-12 22:58:15
【问题描述】:

我在互联网上看到了很多关于如何使用 openCV 进行相机 + 投影仪校准的博客文章和视频以及源代码,以生成 camera.ymlprojector.ymlprojectorExtrinsics.yml 文件。

我还没有看到有人讨论之后如何处理这些文件。确实,我自己已经进行了校准,但我不知道我自己的应用程序的下一步是什么。

假设我编写了一个应用程序,该应用程序现在使用相机 - 我校准的投影仪系统来跟踪对象并在其上投影某些东西。我将使用 contourFind() 从移动对象中获取一些兴趣点,现在我想将这些点(从投影仪!)投影到对象上!

我想要做的是(例如)跟踪对象的质心 (COM) 并在被跟踪对象的相机视图上显示一个点(在其 COM 处)。然后应该在对象的 COM 上实时投影一个点。

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

作为参数
  • 要重新投影的点向量(呵呵!)
  • 旋转+平移矩阵。我想我可以在这里使用projectorExtrinsics。或者我可以使用 composeRT() 函数从projectorExtrinsics(我在yml文件中有)和cameraExtrinsics(我没有)生成最终旋转和最终平移矩阵。附带问题:我应该不保存它们也在文件中??)。
  • 内在矩阵。现在这很棘手。我应该在这里使用相机还是投影仪内在矩阵?
  • 失真系数。我应该再次在这里使用投影仪还是相机系数?
  • 其他参数...

因此,如果我在projectPoints() 中使用投影仪或相机(哪一个??)内在函数 + 系数,那么我只会对 2 种仪器中的一种进行“校正”。我将在哪里/如何使用其他仪器的内在函数??

除了 load() yml 文件和 projectPoints() 之外,我还需要使用什么? (也许不失真?)

非常感谢您对此事的任何帮助。 如果有教程或书籍(不,O'Reilly “Learning openCV” 也没有谈论如何使用校准 yml 文件! - 只是关于如何进行实际校准),请指点我那个方向。我不一定需要一个确切的答案!

【问题讨论】:

  • 超级好问题。你能把你提到的一些关于如何找到projectorExtrinsics.yml的教程链接给我吗?

标签: c++ opencv camera projection


【解决方案1】:

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

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

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

使用两个摄像头和一个投影仪,这很容易:您可以在两个摄像头图像中跟踪感兴趣的对象,使用函数triangulatePoints 使用两个 2D 投影对它们的 3D 位置进行三角测量,以及最后使用projectPoints 将这个 3D 点投影到投影仪的 2D 坐标中,以便知道投影仪在哪里显示内容。

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

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

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

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

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

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

希望这会有所帮助。

【讨论】:

  • 您好,能否就这个问题多谈一点。在irc 或任何其他聊天室?我想知道如果我将 2d 点提供给 projectPoints 会发生什么。另外,您解释的第二种情况不是单应重投影吗?
  • @nass 让我们在StackOverflow chat room 中讨论这个问题。
  • 聊天室给我解析器错误,我不能发帖。可以继续下一个吗?
猜你喜欢
  • 2011-03-12
  • 2017-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
相关资源
最近更新 更多