使用两个校准相机进行 3D 重建 - 该管道中的错误在哪里?

2023-12-26

有很多关于从已知内部校准的立体视图进行 3D 重建的帖子,其中一些是出色的 https://stackoverflow.com/questions/16639106/camera-motion-from-corresponding-images。我读过一篇lot其中,根据我所读到的内容,我尝试使用下面的管道/算法来计算我自己的 3D 场景重建。我将列出方法,然后在底部提出具体问题。

0. 校准您的相机:

  • This means retrieve the camera calibration matrices K1 and K2 for Camera 1 and Camera 2. These are 3x3 matrices encapsulating each camera's internal parameters: focal length, principal point offset / image centre. These don't change, you should only need to do this once, well, for each camera as long as you don't zoom or change the resolution you record in.
  • 离线执行此操作。不要争吵。
  • 我在用着OpenCV http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html's CalibrateCamera()和棋盘例程,但此功能也包含在Matlab相机标定工具箱 http://www.vision.caltech.edu/bouguetj/calib_doc/。 OpenCV 例程似乎运行良好。

1. 基本矩阵F:

  • 现在您的相机已设置为立体声设备。使用两个图像/视图之间的点对应关系确定该配置的基本矩阵 (3x3)。
  • 如何获得对应信息取决于您,并且在很大程度上取决于场景本身。
  • 我正在使用 OpenCVfindFundamentalMat()得到 F,它提供了许多明智的选项(8 点算法、RANSAC、LMEDS)。
  • 您可以通过将结果矩阵代入基本矩阵的定义方程来测试它:x'Fx = 0其中 x' 和 x 是原始图像点对应关系(x, y)在齐次坐标中(x, y, 1)并且三个向量之一被转置,使得乘法有意义。每个对应关系越接近零,F 就越服从其关系。这相当于检查导出的 F 实际上从一个图像平面映射到另一个图像平面的效果如何。使用 8 点算法,我得到的平均偏转约为 2px。

2. 基本矩阵E:

  • 直接根据 F 和校准矩阵计算基本矩阵。
  • E = K2TFK1

3. E 的内部约束:

  • E应该遵守一定的约束。特别地,如果通过 SVD 分解为USV.t那么它的奇异值应该是 =a, a, 0。 S 的前两个对角线元素应该相等,第三个为零。
  • 我很惊讶地读到here https://stackoverflow.com/questions/16639106/camera-motion-from-corresponding-images如果在测试时情况并非如此,您可能会选择从先前的分解中构造一个新的基本矩阵,如下所示:E_new = U * diag(1,1,0) * V.t这当然保证遵守约束。您基本上人为地设置了 S = (100,010,000)。

4.全相机投影矩阵:

  • There are two camera projection matrices P1 and P2. These are 3x4 and obey the x = PX relation. Also, P = K[R|t] and therefore K_inv.P = [R|t] (where the camera calibration has been removed).
  • The first matrix P1 (excluding the calibration matrix K) can be set to [I|0] then P2 (excluding K) is R|t
  • 根据 E 的分解计算两个摄像机之间的旋转和平移 R, t。有两种可能的方法来计算 R (U*W*V.t and U*W.t*V.t)和两种计算 t(±U 的第三列)的方法,这意味着有四种组合Rt,只有其中之一有效。
  • Compute all four combinations, and choose the one that geometrically corresponds to the situation where a reconstructed point is in front of both cameras. I actually do this by carrying through and calculating the resulting P2 = [R|t] and triangulating the 3d position of a few correspondences in normalised coordinates to ensure that they have a positive depth (z-coord)

5. 3D 三角测量

  • Finally, combine the recovered 3x4 projection matrices with their respective calibration matrices: P'1 = K1P1 and P'2 = K2P2
  • 并相应地对每个 2d 点对应的 3 空间坐标进行三角测量,为此我使用 LinearLS 方法here http://www.morethantechnical.com/2012/01/04/simple-triangulation-with-opencv-from-harley-zisserman-w-code/.

