基本矩阵的基本解法之8点算法
归一化8点算法
基本矩阵是由下述方程定义:
x′TFx=0\mathbf x'^TF\mathbf x=\mathbf0 x′TFx=0
其中x↔x′x↔x′x↔x′是两幅图像的任意一对匹配点。由于每一组点的匹配提供了计算FF系数的一个线性方程,当给定至少777个点(3×33×33×3的齐次矩阵减去一个尺度,以及一个秩为222的约束),方程就可以计算出未知的FFF。我们记点的坐标为x=(x,y,1)T,x′=(x′,y′,1)Tx=(x,y,1)^T,x′=(x′,y′,1)^Tx=(x,y,1)T,x′=(x′,y′,1)T,则对应的方程为
[xy1][f11f12f13f21f22f23f31f32f33][x′y′1]=0\begin{bmatrix}x&y&1\end{bmatrix} \begin{bmatrix} f_{11}&f_{12}&f_{13}\\ f_{21}&f_{22}&f_{23}\\ f_{31}&f_{32}&f_{33} \end{bmatrix} \begin{bmatrix}x'\\ y'\\1\end{bmatrix}=0 [xy1]⎣⎡f11f21f31f12f22f32f13f23f33⎦⎤⎣⎡x′y′1⎦⎤=0
展开后有
x′xf11+x′yf12+x′f13+y′xf21+y′yf22+y′f23+xf31+yf32+f33=0x'xf_{11}+x'yf_{12}+x'f_{13}+y'xf_{21}+y'yf_{22}+y'f_{23}+xf_{31}+yf_{32}+f_{33}=0 x′xf11+x′yf12+x′f13+y′xf21+y′yf22+y′f23+xf31+yf32+f33=0
把矩阵FFF写成列向量的形式,则有:
[x′xx′yx′y′xy′yy′xy1]f=0\begin{bmatrix}x'x&x'y&x'&y'x&y'y&y'&x&y&1\end{bmatrix}\mathbf f=0 [x′xx′yx′y′xy′yy′xy1]f=0
给定nnn组点的集合,我们有如下方程:
Af=[x1′x1x1′y1x1′y1′x1y1′y1y1′x1y11⋮⋮⋮⋮⋮⋮⋮⋮⋮xn′xnxn′ynxn′yn′xnyn′ynyn′xnyn1]f=0A\mathbf f=\begin{bmatrix} x_1'x_1&x_1'y_1&x_1'&y_1'x_1&y_1'y_1&y_1'&x_1&y_1&1\\ \vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\ x_n'x_n&x_n'y_n&x_n'&y_n'x_n&y_n'y_n&y_n'&x_n&y_n&1 \end{bmatrix}\mathbf f=\mathbf 0 Af=⎣⎢⎡x1′x1⋮xn′xnx1′y1⋮xn′ynx1′⋮xn′y1′x1⋮yn′xny1′y1⋮yn′yny1′⋮yn′x1⋮xny1⋮yn1⋮1⎦⎥⎤f=0
如果存在确定(非零)解,则系数矩阵AAA的秩最多是888。由于FFF是齐次矩阵,所以如果矩阵AAA的秩为888,则在差一个尺度因子的情况下解是唯一的。可以直接用线性算法解得。
如果由于点坐标存在噪声则矩阵AA的秩可能大于888(也就是等于999,由于AAA是n×9n×9n×9的矩阵)。这时候就需要求最小二乘解,这里就可以用SVD来求解,fff的解就是系数矩阵AAA最小奇异值对应的奇异向量,也就是AAA奇异值分解后A=UDVTA=UDV^TA=UDVT中矩阵VVV的最后一列矢量,这是在解矢量ff在约束‖f‖‖f‖‖f‖下取‖Af‖‖Af‖‖Af‖最小的解。以上算法是解基本矩阵的基本方法,称为8点算法。
由于基本矩阵有一个重要的特点就是奇异性,FFF矩阵的秩是222。如果基本矩阵是非奇异的,那么所计算的对极线将不重合。所以在上述算法解得基本矩阵后,会增加一个奇异性约束。最简便的方法就是修正上述算法中求得的矩阵FF。设最终的解为F′F'F′,令detF′=0detF'=0detF′=0下求得Frobenius范数(二范数)‖F−F′‖‖F−F'‖‖F−F′‖最小的F′F'F′。这种方法的实现还是使用了SVD分解,若F=UDVTF=UDV^TF=UDVT,此时的对角矩阵D=diag(r,s,t)D=diag(r,s,t)D=diag(r,s,t),满足r≥s≥tr≥s≥tr≥s≥t,则F′=Udiag(r,s,0)VTF'=Udiag(r,s,0)V^TF′=Udiag(r,s,0)VT最小化范数‖F−F′‖‖F−F'‖‖F−F′‖,也就是最终的解。
所以8点算法由下面两个步骤组成:
1.求线性解 由系数矩阵AAA最小奇异值对应的奇异矢量fff求的FF。
2.奇异性约束 是最小化Frobenius范数‖F−F′‖‖F−F'‖‖F−F′‖的F′F'F′代替FFF。
8点算法是计算基本矩阵的最简单的方法。为了提高解的稳定性和精度,往往会对输入点集的坐标先进行归一化处理。在MVG的估计一章中推荐各向同性归一化,OpenCV的8点算法也是使用了各向同性,也就是使得各个点做平移缩放之后到坐标原点的均方根距离等于2\sqrt 22。非各向同性归一化和各向同性归一化在论文In Defense of the Eight-Point Algorithm中有讨论,ORB-SLAM2单目初始化F矩阵计算之前的归一化使用的是非各向同性归一化。对于归一化八点算法的总结如下:
给定n≥8n≥8n≥8组对应点xi↔xi′{x_i↔x_i'}xi↔xi′,确定基本矩阵FFF使得xi′TFxi=0x_i'^TFx_i=0xi′TFxi=0
算法:
1.归一化:根据x^i=Txi,x^i′=T′xi′\hat x_i=Tx_i,\hat x'_i=T'x'_ix^i=Txi,x^i′=T′xi′,变换图像坐标。其中TTT和T′T'T′是有平移和缩放组成的归一化变换。、
2.求解对应匹配的基本矩阵F′F^′F′
1.求线性解:用由对应点集x^i↔x^i′{\hat x_i↔\hat x_i'}x^i↔x^i′确定的系数矩阵A^\hat AA^的最小奇异值的奇异矢量确定F^\hat FF^。
2.奇异性约束:用SVD对F^\hat FF^进行分解,令其最小奇异值为000,得到F^′\hat F'F^′,使得detF′=0detF^′=0detF′=0。
3.解除归一化:令F=T′TF^′TF=T'^T\hat F'TF=T′TF^′T。矩阵FFF就是数据xi↔xi′x_i↔x'_ixi↔xi′对应的基本矩阵。
我是用了SIFT对两个图像进行特征提取以及匹配,然后使用归一化8点算法进行基本矩阵的求解,并且把两个视图的对极线都画出。下图为SIFT匹配图以及对极线:
由于两幅图像在匹配的时候有不少错误的匹配,所以计算的基本矩阵有较大的误差。看第二幅图,左右视图中都可以发现很多的点在对极线附近但并没有完全落在对极线上。我们可以观察到左右视图的对极线都响应地汇聚到一点,那点就是极点。这一对匹配中极点都落在图像内,当然也有些情况对极线会落在图像外,比如下图
具体的代码实现见Github
参考
Multiple View Geometry in Computer Vision,Second Edition
ORB-SLAM2单目初始化F矩阵计算
OpenCV 3.1.0基本矩阵8点算法
In Defense of the Eight-Point Algorithm
转载自:
博主:kokerf
博文地址:https://blog.csdn.net/kokerf/article/details/72630863?locationNum=2&fps=1
来源:CSDN
基本矩阵的基本解法之8点算法相关推荐
- 解线性方程组的直接方法:LU分解法及其C语言算法实现
在上一篇博客里面,笔者介绍了解线性方程组的列主元Guass消元法,这篇将介绍LU分解法及其算法实现. 什么是LU分解? 对于一个线性方程组Ax=b,其中A是非奇异系数矩阵,b是线性方程组右端项,在列主 ...
- 最长回文子串(多种解法,附马拉车算法)
目录 •写在前面 •题目 •解法一 暴力破解 •解法二 暴力优化 •解法三 最长公共子串(动态规划整体) •解法四 中心扩展法 •解法五 马拉车算法 •结束 •写在前面 这种类型的题目算是比 ...
- 隐马尔科夫模型,第三种问题解法,维比特算法(biterbi) algorithm python代码
上篇介绍了隐马尔科夫模型 本文给出关于问题3解决方法,并给出一个例子的python代码 回顾上文,问题3是什么, 下面给出,维比特算法(biterbi) algorithm 下面通过一个具体例子,来说 ...
- 2021/06/29计算机视觉期末复习笔记整理
计算机视觉期末复习笔记整理 引言 我的复习参考 期末考试考题回忆 PPT对应中文笔记整理 参考的几篇博客的笔记 引言 刚结束可能是我学生时代最后一场考试了,orz热乎着,记录一下. 这门课是学校新开的 ...
- 算法:多数元素,多种解法
前言: 以前做数学题的时候,老师说:你们学习多种解题方法.遇到类似不同的问题,你都会了,这样能提高解题能力.如果你写出多种解法,面试官会对你刮目相看. 下面一题,我们将用多种解法实现,是面试中常见的一 ...
- 算法笔记1-最大子序列和问题的求解
问题-- 给定N个整数(有可能是负数)A1,A2,A3,A4...An,求最大子序列和. (子序列必须是连续的):比方,对于输入,-2,11,-4,13,-5,-2.这个序列, 答案是20,即从A2到 ...
- 算法--微软面试:整数的二进制表示中1的个数(Java实现)
Q题目 整数的二进制表示中1的个数 输入一个整数,求该整数的二进制表达中有多少个1. 例如,输入10,由于其二进制表示为1010,有两个1,因此输出2. 这是一道很基本的考查位运算的面试题. Answ ...
- mysql strstr_实现 strStr() 函数-算法刷题
算法题目 实现 strStr() 函数: 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的 第一个位置 (从0开始).如果 ...
- 蓝桥杯 算法训练试题 数据交换 Java
题目详情 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 编写一个程序,输入两个整数,分别存放在变量x和y当中,然后使用自己定义的函数swap来交换这两个变量的值. 输入格式:输入只 ...
最新文章
- Nginx源码分析:核心数据结构ngx_cycle_t与内存池概述
- 关于错误 openssl/ssl.h:没有那个文件或目录的解决办法
- 为什么要学C语言及C语言存在的意义,新手经常犹豫学不学C语言
- 域 无法管理计算机,计算机无法加入域的终级解决方法
- 【转】iOS开发24:使用SQLite3存储和读取数据
- springboot mybatis ehcache_SpringBoot入门建站全系列(十四)集成Redis缓存
- 注意System.currentTimeMillis()潜在的性能问题
- Python提取docx文档中例题、插图、表格清单
- 如何监视SQL Server索引的总大小
- AJAX核心对象-- XMLHttpRequest 对象使用详解 (一)
- MyEclipse添加Mybatis generator插件
- python 微信扫码登录_python实现微信第三方网站扫码登录(Django)
- 数学建模笔记(七):综合评价模型
- 项目管理常用套表模板介绍
- android 使用adb命令安装安卓apk包
- MFC列表控件report报表可编辑操作
- Zero-Shot Deep Domain Adaptation[reading notes]
- linux报错ora12514,ORA-12514:RMAN连接报错解决
- 量化交易 第三课 数据获取接口
- 微信小程序 - excel通过云函数导入云数据库