计算机视觉-对极几何

1 基本概念

对极几何(Epipolar Geometry)描述的是两幅视图之间的内在射影关系,与外部场景无关,只依赖于摄像机内参数和这两幅视图之间的相对位姿

两视图的对极几何可以理解为图像平面与以基线为轴的平面束相交的几何关系,其中主要有几种概念:

  • 基线(base line):两个相机中心的连线CC'称为基线
  • 对极点(epipolar):ee'是对极点,是基线与两个成像平面的交点,也就是两个相机在另一个成像平面上的像点
  • 对极平面(epipolar plane):过基线的平面都称之为对极平面,其中两个相机的中心C和C',三维点X,以及三维点在两个相机成像点xx'这五点必定在同一对极平面上,当三维点X变化时,对极平面绕着基线旋转,形成对极平面束
  • 对极线(epipolar line):是对极平面和成像平面的交线,所有的对极线都相交于极点

2 基础矩阵和本质矩阵的推导

那么由对极几何的基本性质引出了对极约束的概念,对极约束是指在平面2上的p点在平面1上的对应点一定在基线I'上,这句话说明了对极约束是一个点到直线的射影映射关系。如图所示

根据对极约束可以引出本质矩阵和基础矩阵。在已知相机标定的情况下,假设有一个三维坐标点P(X,Y,Z)在两个视图上的点分别为p1,p2,由于第一个相机的中心作为世界坐标系的原点,也就是说第一个相机没有旋转R和平移t,通过小孔相机模型有:

p1=KP, p2=K(RP+t)

其中,K是相机的内参,R,t是第二个相机相对于第一个相机的旋转和平移。

p_1=KP

P=K^{-1} p_1

带入上面式子中:

p_2=K(R K^{-1}p_1+t)

两边同时乘以K^{-1}得到:

K^{-1}p_2=RK^{-1}p_1+t

为了简化,规定:

x_1=K^{-1}p_1

x_2=K^{-1}p_2

x_2=Rx_1+t

两边同时左乘向量t的反对称矩阵t×,由于t×t=0,消除t,

t_{\times} x_2=t_{\times} R x_1

两边同时乘以x_2^T

x_2^T t_{\times} x_2=x_2^T t_{\times} R x_1

由于t_{\times} x_2  是向量t和向量x2的叉积,同时垂直于向量t和向量x2,所以左边的式子为0得到:

0=x_2^T t_{\times} R x_1

再将x_1,x_2带入上面式子中:

p_2^T K^{-T} t_{\times} R K^{-1} p_1=0

上式是对极约束的一种表示,该式子中仅包含像点,相机的旋转和平移,中间的矩阵就是基础矩阵F

F=K^{-T} t_{\times} R K^{-1}

当K已知时提取中间的矩阵得到本质矩阵E,E矩阵同样表示的是对极约束的关系,只不过它不再涉及相机内参,只由两视图之间的姿态关系决定

E=t_{\times} R

F矩阵的性质有三:

  1. 3*3且自由度为7的矩阵
  2. kF 为基础矩阵,相差一个尺度自由度
  3. F矩阵的秩为2

基础矩阵的求解方法:

  1. 直接线性变换法(8点法+最小二乘法)
  2. RANSAC-估计基础矩阵

3 基础矩阵求解方法

opencv 求解API:https://docs.opencv.org/3.4.0/d9/d0c/group__calib3d.html#ga4abc2ece9fab9398f2e560d53c8c9780

Mat cv::findFundamentalMat 	( 	InputArray  	points1,InputArray  	points2,int  	method = FM_RANSAC,double  	param1 = 3.,double  	param2 = 0.99,OutputArray  	mask = noArray() ) 	Mat cv::findEssentialMat 	( 	InputArray  	points1,InputArray  	points2,double  	focal = 1.0,Point2d  	pp = Point2d(0, 0),int  	method = RANSAC,double  	prob = 0.999,double  	threshold = 1.0,OutputArray  	mask = noArray() ) 	

8点法求解