问题:

  • 该方法是否存在任何遗漏和/或错误?
  • 我的 F 矩阵显然是准确的(与典型坐标值相比,映射中的偏转为 0.22%),但是当测试 E 时x'Ex = 0 using 归一化图像对应映射中的典型误差 > 归一化坐标本身的 100%。正在测试 ExEx = 0有效,如果是的话,错误跳转从何而来?
  • 使用 RANSAC 时,我的基本矩阵估计的误差比 8pt 算法严重得多,在 x 和 x' 之间的映射中为 ±50px。这让我深感担忧。
  • “强制执行内部约束”对我来说仍然很奇怪 - 仅从原始矩阵的部分分解中制造一个新的基本矩阵怎么可能有效?
  • 有没有比计算 P 和对一些归一化坐标进行三角测量更有效的方法来确定使用 R 和 t 的组合?
  • 我的最终重投影误差是 720p 图像中的数百个像素。我是否可能会关注校准、P 矩阵确定或三角测量中的问题?

我的基本 matr1ix 估计的错误明显更严重 当使用RANSAC比8pt算法时,之间的映射±50px x 和 x'。这让我深感担忧。

使用8pt算法并不排除使用RANSAC原理。 直接使用8pt算法时使用哪些点?你必须自己选择8(好)分。

理论上,您可以从任何点对应关系计算基本矩阵,并且通常会得到退化基本矩阵,因为线性方程不是独立的。另一点是,8pt 算法使用超定线性方程组,因此单个异常值将破坏基本矩阵。

您是否尝试过使用 RANSAC 结果?我敢打赌它代表了 F 的正确解决方案之一。

我的 F 矩阵显然是准确的(映射中的偏转为 0.22%) 与典型坐标值相比),但是当测试 E 时 x'Ex = 0 使用归一化图像对应的典型误差 该映射大于标准化坐标本身的 100%。是 测试 E 对 xEx = 0 是否有效,如果是这样,错误跳转在哪里 来自(哪里?

同样,如果 F 退化,则 x'Fx = 0 可以对每个点进行对应。

E不正确的另一个原因可能是相机的切换(K1T * E * K2而不是K2T * E * K1)。请记住检查:x'Ex = 0

“加强内部约束”对我来说仍然很奇怪 - 仅从其中制造一个新的基本矩阵如何有效? 原来的部分分解了?

Hartley 和 Zisserman 的“计算机视觉中的多视图几何”对此进行了解释。据我所知,这与 F 的弗罗贝尼乌斯范数的最小化有关。

你可以Google一下,里面有pdf资源。

有没有更有效的方法来确定 R 和 t 的组合 使用比计算 P 和三角测量一些归一化 坐标?

据我所知没有。

我的最终重投影误差是 720p 图像中的数百个像素。是 我可能会关注校准、确定中的问题 P 矩阵还是三角剖分?

