使用opencv进行外在矩阵计算

2023-11-25

我正在使用 opencv 来校准我的网络摄像头。因此,我所做的是将网络摄像头固定在装备上,使其保持静态,并且我使用了棋盘校准图案并将其移动到摄像头前面,并使用检测到的点来计算校准。所以,我们可以在许多 opencv 示例中找到这一点(https://docs.opencv.org/3.1.0/dc/dbb/tutorial_py_calibration.html)

现在,这为我提供了相机内在矩阵以及旋转和平移组件,用于将每个棋盘视图从棋盘空间映射到世界空间。

然而,我感兴趣的是全局外在矩阵,即一旦我移除了棋盘,我希望能够指定图像场景中的一个点,即 x、y 及其高度,它给出了我在世界空间中的位置。据我了解,为此我需要内在矩阵和外在矩阵。应该如何从这里开始计算外在矩阵?我也可以使用从棋盘校准步骤中收集的测量值来计算外在矩阵吗?


让我讲一些背景。考虑下面的图片,(来自https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html):

enter image description here

相机“附加”了一个刚性参考系(Xc,Yc,Zc)。这固有的成功执行的校准允许您将点 (Xc,Yc,Zc) 转换为其在图像 (u,v) 上的投影,并将图像中的点 (u,v) 转换为 (Xc,Yc, Zc)(只能达到一个比例因子)。

在实践中,您希望将相机放置在外部“世界”参考系中,我们称之为(X,Y,Z)。然后是刚性变换,用旋转矩阵表示,R,和一个平移向量T,这样:

|Xc|    |X|
|Yc|= R |Y| + T
|Zc|    |Z|

这就是外在校准(也可以写为 4x4 矩阵,这就是所谓的外在矩阵)。

现在,答案来了。获得R and T,您可以执行以下操作:

  1. 修复你的世界参考系,例如地面可以是(x,y)平面,并为其选择一个原点。

  2. 在该参考系中设置一些已知坐标的点,例如地板上的方格中的点。

  3. 拍摄一张照片并获取对应的2D图像坐标。

  4. Use solvePnP获得旋转和平移,参数如下:

    • objectPoints:世界参考系中的 3D 点。
    • imagePoints:图像中对应的2D点以相同的顺序作为对象点。
    • cameraMatris:您已有的内在矩阵。
    • distCoeffs:您已有的失真系数。
    • rvec, tvec:这些将是输出。
    • useExtrinsicGuess: false
    • 标志:您可以使用 CV_ITERATIVE
  5. 最后,得到R from rvec罗德里格斯功能。

您将需要至少 3 个具有相应 3D-2D 坐标的非共线点,solvePnP 才能工作(link),但越多越好。为了获得高质量的点,您可以打印一个大的棋盘图案,将其平放在地板上,并将其用作网格。重要的是图像中的图案不能太小(越大,校准就越稳定)。

And, 很重要:对于内在校准,您使用了具有一定大小的方块的国际象棋图案,但您告诉算法(它对每个图案进行求解 PnP),每个方块的大小是1。这不是明确的,而是在示例代码的第 10 行中完成的,其中网格是使用坐标 0,1,2,... 构建的:

objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)

外部校准的世界尺度必须与此匹配,因此您有几种可能性:

  1. 使用相同的比例,例如使用相同的网格或以相同的比例测量“世界”平面的坐标。在这种情况下,你的“世界”将不会处于正确的规模。

  2. 建议:使用正确的标度重新进行内在校准,例如:

    objp[:,:2] = (size_of_a_square*np.mgrid[0:7,0:6]).T.reshape(-1,2)

    其中 size_of_a_square 是正方形的实际大小。

  3. (没有这样做,但理论上是可能的,如果做不到就这样做2)通过缩放fx和fy来重用内在校准。这是可能的,因为相机看到的一切都达到了比例因子,并且声明的正方形大小仅改变 fx 和 fy (并且T每个方块的姿势,但那是另一个故事了)。如果一个正方形的实际大小是L,然后替换 fx 和 fy Lfx and Lfy 在调用solvePnP 之前。

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

使用opencv进行外在矩阵计算 的相关文章