#include <math/matrix_svd.h>
#include "math/matrix.h"
#include "math/vector.h"typedef math::Matrix<double, 3, 3>  FundamentalMatrix;FundamentalMatrix fundamental_8_point (math::Matrix<double, 3, 8> const& points1, math::Matrix<double, 3, 8> const& points2){FundamentalMatrix F;return F;
#if 0/* direct linear transform */math::Matrix<double, 8, 9> A;for(int i=0; i<8; i++){math::Vec3d p1  = points1.col(i);math::Vec3d p2 = points2.col(i);A(i, 0) = p1[0]*p2[0];A(i, 1) = p1[1]*p2[0];A(i, 2) = p2[0];A(i, 3) = p1[0]*p2[1];A(i, 4) = p1[1]*p2[1];A(i, 5) = p2[1];A(i, 6) = p1[0];A(i, 7) = p1[1];A(i, 8) = 1.0;}math::Matrix<double, 9, 9> vv;math::matrix_svd<double, 8, 9>(A, nullptr, nullptr, &vv);math::Vector<double, 9> f = vv.col(8);FundamentalMatrix F;F(0,0) = f[0]; F(0,1) = f[1]; F(0,2) = f[2];F(1,0) = f[3]; F(1,1) = f[4]; F(1,2) = f[5];F(2,0) = f[6]; F(2,1) = f[7]; F(2,2) = f[8];/* singularity constraint */math::Matrix<double, 3, 3> U, S, V;math::matrix_svd(F, &U, &S, &V);S(2,2)=0;F = U*S*V.transpose();return F;
#endif}int main(int argc, char*argv[])
{// 第一幅图像中的对应点math::Matrix<double, 3, 8> pset1;pset1(0, 0) = 0.180123 ; pset1(1, 0)= -0.156584; pset1(2, 0)=1.0;pset1(0, 1) = 0.291429 ; pset1(1, 1)= 0.137662 ; pset1(2, 1)=1.0;pset1(0, 2) = -0.170373; pset1(1, 2)= 0.0779329; pset1(2, 2)=1.0;pset1(0, 3) = 0.235952 ; pset1(1, 3)= -0.164956; pset1(2, 3)=1.0;pset1(0, 4) = 0.142122 ; pset1(1, 4)= -0.216048; pset1(2, 4)=1.0;pset1(0, 5) = -0.463158; pset1(1, 5)= -0.132632; pset1(2, 5)=1.0;pset1(0, 6) = 0.0801864; pset1(1, 6)= 0.0236417; pset1(2, 6)=1.0;pset1(0, 7) = -0.179068; pset1(1, 7)= 0.0837119; pset1(2, 7)=1.0;//第二幅图像中的对应math::Matrix<double, 3, 8> pset2;pset2(0, 0) = 0.208264 ; pset2(1, 0)= -0.035405 ; pset2(2, 0) = 1.0;pset2(0, 1) = 0.314848 ; pset2(1, 1)=  0.267849 ; pset2(2, 1) = 1.0;pset2(0, 2) = -0.144499; pset2(1, 2)= 0.190208  ; pset2(2, 2) = 1.0;pset2(0, 3) = 0.264461 ; pset2(1, 3)= -0.0404422; pset2(2, 3) = 1.0;pset2(0, 4) = 0.171033 ; pset2(1, 4)= -0.0961747; pset2(2, 4) = 1.0;pset2(0, 5) = -0.427861; pset2(1, 5)= 0.00896567; pset2(2, 5) = 1.0;pset2(0, 6) = 0.105406 ; pset2(1, 6)= 0.140966  ; pset2(2, 6) = 1.0;pset2(0, 7) =  -0.15257; pset2(1, 7)= 0.19645   ; pset2(2, 7) = 1.0;FundamentalMatrix F = fundamental_8_point(pset1, pset2);std::cout<<"Fundamental matrix after singularity constraint is:\n "<<F<<std::endl;std::cout<<"Result should be: \n"<<"-0.0315082 -0.63238 0.16121\n"<<"0.653176 -0.0405703 0.21148\n"<<"-0.248026 -0.194965 -0.0234573\n" <<std::endl;return 0;
}//Created by sway on 2018/8/29./* 测试8点法求取基础矩阵F** [直接线性变换法]* 双目视觉中相机之间存在对极约束**                       p2'Fp1=0,** 其中p1, p2 为来自两个视角的匹配对的归一化坐标,并表示成齐次坐标形式,* 即p1=[x1, y1, z1]', p2=[x2, y2, z2],将p1, p2的表达形式带入到* 上式中,可以得到如下表达形式**          [x2] [f11, f12, f13] [x1, y1, z1]*          [y2] [f21, f22, f23]                = 0*          [z2] [f31, f32, f33]** 进一步可以得到* x1*x2*f11 + x2*y1*f12 + x2*f13 + x1*y2*f21 + y1*y2*f22 + y2*f23 + x1*f31 + y1*f32 + f33=0** 写成向量形式*               [x1*x2, x2*y1,x2, x1*y2, y1*y2, y2, x1, y1, 1]*f = 0,* 其中f=[f11, f12, f13, f21, f22, f23, f31, f32, f33]'** 由于F无法确定尺度(up to scale, 回想一下三维重建是无法确定场景真实尺度的),因此F秩为8,* 这意味着至少需要8对匹配对才能求的f的解。当刚好有8对点时,称为8点法。当匹配对大于8时需要用最小二乘法进行求解**   [x11*x12, x12*y11,x12, x11*y12, y11*y12, y12, x11, y11, 1]*   [x21*x22, x22*y21,x22, x21*y22, y21*y22, y22, x21, y21, 1]*   [x31*x32, x32*y31,x32, x31*y32, y31*y32, y32, x31, y31, 1]* A=[x41*x42, x42*y41,x42, x41*y42, y41*y42, y42, x41, y41, 1]*   [x51*x52, x52*y51,x52, x51*y52, y51*y52, y52, x51, y51, 1]*   [x61*x62, x62*y61,x62, x61*y62, y61*y62, y62, x61, y61, 1]*   [x71*x72, x72*y71,x72, x71*y72, y71*y72, y72, x71, y71, 1]*   [x81*x82, x82*y81,x82, x81*y22, y81*y82, y82, x81, y81, 1]**现在任务变成了求解线性方程*               Af = 0*(该方程与min||Af||, subject to ||f||=1 等价)*通常的解法是对A进行SVD分解,取最小奇异值对应的奇异向量作为f分解**本项目中对矩阵A的svd分解并获取其最小奇异值对应的奇异向量的代码为*   math::Matrix<double, 9, 9> V;*   math::matrix_svd<double, 8, 9>(A, nullptr, nullptr, &V);*   math::Vector<double, 9> f = V.col(8);***[奇异性约束]*  基础矩阵F的一个重要的性质是F是奇异的,秩为2,因此有一个奇异值为0。通过上述直接线性法求得*  矩阵不具有奇异性约束。常用的方法是将求得得矩阵投影到满足奇异约束得空间中。*  具体地,对F进行奇异值分解*               F = USV'*  其中S是对角矩阵,S=diag[sigma1, sigma2, sigma3]*  将sigma3设置为0,并重构F*                       [sigma1, 0,     ,0]*                 F = U [  0   , sigma2 ,0] V'*                       [  0   , 0      ,0]*/

