【问题标题】:Extrinsic Camera Calibration Using OpenCV's solvePnP Function使用 OpenCV 的 solvePnP 函数进行外部相机校准
【发布时间】:2015-12-18 16:43:31
【问题描述】:

我目前正在使用名为 3DSlicer 的医学成像程序开发增强现实应用程序。我的应用程序作为 Slicer 环境中的一个模块运行,旨在提供使用外部跟踪系统增强 Slicer 中显示的摄像头馈送所需的工具。

目前,一切都已正确配置,因此我剩下要做的就是自动计算相机的外在矩阵,我决定使用 OpenCV 的solvePnP() 函数来完成。不幸的是,这给我带来了一些困难,因为我没有获得正确的结果。

我的跟踪系统配置如下:

  • 光学跟踪器的安装方式可以查看整个场景。
  • 跟踪标记严格连接到指针工具、相机和我们已为其获取虚拟表示的模型。
  • 指针工具的尖端是使用枢轴校准注册的。这意味着使用指针记录的任何值都指示指针尖端的位置。
  • 模型和指针都具有 3D 虚拟表示,可增强实时视频源,如下所示。
  • 指针和相机(以下称为 C)标记各自返回一个齐次变换,该变换描述了它们相对于附加到模型的标记(以下称为 M)的位置。模型的标记,即原点,不返回任何转换。

我获得了两组点,一组 2D 和一组 3D。 2D 点是以像素坐标表示的棋盘角的坐标,而 3D 点是这些相同角相对于 M 的对应世界坐标。这些点是使用 openCV 的 detectChessboardCorners() 函数记录 2 维点和指针 3维度。然后我将 3D 点从 M 空间转换为 C 空间,方法是将它们乘以 C 逆。这是因为 solvePnP() 函数要求 3D 点相对于相机的世界坐标系进行描述,在这种情况下是 C,而不是 M。

完成所有这些后,我将点集传递给solvePnp()。不过,我得到的转变是完全不正确的。老实说,我为自己做错了什么而不知所措。更令我困惑的是,OpenCV 使用与 OpenGL 不同的坐标格式,这是 3DSlicer 所基于的。如果有人可以在这件事上提供一些帮助,我将非常感激。

另外,如果有任何不清楚的地方,请随时询问。这是一个相当大的项目,所以我很难将所有内容提炼到手头的问题上。我完全希望阅读本文的人可能会感到有些困惑。

谢谢!

更新#1:原来我是个大白痴。我记录共线点只是因为我太不耐烦了,无法记录整个棋盘。当然,这意味着最小二乘回归有几乎无限的解决方案,因为我只将解决方案锁定为二维!我的价值观现在更接近我的基本事实,事实上,旋转柱似乎是正确的,只是它们完全不正常。我不确定是什么导致了这种情况,但似乎我的旋转矩阵反映在中心列上。除此之外,我的翻译成分在应该是积极的时候却是消极的,尽管它们的大小似乎是正确的。所以现在我基本上得到了所有错误顺序的所有正确值。

【问题讨论】:

  • 欢迎镜像歧义。不过很容易解决 - 您基本上需要通过施加以下约束来重新定向您的坐标系:(1) 场景在相机前面,(2) 棋盘轴的方向与您期望的一样。这归结为将您的校准变换乘以适当的(“手工构建”)旋转和/或镜像。
  • 天哪。所以你是说我应该手动操作转换,以便一切都在正确的位置?我可以假设由于图像的镜像,这种问题在所有计算中都是一致的?

标签: opencv computer-vision augmented-reality camera-calibration homography


【解决方案1】:

镜像/旋转模糊。

您基本上需要通过施加以下约束来重新定向您的坐标系:(1) 场景在相机前面,(2) 棋盘轴的方向与您期望的一样。这归结为将您的校准变换乘以适当的(“手工构建”)旋转和/或镜像。

基本问题是您使用的校准目标 - 即使看到所有角,也至少具有 180^ 度的旋转模糊度,除非使用颜色信息。如果错过了一些角落,事情会变得更加奇怪。

您通常可以使用有关相机方向 w.r.t 的先验信息。正如我上面建议的那样,解决这种歧义的场景。但是,在更动态的情况下,如果在目标可能仅部分可见的情况下需要进一步的自动化程度,则最好使用可以单独识别每个小块角的目标。我最喜欢的是 Matsunaga 和 Kanatani 的“二维条码”,它使用具有独特交叉比率的正方形长度序列。见论文here

【讨论】:

  • 对我来说很有意义。我会测试一下,看看它是如何影响结果的!
  • 所以乘以 180 度旋转在任何轴上都不起作用。为了演示这个问题,我提供了手动校准的地面实况外在参数,然后是使用 SolvePnP 计算的外在参数。我还扩展了数据集以确保它不是局部最小值的问题。编辑:无法使格式正常工作。将在大约 30 分钟后更新问题。
  • 我并没有说您的特殊歧义是 180^ 度 - 不查看数据很难判断。建议您可视化与相机框架相关的旋转矩阵(彩色铅笔和橡胶圈有帮助)。请记住,您获得的旋转是世界到相机的,即旋转矩阵的列是世界(即目标)坐标系的相机框架中的组件。
  • 只是一个更新,我发现 SolvePnP 假设 z 轴进入相机,因为如果相机以其他方式旋转,则相机无法看到棋盘。但是,由于该问题现在超出了原始问题的范围,因此我写了一个新问题(如果您想试一试,请在下面链接),我会接受您的回答! stackoverflow.com/questions/32851702/…
猜你喜欢
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 2015-07-04
  • 1970-01-01
  • 2012-01-26
  • 2013-01-28
相关资源
最近更新 更多