SfM——八点法计算F矩阵(基础矩阵)与三角测量

1 八点法计算F矩阵(基础矩阵)

基础矩阵用于描述两个视图之间的几何关系

  1. 基础矩阵:基础矩阵 F F F 是描述两个视图之间相机投影关系的矩阵。对于两个对应的图像坐标点 ( x , y , 1 ) (x, y, 1) (x,y,1) ( u , v , 1 ) (u, v, 1) (u,v,1)​ 在两个视图上,基础矩阵满足以下方程:

    这个方程即对极约束,描述了图像中对应点的投影关系

[ u v 1 ] T ⋅ F ⋅ [ x y 1 ] = 0 \begin{bmatrix} u \\ v \\ 1 \end{bmatrix}^T \cdot F \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = 0 uv1 TF xy1 =0

  1. 线性系统:对于多对对应点,可以构建一个线性方程系统 A f = 0 Af = 0 Af=0 ,其中 A A A 是由对应点生成的矩阵, f f f​ 是基础矩阵的扁平形式

    上述方程即:

[ u v 1 ] ⋅ [ f 11 f 12 f 13 f 21 f 22 f 23 f 31 f 32 f 33 ] ⋅ [ x y 1 ] = 0 \begin{bmatrix} u & v & 1 \end{bmatrix} \cdot \begin{bmatrix} f_{11} & f_{12} & f_{13} \\ f_{21} & f_{22} & f_{23} \\ f_{31} & f_{32} & f_{33} \end{bmatrix} \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = 0 [uv1] f11f21f31f12f22f32f13f23f33 xy1 =0

​ 展开得到:

[ u x v x x u y v y y u v 1 ] ⋅ [ f 11 f 12 f 13 f 21 f 22 f 23 f 31 f 32 f 33 ] = 0 \begin{bmatrix} ux&vx&x&uy&vy&y&u&v&1 \end{bmatrix}\cdot \begin{bmatrix}f_{11} \\ f_{12} \\ f_{13} \\ f_{21} \\ f_{22} \\ f_{23} \\ f_{31} \\ f_{32} \\ f_{33} \\ \end{bmatrix} = 0 [uxvxxuyvyyuv1] f11f12f13f21f22f23f31f32f33 =0

​ 这个矩阵方程可以表示为 A i f = 0 A_if = 0 Aif=0

​ 为了解出这个9个未知数的 f f f ,我们至少需要8对点,所以叠加 A i A_i Ai 得到 A A A 矩阵

A = [ x 1 u 1 x 1 v 1 x 1 y 1 u 1 y 1 v 1 y 1 u 1 v 1 1 x 2 u 2 x 2 v 2 x 2 y 2 u 2 y 2 v 2 y 2 u 2 v 2 1 ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ x 8 u 8 x 8 v 8 x 8 y 8 u 8 y 8 v 8 y 8 u 8 v 8 1 ] A = \begin{bmatrix} x_1u_1 & x_1v_1 & x_1 & y_1u_1 & y_1v_1 & y_1 & u_1 & v_1 & 1 \\ x_2u_2 & x_2v_2 & x_2 & y_2u_2 & y_2v_2 & y_2 & u_2 & v_2 & 1 \\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots \\ x_8u_8 & x_8v_8 & x_8 & y_8u_8 & y_8v_8 & y_8 & u_8 & v_8 & 1 \end{bmatrix} A= x1u1x2u2x8u8x1v1x2v2x8v8x1x2x8y1u1y2u2y8u8y1v1y2v2y8v8y1y2y8u1u2u8v1v2v8111

  1. 最小二乘法:通过奇异值分解(SVD),取 V T V^T VT 的最后一列作为估计矩阵 A A A 的最小二乘解,即 f f f

    方程的最小二乘解有一个既定的结论,即对 A A A 进行SVD分解,得到的 V T V^T VT 的最后一行 即是 f f f 的解

  2. 基础矩阵还原:将 f f f reshape 为 3 × 3 3 \times 3 3×3​ 的矩阵,然后通过奇异值分解(SVD)对矩阵进行调整,以确保基础矩阵的秩为2

    • SVD分解:
      对矩阵 F F F 进行奇异值分解: F = U Σ V T F = U \Sigma V^T F=UΣVT ,其中 U U U V V V 是正交矩阵, Σ \Sigma Σ 是对角矩阵

    • 秩-2约束:
      将奇异值矩阵 Σ \Sigma Σ 调整为仅保留前两个奇异值(将第三个奇异值设为0),以确保基础矩阵的秩为2

    • 重构基础矩阵:
      F = U Σ ′ V T F = U \Sigma' V^T F=UΣVT

    F = f.reshape((3, 3))# 对F进行SVD分解
    U, S, Vt = np.linalg.svd(F)# 将奇异值矩阵Sigma调整为仅保留前两个奇异值(第三个设为0)
    S[2] = 0# 重构基础矩阵F
    F = np.dot(U, np.dot(np.diag(S), Vt))
    
  3. 归一化:对基础矩阵进行归一化,以确保尺度的一致性