您的刚体变换 P2 不正确,因为 E 不正确。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用两个校准相机进行 3D 重建 - 该管道中的错误在哪里? 的相关文章

  • 二值图像中骨架上两点之间的最短路径

    我有一个二进制图像 其中包含图像的一个像素宽度骨架 您可能基本上知道 在这个二值图像中 我在骨架上有 1 在其他地方有 0 如何找到骨架上两个非零元素之间的最短距离 路径也应该在骨架本身上 我想使用 A star 算法的 C 实现 我找到了
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

    我正在使用 OpenCV 4 0 和 Python 3 7 创建延时视频 构造 VideoWriter 对象时 文档表示 Size 参数应该是一个元组 当我给它一个元组时 它拒绝它 当我尝试用其他东西替换它时 它不会接受它 因为它说参数不是
  • 是否可以在 PyScript 中使用 OpenCV 模块?

    我想使用 opencv 模块 但无法导入 OpenCV 那么我该如何解决这个问题呢 顺便说一句 Pyodide 支持 OpenCV 示例代码 https i stack imgur com ahwex jpg 尚不支持 OpenCV 此时O
  • OpenCV VideoWriter 未写入 Output.avi

    我正在尝试编写一段简单的代码来获取视频 裁剪视频并写入输出文件 系统设置 OS Windows 10 Conda Environment Python Version 3 7 OpenCV Version 3 4 2 ffmpeg Vers
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • Python:Urllib2 和 OpenCV

    我有一个程序 可以将图像保存在本地目录中 然后从该目录中读取图像 但我不想保存图像 我想直接从url读取它 这是我的代码 import cv2 cv as cv import urllib2 url http cache2 allposte
  • iphone opencv - 模板匹配

    我已经在我的 iphone 项目中实现了这个 OpenCV 构建 http aptogo co uk 2011 09 opencv framework for ios http aptogo co uk 2011 09 opencv fra
  • 开放简历fisherfaces

    我有这个问题 当我使用 vs2010 调试 opencv 2 4 0 facetec demo c 运行时 程序出现此错误 OpenCV错误 未知函数中图像步长错误 矩阵不连续 因此其行数无法更改 文件 src opencv modul e
  • opencv_contrib编译错误:类没有成员

    我必须实现 SURF 算法来进行图像拼接 我在使用列出的库时遇到了问题here https stackoverflow com questions 33560251 opencv 3 0 0 ubuntu 14 04 nonfree non
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命
  • HoughLinesP后如何合并线?

    My task is to find coordinates of lines startX startY endX endY and rectangles 4 lines Here is input file 我使用下一个代码 img c
  • 选择合适的IDE

    您会推荐使用以下哪种 IDE 语言来在 Windows 下开发涉及识别手势并与操作系统交互的项目 我将使用 OpenCV 库来执行图像处理任务 之后 我将使用 win32 API 或 NET 框架与操作系统交互 具体取决于您建议的工具 性能
  • java.lang.UnsatisfiedLinkError:java.library.path中没有opencv_java2411

    我正在尝试将 opencv 添加到我的 Spring Boot Maven 项目中 为了使用 opencv 库 我必须在 java library path 中提供本机库 我已将以下命令添加到 Eclipse VM 参数中 Djava li
  • 使用 OpenCV 进行图像模糊检测

    我正在研究图像的模糊检测 我已经用过拉普拉斯方法的方差在 OpenCV 中 img cv2 imread imgPath gray cv2 cvtColor img cv2 COLOR BGR2GRAY value cv2 Laplacia
  • Weka - 探索者和实验者结果之间的差异

    我只是想知道为什么正确分类的百分比与 Weka 的探索者和实验者方面不同 我已检查以确保使用 10 交叉折叠验证以及所有其他参数 有人有主意吗 Thanks 当我在 Weka 邮件列表上给马克 霍尔 Mark Hall 发送电子邮件时 我已
  • Opencv 对象检测:ORB GPU 检测器和 SURF GPU 描述符提取器

    我只是做了一个小实验来尝试不同的检测器 描述符组合 我的代码使用 ORB GPU 检测器来检测特征 并使用 SURF GPU 描述符来计算描述符 我使用 BruteForceMatcher GPU 来匹配描述符 并使用 knnMatch 方
  • 如何在python 3.8中安装opencv-python

    我在 pycharm 中安装 opencv python 时遇到问题 打开 pycharm 后 我单击 设置 然后单击 项目解释器 单击 并搜索正确的模块 我开始安装 但失败了 Could not find a version that s
  • 针对不同处理器架构的 Gradle android 构建

    我想使用 Gradle 为 4 个不同的 Android CPU 处理器架构 armeabi armeabi v7a x86 mips 构建 4 个单独的 apk 我有为 4 个 CPU 架构构建的本机 OpenCV 库libs folde
  • 如何选择图像插值方法? (Emgu/OpenCV)

    Emgu OpenCV的 net包装器 提供的图像调整大小功能可以使用四种插值方法中的任意一种 http www emgu com wiki files 1 4 0 0 html 596dd03d 301e d3c6 4c53 c42855