随机推荐

  • 如何使用硬件配置文件从命令行创建 AVD?

    目前 我一直在通过 Android Studio UI 的 工具 gt AVD 管理器 管理 AVD 这适用于创建具有特定硬件配置文件 我在 XML 文件中 的 AVD 但我发现 AVD 经常会以某种方式损坏 AVD 旁边是 UI 中的 修
  • 如何在 SKmap 上显示自定义路线

    那么如果我们有一个本地旅行规划器 是否可以在 Skobbler 地图上显示路线 有没有什么方法可以SKMapSurfaceViewAndroid SDK上要传递一个路由来显示吗 Yes 绘制轨道元素 您可以在中看到一个示例demo项目 轨道
  • Maven 依赖排除似乎不起作用

    我有一个 Maven 项目 依赖于其他几个 Maven 项目 我在我的项目中使用 Spring 3 1 1 依赖项目有 3 0 6 我试图在部署时排除 Spring 3 0 6 因为两者都不可能 我已经在我的 POM 中添加了一个明确的排除
  • 获取相对于 android 中最顶层父级的视图位置

    要获得相对于其父级的视图 我可以使用getLeft getRight getTop and getBottom 但是如何获得相对于布局文件最顶层父级的视图呢 所以说我的前夕布局是RelativeLayout 然后说在 eve 内部我有许多嵌
  • 具有多个参数的骨干路由器

    我需要让它发挥作用 routes product showProduct product detail showProductDetail 在设置 product 路由时 即使之后设置 也永远不会调用 showProductDetail 我
  • 当在命令行上指定要打开的文件时,MFC 应用程序在 ProcessShellCommand() 中崩溃

    我需要解决的问题是如何使用MFC功能ProcessShellCommand in the InitInstance of a CWinApp当另一个应用程序启动打开文件的应用程序时 处理具有特定路径的文件打开 我有一个 MFC MDI 多文
  • Python ctypes:如何修改现有的 char* 数组

    我正在开发一个使用 libupnp C 库 的 Python 应用程序 我正在使用 CTypes 来使用这个库 这很简单 我遇到的问题是当我为读取请求注册回调函数时 该函数具有以下形式的原型 int read callback void p
  • Google 地图图标(图钉)- 如何定义颜色? [复制]

    这个问题在这里已经有答案了 是否可以更改由其 api 创建的谷歌地图上的图钉位置的颜色 或者必须使用自定义图标来做到这一点 这是谷歌地图 API v3 tnx 在广告中 您可以在初始化地图时声明图像 var overlay function
  • 在 JavaScript 中使用 Chrome 中的系统打印对话框

    我们遇到了 Chrome 的 打印预览 无法正确打印页面的问题 如果您使用 使用系统打印对话框链接 Ctrl Shift P 它可以很好地打印我们的页面 几乎与 Firefox 相同 我们的页面上有一个按钮 可以调用 window prin
  • 如何从 iPhone 上的 caf 文件访问/提取原始(无头)音频数据?

    我正在开发一个项目 需要我将原始无头 ulaw 或线性 pcm 数据发送到服务器 我正在使用 AVAudioRecorder 我可以很容易地将音频文件保存到手机上 但问题是 无论我尝试做什么 它们都会被包装在 caf 文件中或被标记为某种标
  • 如何使我的程序在 Windows Vista 和 Windows 7 中运行?

    我有一个用 Delphi 2006 编写的应用程序 它在 Windows XP 中运行良好 我使用 Inno Setup 打包应用程序 并使用 Program Files 作为默认文件夹 一些用户迁移到 Windows Vista 和 Wi
  • 编码技巧 - 交集类型和 java 枚举 [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 交集类型允许您 有点 执行具有继承层次结构的枚举 您不能继承实现 但可以将其委托给辅助类 enum Foo1 implements Bar enum Foo2 implements B
  • F#:异步、任务和 PLINQ,天哪!

    当F 问世时 我将在异步 并行编程领域获得财富 一个回答这个问题很好地描述了任务 并行 LINQ 和响应式框架之间的差异 但我想知道异步工作流程到底是如何适应这种情况的 如果我错了 请纠正我 但据我了解 异步工作流程将是处理 IO 绑定操作
  • 如何在GridView中创建删除按钮?

    我在我的另一个专栏GridView称为删除 单击删除时 应删除该行 换句话说 我需要获取当前行的用户名才能将其删除 我应该使用哪个事件 行删除 行删除等 如何从当前行获取用户名 这是一篇关于DataGrid的典型用法 Enjoy
  • Horizo​​ntalScrollView 在 RTL 模式下不会向左滚动

    我有 Horizo ntalScrollViewandroid supportsRtl true 在我的应用程序中 但它不是向左滚动 而是向右滚动 我该如何解决这个问题
  • 如何在 Python 中运行单元测试时临时隐藏 stdout 或 stderr

    我有一个错误的第三方 python 模块 在导入时输出到 stdout 或 stderr 这破坏了我的单元测试的输出 如何临时重定向stdout以隐藏其输出 限制为 Python 2 5 语法 Update 我忘记说了sys stdout
  • 转换 tex 源,以便所有宏都被它们的定义替换

    是否可以看到 TeX 预处理器 的输出 i e 实际输出完成之前的中间步骤 但所有用户定义的宏都被替换 只留下 TeX 原语的子集 或者说没有这样的中间步骤 Write edef xxx Any text with any commands
  • Rails 3 路线:DRY 成员

    我需要将以下成员方法添加到许多资源中 有没有办法将其干燥 member do get votes post up vote post down vote end 在我的routes rb中 resources news do resourc
  • 找不到类 java.io.ByteArrayInputStream 的序列化器

    从 openfire Rest api 获取用户实体时 我收到以下错误消息 我用 openfire Restapi 端点包装我的 Api 端点 error 内部服务器错误 异常 org springframework http conver
  • 使用opencv进行外在矩阵计算

    我正在使用 opencv 来校准我的网络摄像头 因此 我所做的是将网络摄像头固定在装备上 使其保持静态 并且我使用了棋盘校准图案并将其移动到摄像头前面 并使用检测到的点来计算校准 所以 我们可以在许多 opencv 示例中找到这一点 htt