2 标准化八点算法

对普通的八点算法进行了改进,通过标准化输入数据,提高了算法的稳健性和准确性

  1. 我们首先将对应点标准化为零均值和单位方差,以消除尺度的影响

    mean1 = np.mean(keypoints1, axis=0)
    mean2 = np.mean(keypoints2, axis=0)
    std1 = np.std(keypoints1, axis=0)
    std2 = np.std(keypoints2, axis=0)
    # 防止除0,由于齐次坐标,标准差std算得最后一项为0
    std1[2] = 1
    std2[2] = 1
    nomalized_points1 = (keypoints1 - mean1) / std1
    nomalized_points2 = (keypoints2 - mean2) / std2
    

x ˉ = x − μ x ˉ σ x \bar{x} = \frac{x - \bar{\mu_x}}{\sigma_x} xˉ=σxxμxˉ

也等于左乘一个转换矩阵 T T T

T = [ 1 σ x 0 − μ x σ x 0 1 σ y − μ y σ y 0 0 1 ] T = \begin{bmatrix} \frac{1}{\sigma_x} & 0 & -\frac{\mu_x}{\sigma_x} \\ 0 & \frac{1}{\sigma_y} & -\frac{\mu_y}{\sigma_y} \\ 0 & 0 & 1 \end{bmatrix} T= σx1000σy10σxμxσyμy1

  1. 在这些标准化点上运行八点算法

  2. 最后对得到的基本矩阵进行反变换,在计算基础矩阵后,需要将其进行撤销标准化处理,以获得最终的基础矩阵

F = T 2 − 1 ⋅ F n o r m a l i z e d ⋅ T 1 F = T_2^{-1} \cdot F_{normalized} \cdot T_1 F=T21FnormalizedT1

3 三角测量

我们有两个相机,它们的c分别为 P 1 P_1 P1 P 2 P_2 P2 3 × 4 3 \times 4 3×4​ 矩阵)。

P = K [ R ∣ t ] P = K\begin{bmatrix}R|t\end{bmatrix} P=K[Rt]

对于一个在相机1和相机2中分别观察到的同一物体的对应点 x ~ 1 \tilde x_1 x~1 x ~ 2 \tilde x_2 x~2 (齐次坐标 3 × 1 3 \times 1 3×1 向量) ,我们可以得到以下方程:其中, X ~ \tilde X X~ (齐次坐标 4 × 1 4 \times 1 4×1 向量)是物体在三维空间中的坐标

P 1 X ~ = x ~ 1 P 2 X ~ = x ~ 2 P_1 \tilde X =\tilde x_1\\ P_2 \tilde X =\tilde x_2 P1X~=x~1P2X~=x~2

P P P 分解为三个向量:

P i = [ P i 1 P i 2 P i 3 ] P i 1 = [ p 11 , p 12 , p 13 , p 14 ] P i 2 = [ p 21 , p 22 , p 23 , p 24 ] P i 3 = [ p 31 , p 32 , p 33 , p 34 ] P_i =\begin{bmatrix}P_{i1}\\ P_{i2} \\ P_{i3} \end{bmatrix} \\ P_{i1} = [p_{11}, p_{12}, p_{13}, p_{14}] \\ P_{i2} = [p_{21}, p_{22}, p_{23}, p_{24}] \\ P_{i3} = [p_{31}, p_{32}, p_{33}, p_{34}] \\ Pi= Pi1Pi2Pi3 Pi1=[p11,p12,p13,p14]Pi2=[p21,p22,p23,p24]Pi3=[p31,p32,p33,p34]

这样,原等式就变为:

[ P i 1 X ~ P i 2 X ~ P i 3 X ~ ] = [ x i y i 1 ] \begin{bmatrix}P_{i1}\tilde X \\ P_{i2}\tilde X \\ P_{i3}\tilde X\end{bmatrix} =\begin{bmatrix}x_i \\ y_i \\ 1\end{bmatrix} Pi1X~Pi2X~Pi3X~ = xiyi1

将左边向量齐次化除以第三个元素,与右边向量元素一一对应:

P i X ~ = [ P i 1 X ~ P i 3 X ~ P i 2 X ~ P i 3 X ~ 1 ] = [ x i y i 1 ] = x ~ i x i = P i 1 X ~ P i 3 X ~ ⇒ x i P i 3 X ~ − P i 1 X ~ = 0 y i = P i 2 X ~ P i 3 X ~ ⇒ y i P i 3 X ~ − P i 2 X ~ = 0 P_i \tilde X = \begin{bmatrix} \frac{P_{i1} \tilde X}{P_{i3}\tilde X} \\ \frac{P_{i2} \tilde X}{P_{i3} \tilde X} \\ 1 \end{bmatrix}= \begin{bmatrix}x_i \\ y_i \\ 1 \end{bmatrix} = \tilde x_i \\ x_i = \frac{P_{i1} \tilde X}{P_{i3} \tilde X} \Rightarrow x_iP_{i3} \tilde X-P_{i1} \tilde X = 0 \\ y_i = \frac{P_{i2} \tilde X}{P_{i3} \tilde X} \Rightarrow y_iP_{i3} \tilde X-P_{i2} \tilde X = 0 PiX~= Pi3X~Pi1X~Pi3X~Pi2X~1 = xiyi1 =x~ixi=Pi3X~Pi1X~xiPi3X~Pi1X~=0yi=Pi3X~Pi2X~yiPi3X~Pi2X~=0

由于我们知道 x 1 x_1 x1 x 2 x_2 x2 P 1 P_1 P1 P 2 P_2 P2​​ ,我们可以将其转化为一个齐次线性方程组

A 1 = [ x 1 P 13 − P 11 y 1 P 13 − P 12 ] A 2 = [ x 2 P 23 − P 21 y 2 P 23 − P 22 ] A = [ A 1 A 2 ] A X ~ = 0 A_1 = \begin{bmatrix} x_1 P_{13} - P_{11} \\ y_1 P_{13} - P_{12} \end{bmatrix} \\ A_2 = \begin{bmatrix} x_2 P_{23} - P_{21} \\ y_2 P_{23} - P_{22} \end{bmatrix} \\ A = \begin{bmatrix}A_1 \\ A_2 \end{bmatrix} \\ A\tilde X = 0 A1=[x1P13P11y1P13P12]A2=[x2P23P21y2P23P22]A=[A1A2]AX~=0

A = np.array([keypoint1[0] * P1[2] - P1[0],keypoint1[1] * P1[2] - P1[1],keypoint2[0] * P2[2] - P2[0],keypoint2[1] * P2[2] - P2[1]]
)

这样我们就可以使用最小二乘法或其他方法来解决这个线性方程组,从而找到物体的三维位置 X X X

# DLT算法解决最小二乘法
_, _, Vt = np.linalg.svd(A)
x_w = Vt[-1]
x_w = x_w / x_w[3] # 齐次坐标

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/747103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端:设置覆盖图片的层叠顺序

html <div class"image-container"><img src"image1.jpg" class"image1" alt"Image 1"><img src"image2.jpg" class"image2" alt"Image 2"> </div> css代码 .image-contai…

Elasticsearch(8) random_score的使用

elasticsearch version&#xff1a; 7.10.1 random_score的使用 在Elasticsearch中&#xff0c;random_score查询可以用来随机排序搜索结果&#xff0c;这对于实现诸如轮播、随机推荐等功能非常有用。 random_score的语法 GET /<索引名>/_search {"query":…

Upload-labs靶场

文件漏洞上传进行复现 环境搭建--->搭建好环境如下&#xff1a; 打开第一关&#xff0c;尝试文件上传漏洞 根据界面提示&#xff0c;选择一个文件&#xff08;.php文件&#xff09;进行上传&#xff0c;发现无法上传 根据提示是指使用js对不合法文件进行了检查&#xff0c;…

Modbus -tcp协议使用第二版

1.1 协议描述 1.1.1 总体通信结构 MODBUS TCP/IP 的通信系统可以包括不同类型的设备&#xff1a; &#xff08;1&#xff09;连接至 TCP/IP 网络的 MODBUS TCP/IP 客户机和服务器设备&#xff1b; &#xff08;2&#xff09;互连设备&#xff0c;例如&#xff1a;在 TCP/IP…

Linux——GlusterFS分布式文件系统群集

一、GlusterFS简介 GlusterFS是一个开源的分布式文件系统&#xff0c;同时也是Scale-Out存储解决方案Gluster的核心&#xff0c;在存储数据方面具有强大的横向扩展能力&#xff0c;通过开展不同的节点可以支持数PB级别的存储容量。 GlusterFS的特点 扩展性和高性能、…

重学SpringBoot3-Problemdetails

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-Problemdetails Problem Details的概念ProblemDetails配置类在Spring Boot 3中使用Problem Details未配置Problem Details配置Problem Details自定义异常…

STM32利用AES加密数据、解密数据

