使用OpenCV'的外部摄像机校准;s-pnp函数

使用OpenCV'的外部摄像机校准;s-pnp函数,opencv,computer-vision,augmented-reality,camera-calibration,homography,Opencv,Computer Vision,Augmented Reality,Camera Calibration,Homography,我目前正在使用一个名为3DSlicer的医学成像程序开发一个增强现实应用程序。我的应用程序作为切片器环境中的一个模块运行,旨在提供使用外部跟踪系统来增强切片器中显示的摄影机提要所需的工具 目前,所有配置都是正确的,所以我所要做的就是自动计算相机的外部矩阵,我决定使用OpenCV的solvePnP()函数来完成。不幸的是,这给了我一些困难,因为我没有得到正确的结果 我的跟踪系统配置如下: 光学跟踪器的安装方式可以查看整个场景 跟踪标记严格地连接到指针工具、相机和模型,我们已经为其获取了虚拟表示

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

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

我的跟踪系统配置如下:

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

我得到了两组点,一个是2D,一个是3D。2D点是棋盘角点在像素坐标中的坐标,而3D点是这些相同角点相对于M的对应世界坐标。使用openCV的
detectchesboardcorners()
函数记录二维点和三维点的指针。然后,我将3D点从M空间转换为C空间,方法是将它们乘以C逆。这是因为
solvePnP()
函数要求相对于相机的世界坐标系描述3D点,在本例中,坐标系是C,而不是M

完成所有这些之后,我将点集传递到
solvePnp()
。不过,我得到的转变是完全错误的。老实说,我对自己做错的事感到茫然。让我更加困惑的是,OpenCV使用了与OpenGL不同的坐标格式,这也是3DSlicer的基础。如果有人能在这件事上提供一些帮助,我将不胜感激

还有,如果有什么不清楚的地方,请随时询问。这是一个相当大的项目,所以我很难将所有内容提炼成手头的问题。我完全期待着任何阅读本文的人都会感到困惑

谢谢大家!


更新1:原来我是个大白痴。我记录共线点只是因为我太没有耐心记录整个棋盘。当然,这意味着最小二乘回归几乎有无限的解,因为我只将解锁定到二维!现在,我的值更接近我的基本事实,事实上,旋转列似乎是正确的,只是它们完全不符合顺序。我不确定是什么原因导致了这种情况,但我的旋转矩阵似乎被镜像到了中心柱上。除此之外,我的翻译成分在应该是正的时候是负的,尽管它们的大小似乎是正确的。现在我基本上得到了所有正确的值,顺序都不对

镜像/旋转模糊

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

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


正如我上面所建议的,您可以经常使用有关场景的摄影机方向w.r.t.的先验信息来解决这种模糊性。然而,在更为动态的情况下,如果在目标可能仅部分可见的情况下需要进一步的自动化程度,那么最好使用一个目标,在该目标中,每个小角落都可以单独识别。我最喜欢的是Matsunaga和Kanatani的“2D条形码”,它使用具有唯一交叉比的正方形长度序列。请参阅论文。

欢迎使用镜像歧义。不过很容易解决-您基本上需要通过施加约束(1)场景位于摄影机前面,以及(2)棋盘轴的方向与您预期的方向一致来重新确定坐标帧的方向。这归结为将校准的变换乘以适当的(“手工构建”)旋转和/或镜像。噢,该死。你是说我应该手动操作转换,这样所有的东西都在正确的位置?我可以假设,由于镜像图像,这种问题在所有计算中都是一致的?这对我来说是有意义的。我将测试它,看看它如何影响结果!所以乘以180度旋转对任何轴都不起作用。为了演示这个问题,我提供了手动校准的地面真值外部变量,然后使用SolvePnP计算外部变量。我还扩展了数据集,以确保它不是局部极小值的问题。编辑:无法使用格式设置。在30分钟后,我会补充一个问题。我并没有说你特别的模糊度是180度-不看数据很难判断。建议你