- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在使用名为 3DSlicer 的医学成像程序开发增强现实应用程序。我的应用程序作为 Slicer 环境中的一个模块运行,旨在提供使用外部跟踪系统来增强 Slicer 中显示的相机源所需的工具。
目前,一切都已正确配置,所以我剩下要做的就是自动计算相机的外部矩阵,我决定使用 OpenCV 的 solvePnP()
函数来完成。不幸的是,这给我带来了一些困难,因为我没有获得正确的结果。
我的跟踪系统配置如下:
我获得了两组点,一组是 2D 的,一组是 3D 的。 2D 点是棋盘角点在像素坐标中的坐标,而 3D 点是这些相同角点相对于 M 的相应世界坐标。这些是使用 openCV 的 detectChessboardCorners()
函数记录的 2 维点和指针为 3 维。然后,我将 3D 点乘以 C 逆,将它们从 M 空间转换到 C 空间。这样做是因为 solvePnP()
函数要求相对于相机的世界坐标系描述 3D 点,在本例中是 C,而不是 M。
完成所有这些后,我将点集传递给 solvePnp()
。不过,我得到的转换是完全不正确的。老实说,我对自己做错了什么感到茫然。让我更加困惑的是,OpenCV 使用与 OpenGL 不同的坐标格式,而 OpenGL 正是 3DSlicer 所基于的坐标格式。如果有人可以在这件事上提供一些帮助,我将非常感激。
此外,如果有任何不清楚的地方,请随时询问。这是一个相当大的项目,所以我很难将所有内容提炼成手头的问题。我完全预料到阅读本文的人可能会感到有些困惑。
谢谢!
更新 #1:原来我是个大白痴。我记录共线点只是因为我没有耐心记录整个棋盘。当然,这意味着最小二乘回归有几乎无限的解,因为我只将解锁定为二维!我的值(value)观现在更接近我的基本事实,事实上,旋转列看起来是正确的,只是它们完全乱序了。我不确定是什么原因造成的,但似乎我的旋转矩阵在中心列上进行了镜像。除此之外,我的翻译组件在应该为正时却为负,尽管它们的大小似乎是正确的。所以现在我基本上以错误的顺序获得了所有正确的值。
最佳答案
镜像/旋转模糊。
您基本上需要通过施加以下约束来重新定向您的坐标系:(1) 场景在相机前面,(2) 棋盘轴的方向与您预期的一样。这归结为乘以您的校准变换以进行适当的(“手工构建”)旋转和/或镜像。
基本问题是您使用的校准目标 - 即使看到所有角,也至少有 180^ 度的旋转模糊度,除非使用颜色信息。如果遗漏了一些角落,事情会变得更加奇怪。
您通常可以使用有关相机方向的先验信息 w.r.t.正如我在上面所建议的那样,解决这种歧义的场景。然而,在更动态的情况下,如果在目标可能仅部分可见的情况下需要更高程度的自动化,您最好使用可以单独识别每个小块角的目标。我最喜欢的是 Matsunaga 和 Kanatani 的“二维条形码”,它使用具有独特交叉比的方形长度序列。见论文 here .
关于opencv - 使用 OpenCV 的 solvePnP 函数进行外部相机校准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32704432/
使用 Kinect for Windows SDK,校准相机的最简单方法是什么? 我找到了这篇可爱的博文 http://nicolas.burrus.name/index.php/Research/K
我最初在 OpenCV 论坛上发布了这个,但不幸的是,我没有得到太多的意见/回复,所以我在这里发布是希望有人可能有方向建议? 我正在使用 Bumblebee XB3 立体相机,它有 3 个镜头。我花了
当移动很远的距离时,比如去另一个城市,关闭 GPS,打开它需要很长时间才能找到第一个正确的点。 因此,如果我通过示例注册到 gps 提供程序,则可能需要 10 分钟才能收到第一个 onLocation
在我的应用中,我使用加速度计来控制游戏中的角色。现在我只允许纵向,所以用户必须向右或向左倾斜设备才能移动角色。到目前为止一切正常。我现在想要完成的是“校准”加速度计以考虑用户正在玩的当前倾斜度。假设用
我使用 2 个 CANON EOS60d 作为立体设置来进行摄影测量。我正在使用 OpenCV 使用高精度 Circlegrid 校准模式校准两个相机。我正在使用信号发生器同时触发两个相机,早些时候我
我花了很长时间才让函数在 OpenCV 中运行,所以我想知道我的总体计划是否有意义,然后再深入研究尝试实现它的细节。 (2.3.1、Windows 7、C++)如果有任何建议,我将不胜感激。 问题:
我注意到 h2o.ai 套件的一个相对较新的添加,能够执行补充 Platt Scaling 以改进输出概率的校准。 (请参阅 calibrate_model in h2o manual 。)不过,在线
我正在尝试在 STM32F042 微 Controller 上读取 VDDA。我在 VDD 为 3.29V 时得到了意想不到的结果。我一定缺少一些基本的东西。 输出: VREFINT=1917; VR
请原谅我对编码完全陌生。首先,出于该项目的目的,我正在使用 Python 绑定(bind)到 OpenCV 的库。 我的相机已针对显示鱼眼失真进行了校准。我分别获得了 K 和 D 的以下值,即固有相机
如何使用 Netbeans 8.1 进行 JDK 校准。我用谷歌搜索了一些并找到了这个链接 here . It says "choose Profile > Advanced Commands > R
我目前正在开发增强现实应用程序。目标设备是光学透视 HMD,我需要校准其显示器以实现虚拟对象的正确注册。我用过那个implementation of SPAAM对于 android 来说,结果对于我的
我是一名优秀的程序员,十分优秀!