STM32利用AES加密数据、解密数据 MD5在线工具Chapter1 STM32利用AES加密数据、解密数据一、头文件二、源文件三、使用 Chapter2 stm32 的 md5计算函数Chapter3 STM32 应用程序加密的一种设计方案前言一、计算AppKey二、自动配置流程三、出厂固件合并 个人总结 MD5在线工具 htt…

基于Java+SpringBoot+vue的图书购物商城系统详细设计和实现

基于JavaSpringBootvue的图书购物商城系统详细设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文…

操作多级(一、二、三级)指针才是我们的该有的姿态~

Hello&#xff0c;很有缘在这篇文章上我们相遇了&#xff0c;那么我就用题目巩固我们多级指针的知识&#xff0c;当然这里的题目是比较有点难度的&#xff0c;我们需要有点基础呀&#xff0c;如果你能轻松理解题目那说明你对指针的了解已经很有基础了呢&#xff0c;那废话不多说…

Observability:可观测性的新兴趋势:GAI、AIOps、工具整合和 OpenTelemetry

作者&#xff1a;来自 Elastic Gagan Singh 查看我们 2024 年对 500 多名可观察性决策者进行的调查结果&#xff0c;了解行业的发展方向。 随着技术的快速发展&#xff0c;可观察性也在快速发展。 可观察性对于推动积极的业务成果变得至关重要&#xff0c;我们希望了解用户如…

点餐平台网站|基于springboot框架+ Mysql+Java+Tomcat的点餐平台网站设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能实现 系统功能设计 数据库E-R图设计 lunwen参…

七月论文审稿GPT第3.2版和第3.5版:通过paper-review数据集分别微调Mistral、gemma

前言 我司第二项目组一直在迭代论文审稿GPT(对应的第二项目组成员除我之外&#xff0c;包括&#xff1a;阿荀、阿李、鸿飞、文弱等人)&#xff0c;比如 七月论文审稿GPT第1版&#xff1a;通过3万多篇paper和10多万的review数据微调RWKV七月论文审稿GPT第2版&#xff1a;用一万…

结构体之成绩统计2

题目描述 有N个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入N个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩) 输入格式 学生数量N占一行每个学生的学号、姓名、三科成绩占一行,空格分开。 输出格式 各门…

使用CIP采集欧姆龙EtherNet/IP从入门到精通

本文将会从以下几个方面介绍 1.CIP是什么 2.EtherNet/IP通信是什么 3.CIP通信报文解析 4.使用CIP常用的方法和功能介绍&#xff08;UCMM&#xff09; 5.自己封装了一个类&#xff0c;只要知道标签名称&#xff0c;和数据类型即可读写数据 6.demo展示 1.CIP是什么 CIP通信…

【C#】【SAP2000】读取SAP2000中frame单元列表到Grasshopper中

private void RunScript(bool build, ref object p1, ref object p2, ref object Profile, ref object stressRatio, ref object temperatureLoad, ref object displacement, ref object frameList){if (build true){// 声明变量int ret;int Numit 0;int[] ObjType new int[…

【Datawhale组队学习:Sora原理与技术实战】使用KAN-TTS合成女生沪语音频

Sambert-Hifigan模型介绍 拼接法和参数法是两种Text-To-Speech(TTS)技术路线。近年来参数TTS系统获得了广泛的应用&#xff0c;故此处仅涉及参数法。 参数TTS系统可分为两大模块&#xff1a;前端和后端。 前端包含文本正则、分词、多音字预测、文本转音素和韵律预测等模块&am…

无序安装任何检测工具,检测端口是否打开

Linux中有个特殊的设备文件&#xff1a; /dev/tcp 允许通过该接口进行tcp网络通讯 例子&#xff1a; 测试某一台远程机器的22端口是否打开&#xff1a; echo > /dev/tcp/127.0.0.1/22 如果没有任何输出&#xff0c;则端口开放&#xff0c; 否则没有开放 利用bash 脚本批…

SLAM基础-因子图优化

前言&#xff1a; 因子图优化和BA优化、位姿图优化一样&#xff0c;其本质都是解决非线性优化的问题。如果只有路标和位姿之间的因子&#xff0c;和BA优化完全一样。不过因子图是个大筐&#xff0c;什么约束都能加&#xff0c;IMU&#xff0c;轮速计&#xff0c;GPS。 在当前…

利用数据驱动的MEG分析方法提取fMRI静息态网络

摘要 静息态网络(RSN)的电生理基础仍存在争议。特别是&#xff0c;尚未确定一个能够同样有效解释所有静息态网络的原理性机制。虽然脑磁图(MEG)和脑电图(EEG)是确定RSN电生理基础的首选方法&#xff0c;但目前没有标准的RSN分析流程。本文比较了从MEG数据中提取RSNs的两种现有…