随机推荐

  • CFML 使用哪个版本的 Hibernate?

    The 休眠文档 http hibernate org orm documentation 有时指不同版本之间的差异 ColdFusion 10 使用哪些版本的 Hibernate ColdFusion 9 中也是这样吗 Railo 稳定版
  • 无法使用 Nest.js 设置 cookie

    我创造了 sign in端点基本上返回带有 2 个令牌的对象 刷新令牌和访问令牌 Post sign in signIn Body signInUserDto SignInUserDto Promise
  • 使用 ASP.NET (C#) 在页面之间传递变量,而不使用 QueryString

    寻求有关在不使用 QueryString 的情况下在页面之间传递变量的建议 诸如 Google 之类的网络爬虫会捕获 URL 中的查询字符串 我正试图摆脱使用它 是否有另一种建议的方法来传递变量 我考虑过使用会话变量 但这只是为了简单地将变
  • VS2010 和 VS2012 之间的二进制 C++ 库兼容性?

    我对 VS2010 和 VS2012 之间编译库的二进制兼容性感到困惑 我想迁移到 VS2012 但是许多闭源二进制 SDK 仅适用于 VS2010 例如用于连接硬件设备的 SDK 传统上 据我所知 Visual Studio 对编译器版本
  • 根据 python pandas 中的行值合并两个数据框

    我在 pandas 中有两个数据框 如下所示 df1 df2 Column1 Column2 Column3 ColumnA ColumnB ColumnC 0 a x x 0 c y y 1 c x x 1 e z z 2 e x x 2
  • BigInteger.valueOf() 对于非常大的数字?

    在 Java 中将 50 位字符串转换为 BigInteger 的最佳方法是什么 它没有 valueOf String 方法 而且我无法转换为 Long 因为它太小了 它确实有一个BigInteger String http java su
  • 调暗/模糊父布局背景

    这里有与上面主题相同的问题 但没有得到答案 我这里有一个布局 我需要在顶部布局中使用与底部布局相同的图像 但具有模糊样式 设置 alpha 没有帮助 文本视图也会影响 如何模糊向下布局的背景 此处为 XML
  • Windows 任务调度程序用于调度代码重复运行的可靠性如何?

    我有一些代码需要驻留在 Windows Server 2003 计算机上并每分钟运行一次 建议的处理方法是什么 是否可以将其设计为控制台服务并让任务调度程序每分钟都执行它 这可能吗 我应该把它吸收并把它写成一个 Windows 服务吗 由于
  • 有没有办法测量重复代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种与语言无关的代码复制工具 找到特定于语言的代码重复工具 适用于 Java C PHP 很
  • dFdxFine 和 dFdxCoarse 之间的区别

    来自 OpenGL 文档 dFdxFine 和 dFdyFine 使用基于当前片段及其直接邻居的 p 值的局部差分来计算导数 dFdxCoarse 和 dFdyCoarse 使用基于当前片段邻居的 p 值的局部差分来计算导数 并且可能但不一
  • EF6:使用数据库优先方法进行全文搜索

    我找到了这个link http www entityframework info Home FullTextSearch使full text search解决linq 然而 该代码似乎是针对database first approach 如
  • 正则表达式抓取表单标签内容不起作用

    我正在尝试使用 preg match all 获取表单标签内的内容 标签 这是正则表达式
  • 确定 xsl-fo 中的最后一页位置

    我们能否以某种方式确定 XSL FO 中最后一页的位置 如果我只想将页脚放在最后一页 那么该怎么做呢 由于输入数据会变化并且不是静态的 因此 根据数据的不同 可以出现任意数量的页面 希望 还不算太晚 但无论如何 对于所有感兴趣的人 创建页面
  • 为什么 -didselectRowAtIndexPath 没有被调用?

    我创建了一个新项目 Xcode 4 Master Detail 应用程序 只是为了看看我是否做错了什么 但我仍然遇到同样的问题 我想打电话 reloadData当用户取消选择一个单元格 所以这是我的代码 void tableView UIT
  • 企业分发签名 - 谁做的以及为什么?

    作为我们 ISV 公司的一部分 我正在开发一款 iOS 应用程序 我们正在使用 Xamarin iOS 但我希望这对于这个问题来说并不重要 我们的一些将获得该应用程序的客户正在使用 MDM AirWatch 来管理设备并在其设备上安装该应用
  • Ruby:使用字符串插值进行评估

    我不明白 为什么eval工作原理如下 123 456 to s 789 gt 123 456 789 eval 123 456 to s 789 gt 123 我怎样才能插入到一个字符串里面eval Update 谢谢你们 朋友们 有效 所
  • Go语言是否对字符串使用写时复制[重复]

    这个问题在这里已经有答案了 Go语言是否像Java一样对字符串使用写时复制 IE 如果我按值将字符串传递给方法并且从不更改它 则会分配内存并复制字符串 这将是时间效率低下的 或者它只会引用单个副本 它不是写入时复制 因为字符串是不可变的 但
  • Github Gists 语法高亮不起作用

    我正在尝试使用 Markdown 语法突出显示创建一个要点 不幸的是无法在这里发布屏幕截图 然后我按 保存 但没有应用语法突出显示 Python 代码也存在同样的问题 您需要将文件扩展名更改为 md 这是我的叉子gist https gis
  • 使用 Visual Studio 2010 Web Config 转换删除 XML 注释

    我们正在使用 Team Build 来处理对开发服务器的部署 并且需要在转换时从 Web 配置中删除注释 有谁知道如何删除使用转换从 Web 配置文件中注释行 我找到了答案 这似乎是 Visual Studio Team Build 中 X
  • 使用两个校准相机进行 3D 重建 - 该管道中的错误在哪里?

    有很多关于从已知内部校准的立体视图进行 3D 重建的帖子 其中一些是出色的 https stackoverflow com questions 16639106 camera motion from corresponding images