4 参考博客

基础矩阵,本质矩阵,单应性矩阵讲解 - MKT-porter - 博客园

Opencv学习(3)——基础矩阵F、本质矩阵E、单应矩阵H 函数解析_cv基础矩阵-CSDN博客

特征检测与匹配,测试8点法求取基础矩阵F(三维重建task1-3)_计算 基本矩阵 7点法和8点法 c++-CSDN博客

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

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

相关文章

leetcode344. Reverse String

Write a function that reverses a string. The input string is given as an array of characters s. You must do this by modifying the input array in-place with O(1) extra memory. Example 1: Input: s [“h”,“e”,“l”,“l”,“o”] Output: [“o”,“l”,“l”…

ssm016基于 Java Web 的校园驿站管理系统(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;校园驿站管理系统的设计与实现 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好…

鸿蒙自定义加载 LoadingDialog

代码如下&#xff1a; Component export struct LoadingDialog {Prop title: stringbuild() {Stack() {Column() {LoadingProgress().color(Color.White).width(100).height(100)Text(this.title).fontSize(18).fontColor(0xffffff).margin({ top: 8 }).visibility(this.title …

【AI开源项目】Dify- 轻松打造可持续运营的 GPT 系列的 AI应用 —— 全面解析LLMOps平台

文章目录 什么是Dify&#xff1f;Dify的名称由来 了解LLMOpsDify的核心功能兼容多种LLMs Dify的优势完全开源核心能力 如何安装Dify快速启动使用Helm Chart在Kubernetes上部署自定义配置 使用Dify创建AI应用第一步&#xff1a;创建应用程序第二步&#xff1a;编写和调试提示词第…

【HTML】——VS Code 基本使用入门和常见操作,新手小白也能看懂

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 零&#xff1a;HTML开发工具VSCode的使用 1&#xff1a;创建项目 2&#xff1a;创建格式模板&#x…

基于springboot+vue实现的公考知识学习平台 (源码+L文+ppt)4-103

4.1 系统功能结构设计 根据对公考知识学习平台的具体需求分析&#xff0c;把系统可以划分为几个不同的功能模块&#xff1a;管理员可以对系统首页、个人中心、用户管理、讲师管理、在线咨询管理、学习资料管理、讲座信息管理、讲座预约管理、学习论坛、练习自测管理、试题管理…

计算结构力学:多自由度振动系统

本文以笔记的形式记录计算结构力学的若干基础知识。 注1&#xff1a;限于研究水平&#xff0c;分析难免不当&#xff0c;欢迎批评指正。 注2&#xff1a;文章内容会不定期更新。 预修1&#xff1a;线性代数 1. 标准特征值 复矩阵Schur分解&#xff1a;对于复矩阵&#xff0c…

将多个commit合并成一个commit并提交

0 Preface/foreword 1 压缩多个commit方法 1.1 git merge --squash 主分支&#xff1a;main 开发分支&#xff1a;test 当前在test分支提交了8个commits&#xff0c;功能已经开发完成&#xff0c;需要将test分支合并到main分支&#xff0c;但是不想在合并时候&#xff0c;看…

JVM 实战篇(一万字)

此笔记来至于 黑马程序员 内存调优 内存溢出和内存泄漏 内存泄漏&#xff08;memory leak&#xff09;&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在 GC ROOT 的引用链上&#xff0c;这个对象就不会被垃圾回收器回收&#xff0c;这种情况就称之为内…

使用Fiddler Classic抓包工具批量下载音频资料

1. 通过F12开发者工具&#xff0c;下载音频文件 浏览器打开音频列表->F12快捷键->网络->媒体&#xff0c;播放一个音频文件&#xff0c;右边媒体下生成一个音频文件&#xff0c;右击“在新标签页中打开”&#xff0c;可以下载这个音频文件。 2.通过Fiddler Classic抓…

新能源行业必会基础知识---电力现货问答---第9问---什么是输电权?什么是输电权市场?

新能源行业必会基础知识-----电力现货问答-----主目录-----持续更新https://blog.csdn.net/grd_java/article/details/142909208 虽然这本书已经出来有几年了&#xff0c;现货市场已经产生了一定变化&#xff0c;但是原理还是相通的。还是推荐大家买来这本书进行阅读观看&#…

音视频入门基础:AAC专题(11)——AudioSpecificConfig简介

音视频入门基础&#xff1a;AAC专题系列文章&#xff1a; 音视频入门基础&#xff1a;AAC专题&#xff08;1&#xff09;——AAC官方文档下载 音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件 音视频入门基础&#xff1a;AAC…

java-web-day5

1.spring-boot-web入门 目标: 开始最基本的web应用的构建 使用浏览器访问后端, 后端给浏览器返回HelloController 流程: 1.创建springboot工程, 填写模块信息, 并勾选web开发的相关依赖 注意: 在新版idea中模块创建时java下拉框只能选17, 21, 23 这里选17, maven版本是3.6.3, 很…

基于SSM的智能台球厅系统

基于SSM的智能台球厅系统设计与实现 摘要 智能台球厅系统是一个以用户便捷体验为核心的管理系统&#xff0c;结合SSM&#xff08;Spring、Spring MVC、MyBatis&#xff09;框架来实现台球厅日常业务流程的自动化和智能化管理。系统主要包含用户预约、场地管理、设备状态监控、支…

String的长度有限,而我对你的思念却无限延伸

公主请阅 1. 为什么学习string类&#xff1f;2. string类的常用接口2.1 string类对象的常见构造2.1.1 string 2.2 operator[]2.3 迭代器2.4 auto自动推导数据类型2.5 范围for2.6 迭代器第二层2.7 size和length获取字符串的长度2.8 max_size 获取这个字符串能设置的最大长度2.9 …

spring-第十一章 注解开发

spring 文章目录 spring前言1.注解回顾1.1原理1.2springIOC注解扫描原理1.2.1解释1.2.2案例 2.声明bean的注解补充&#xff1a;Bean注解&#xff0c;管理三方包对象 3.spring注解的使用3.1加入aop依赖3.2配置文件中添加context命名空间3.3配置文件中指定要扫描的包3.4在Bean上使…

Linux 之 文件属性与目录、字符串处理、系统信息获取

学习任务&#xff1a; 1、 文件属性与目录&#xff1a;Linux 文件类型、stat、chmod、链接文件、目录文件 2、 字符串处理&#xff1a;字符串输入/输出、strlen、strcat、strcpy、memset、atoi()、atol()、atoll() 3、 系统信息&#xff1a;proc 虚拟文件系统&#xff08;重点&…

搜索引擎算法更新对网站优化的影响与应对策略

内容概要 随着互联网的不断发展&#xff0c;搜索引擎算法也在不断地进行更新和优化。了解这些算法更新的背景与意义&#xff0c;对于网站管理者和优化人员而言&#xff0c;具有重要的指导意义。不仅因为算法更新可能影响到网站的排名&#xff0c;还因为这些变化也可能为网站带…

省域经济高质量发展水平测算及数据2000-2021年

经济高质量发展水平测算&#xff0c;是通过一系列科学的方法和指标&#xff0c;对经济活动的各个方面进行评估和量化的过程。这不仅涉及到经济增长的速度&#xff0c;更涵盖了效益、效率、可持续性等多个维度。包含了2000年至2021年期间&#xff0c;全国31个省份、自治区、直辖…

MacOS/Macbook用户自定义字体安装教程

Mac本自定义字体 示例机型一、下载相关字体文件到本地二、打开启动台三、选择其他四、选择字体册五、添加字体六、选择字体七、安装字体八、安装完成 MacOS官网安装教程 示例机型 系统&#xff1a;MacOS12.6&#xff0c;芯片&#xff1a;M1Pro 一、下载相关字体文件到本地 二…