精华内容
下载资源
问答
  • 计算机视觉---4---多视角几何
    2015-05-28 11:06:00

    单个相机只能获得一幅图像。实际意义是三维空间在二维空间上的一个投影。准确的说是变形的投影,因为相机投影关系和三维空间在二维基上最小二乘映射并不完全相同。那我是不是能设计一种可以映射的相机模型?

    多视角几何的极线约束

    这里写图片描述
    一个点总是在一个平面上,这个平面必然会过两个相机的光心,这就对点在两个相机中的关系又了一个约束。

    1P=12T2P


    式中1,2分别表示相机1和相机2的坐标系。T表示两个坐标系的变换矩阵

    12T=(12R0T12T1)
    12T=OO
    OP[OO×OP]=0
    p[t×(Rp)]=0

    这里是把所有向量都在1坐标系下表示的写法,把向量表达为坐标值OP 在 O 坐标系下的表示不需要平移(因为是向量所以无所谓从哪儿开始)
    那么称[t×R]为极几何的本征矩阵。它描述了极几何的性质。

    [t×R]=[t×]R


    矩阵为R3×3 9个参数即可确定。

    弱标定

    如果相机没有经过内部标定,代入的是图像点坐标而不是相机坐标系坐标,那么可以找到两幅图像8个点对,求取极几何矩阵。这种求法成为弱标定。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

     

    转载于:https://www.cnblogs.com/ironstark/p/4892621.html

    更多相关内容
  • 动态语义SLAM 目标检测 VSLAM 光流/多视角几何动态物体检测 octomap地图 目标数据库
  • Multiple View Geometry多视角几何中文扫描版PDF,安徽大学出版社
  • 国外计算机视觉领域经典教材《计算机视觉中的多视角几何》全套PPT,希望对大家学习CV有所帮助!
  • 计算机视觉之三维重建-多视角几何

    千次阅读 2022-04-25 10:54:44
    多视图几何笔记1.运动恢复结构问题2.三种典型的运动恢复结构任务2.1欧式结构恢复(相机内参数已知,外参数未知)2.2仿射结构恢复(摄像机为仿射相机,内、外参数均未知)2.2.1数据中心化2.2.2...(如果多视角图是由一个


    对北邮鲁鹏老师的计算机视觉之三维重建课所做的笔记。

    1.运动恢复结构问题

    在这里插入图片描述
    在这里插入图片描述
    已知多个图像上的对应点坐标,求出相机的投影矩阵M对应点的三维坐标

    2.三种典型的运动恢复结构任务

    2.1欧式结构恢复(相机内参数已知,外参数未知)

    在这里插入图片描述
    已知内参、多点的图像坐标,求外参和三维坐标。(如果多视角图是由一个相机拍摄,只需要知道一个相机的内参,如果是多个相机拍摄,需要多个相机的内参
    在这里插入图片描述

    世界坐标系放在第一个相机坐标系O1下,这样第一个相机的外参矩阵[I 0]已知。只需要求出R,T。(如何求出R,T?)
    答:用本质矩阵F基础矩阵E能求出
    在这里插入图片描述
    求解出三维点坐标Xj的流程:
    1.在两幅图像上取8对点。求出基础矩阵F归一化八点法在极几何里有讲)
    2.已知基础矩阵F、两个相机的内参数K1、K2求出本质矩阵E
    3.分解本质矩阵E,求出旋转矩阵R、平移矩阵T(该方法的核心
    4.利用三角化(线性法或者非线性法)求出三维点坐标Xj
    如何把E分解成R、T?
    在这里插入图片描述
      x 2 T F x 1 = 0 \ x_2^TFx_1=0  x2TFx1=0得出F的符号和尺度无法确定,所以E的尺度和符号也无法确定。
    在这里插入图片描述

    为了能用E推出R、T给出了两个矩阵W,Z,这两个矩阵是为了方便推导后面的公式直接给出的,没有什么特别意义,diag(1,1,0)是单位阵最后一行的1变成0,在相差一个正负号的情况下,Z=diag(1,1,0)W=diag(1,1,0) W T W^T WT
    所以得出 E=[ T x ] R = U Z U T R = U d i a g ( 1 , 1 , 0 ) W U T R \textbf{E=[}T_x]R=UZU^TR=Udiag(1,1,0)WU^TR E=[Tx]R=UZUTR=Udiag(1,1,0)WUTR,
    在这里插入图片描述
    调用奇异值分解SVD分解算法直接算出 U和V,所以 V T = W U T R V^T=WU^TR VT=WUTR
    由于W和U都是正交矩阵 W − 1 = W T , U − 1 = U T W^{-1}=W^T,U^{-1}=U^T W1=WT,U1=UT.就能求出R了,由于E的两种表示形式,可以求出两个不同的R(注意:旋转矩阵是正交变换、不改变定向、行列式为1。如果矩阵的各列向量都是单位向量,并且两两正交(就是垂直)。那么就说这个矩阵是正交矩阵。)
    在这里插入图片描述
    对[ T x T_x Tx]进行SVD分解,拿出 U T U^T UT的第三列就是T(无法确定符号)
    在这里插入图片描述
    因为符号无法确定,所以可能出现4种情况,只有一种情况是正确的。
    在这里插入图片描述
    通过对多个点进行重建,找出符合实际的正确的一组解
    在这里插入图片描述
    歧义:如果只有一张图,我们无法知道建筑物的实际高度,但是我们加入先验信息,比如人的实际高度,我们就能得到建筑物的实际高度。
    在这里插入图片描述
    欧式结构恢复:恢复的结构与真是场景之间相差一个相似变换(旋转、平移、缩放)为什么旋转平移也无法确定呢?
    因为这是把世界坐标系定在了相机坐标系O1上了,所以并不知道物体实际的东南西北朝向。

    2.2仿射结构恢复(摄像机为仿射相机,内、外参数均未知)

    在这里插入图片描述
    仿射相机:如果R,Q,P点到平面π的距离远小于其到相机的距离时,可近似的看成R,Q,P同处在平面π上。
    好处:从三维点到像素点的映射仅相差一个固定的系数。把Z固定为 Z 0 Z_0 Z0
    在这里插入图片描述
    仿射相机M矩阵与一般相机的M矩阵不同就是把v变成0.M是3*4的矩阵
    在这里插入图片描述

    这里回顾一下x是图像平面上的齐次坐标,降一维变成 x E x^E xE变成欧式坐标,下面同理,X是摄像机坐标系下的齐次坐标[x,y,z,1],所以在仿射变换里 m 3 X = 1 m_3X=1 m3X=1
    最后经过几次变换,让世界坐标系到图像坐标系的映射不经过齐次变换,而直接用欧式变换完成映射 即 x E = A X E + b x^E=AX^E+b xE=AXE+b
    在这里插入图片描述
    最后仿射结构恢复问题就变成了求解:1.三维点坐标 2.投影矩阵A和b
    (如何求解?)1.数据中心化 2.因式分解获得运动与结构
    在这里插入图片描述

    2.2.1数据中心化

    在这里插入图片描述
    这里的小写x都是图像平面的像素点坐标,2x1的矩阵,大写X是世界坐标系的坐标3x1的矩阵,b被消掉了。B站讲解定位:如果把3D点的均值点当做世界坐标系的坐标原点,就可以直接完成中心化后的像素坐标点三维坐标点X的映射关系,即 x i j ^ = A i X j \hat{x_{ij}}=A_iX_j xij^=AiXj,跳过中间的 X j ^ \hat{X_j} Xj^过程。
    在这里插入图片描述
    x i j x_{ij} xij中的i代表第几个相机,j代表第几个点,例 x 23 x_{23} x23代表第2个相机上的第3个点。虽然D写得很大,但是D的秩只能为3,此时要解出M,S。(对D进行奇异值分解

    2.2.2奇异值分解

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    由于D的秩为3,所以理论上只有三个特征值(实际不是,但是我们取出最大的三个特征值当做近似),依据最大的3个特征值得出U,W,V。其中U为2mx3 ,W为3x3, V T V^T VT为3xn。最后M=U,S=W V T V^T VT,解出了M,S。(歧义:M=UW,S= V T V^T VT也可以,由于这两种分解都可以,所以产生歧义,后面会讲)
    在这里插入图片描述
    缺点:如果其中存在一个点没有被所有相机看到,那么计算得不到准确值。
    在这里插入图片描述
    总结:这里也是尺度无法确定的问题,M*可以表示成M与一个3x3的可逆矩阵H相乘,由于H不唯一所以会产生物体倾斜的歧义。
    在这里插入图片描述
    其中-8是因为其中有H矩阵的8个未知量是求不出来的。因为不在乎H矩阵的尺度,所以3x3矩阵H只有8个未知量(相当于本身9个未知量,因为不在乎尺度,就全都除以第九个未知量,第九个未知量变成1,所以只有8个未知量了。)
    目的:该系统为了得出解必须要2mn>=8m+3n-8,其中m为相机数,n为取点数。

    2.3透视结构恢复(摄像机为透视相机,内、外参数均未知)

    在这里插入图片描述
    待解决的问题。
    在这里插入图片描述
    首先讲必定会产生歧义,既然求不了真实的解,就把这个歧义利用起来。这里的H是4x4的矩阵,这里的映射是齐次空间的映射(与欧式恢复结构一样)。
    在这里插入图片描述
    为了求出结果需要2mn>=11m+3m-15
    在这里插入图片描述
    困难点:已知信息太少。下面给出两种方法。

    2.3.1代数方法(三角化)

    在这里插入图片描述
    重点在第二步,直接用F基础矩阵求出M1,M2 。
    在这里插入图片描述
    由于存在歧义,我们求M1也可以通过矩阵变换转换成求M*,用 H − 1 H^{-1} H1把M1变成 M 1 ∗ M_1{^*} M1=[I|0],这是个标准化相机矩阵,这时候 M 2 ∗ M_2{^*} M2=[A|b]完全未知,所以要把它求出来。
    在这里插入图片描述ppt上的 X ^   \hat{X}{~} X^ 写错了,应该是 X ∗ X^* X.现在就是为了求出M2*,X*.推导过程可以去看https://www.bilibili.com/video/BV1aU4y1T74j?t=1576.4.经过推导得F=[ b x b_x bx]A
    (现已知 x ′ T F x = 0 x^{'T}Fx=0 xTFx=0 , F=[ b x b_x bx]A)
    在这里插入图片描述
    利用编程把b,A求出来,不管b是多少,只要已知F,并且令 F T F^T FT与一个向量相乘等于零,那个向量就是b。由于 b T F = 0 b^TF=0 bTF=0由前面的基础矩阵关系可知,b就是极几何中的极点。至此求出了 M 2 M_2 M2*
    在这里插入图片描述
    最后利用三角化,求出 X j X_j Xj

    2.3.2捆绑调整(BA)

    在这里插入图片描述
    因式分解法的缺点:1.有遮挡不能重建 2.对应点没有选好不能重建
    代数法的缺点:一般用于2视图重建,多视图容易累积误差
    捆绑调整法核心思想:实际上真实点的投影有误差, X j X_j Xj的真实投影是 x 1 j , x 2 j , . . . . . x_{1j},x_{2j},..... x1j,x2j,.....但是用相机投影矩阵M算出来的点与之存在误差,所以重构点与真实点并不重合,为了减小误差,采用最小化重投影误差的方式,让误差在所有平面上的整体最小。
    在这里插入图片描述
    在这里插入图片描述
    通常用到SFM或者SLAM的最后一步。(接下来讲SFM系统)

    展开全文
  • Deep learning has recently demonstrated its excellent performance for multi-view stereo (MVS). However, one major limitation of current learned MVS approaches is the scalability: thememory-...
  • 视图几何中,使用L∞范数进行优化已成为越来越重要的领域。 先前的工作表明,使用广义分数规划的公式可以可靠地计算全局最优解,其中,算法可独立解决一系列凸问题,以逼近最优L∞范数误差。 我们发现凸问题的...
  • 利用多视角几何理论获得环境深度信息。机器人的同步定位与地图构建是通过对观测模型进行一阶泰勒近似,以及Rao-Blackwellised粒子滤波迭代进行的。在MT-R移动机器人研究平台进行实验,实验结果表明所提出的方法在...
  • TheiaSfM, 基于运动的多视角几何和结构的开源库 版权 2015 -2016 Chris Sweeney ( sweeney.chris. m@gmail.com ) UC Santa这个库是什么?Theia是由 Chris Sweeney创建的end-to-end structur
  • 经典的计算机视觉多视角几何教材和相应代码,望大家参考学习
  • 针对上述问题,我们提出了结合多视角几何和注意力机制的通用神经辐射场 GRF (如图 1),GRF的单个模型就可以推断出全新类别物体的高质量新视角合成图像。本文的主要贡献包括以下三点: 第一,我们提出了一个用于...

    点击上方“3D视觉工坊”,选择“星标”

    干货第一时间送达

    作者丨Bo Yang@知乎(已授权)

    来源丨https://zhuanlan.zhihu.com/p/399867075

    编辑丨极市平台

    导读

     

    本文提出了结合多视角几何和注意力机制的通用神经辐射场 GRF,GRF的单个模型就可以推断出全新类别物体的高质量新视角合成图像。

    论文链接:https://arxiv.org/abs/2010.04595

    TensorFlow 代码:https://github.com/alextrevithick/GRF


    1. Introduction

    恢复三维模型形状是当前三维感知和理解任务的关键问题之一。经典几何方法如SFM和SLAM只能重建稀疏、离散的点云,无法包含几何细节。近年来,大部分深度神经网络也都是学习显式的表征形式,如点云、网格、体素等,但这些方式都是离散和稀疏的,且限制了所恢复三维形状的空间分辨率。此外,这些方法通常需要大量的三维形状作为监督,通常会导致训练的模型过拟合,泛化性较低。

    2. Motivation

    近期,以ECCV 2020 NeRF [1] 为代表的神经网络隐式场方法在表征三维模型的几何细节和新视角合成等任务上取得了很好的效果。但当前NeRF方法仍存在两个局限:

    第一,每个MLP网络只能表征一个单一的结构,不能泛化到新的几何形状上进行表征;

    第二,由于沿着光线的每个空间点位置的形状和外观仅由单个像素RGB进行优化,使该位置没有学习到更丰富的几何信息,导致最终渲染图像不够逼真。

    针对上述问题,我们提出了结合多视角几何和注意力机制的通用神经辐射场 GRF (如图 1),GRF的单个模型就可以推断出全新类别物体的高质量新视角合成图像。本文的主要贡献包括以下三点:

    第一,我们提出了一个用于表征三维形状和外观的通用神经辐射场,对新的几何形状有更强的通用性。

    第二,我们集成了多视图几何和注意力机制,可以更好的学习到每条光线上3D空间点的一般局部几何信息,从而提高了新视角图像的合成质量。

    第三,我们在大规模数据集上的训练结果表明我们的方法能显著提升baseline,并通过一系列消融实验验证了本方法的优势和合理性。

    图 1:GRF 示意图

    3. Method

    3.1 Overview

    GRF方法首先提取每条射线上空间点对应像素的通用性特征,然后重投影这些特征到对应的3D空间点,使用注意力机制融合多视角像素特征,从而得到每个3D点唯一的特征值,再通过MLP从这些特征中推理出相应的RGB值和体积密度(Volume Density),最后使用Volume Rendering方法,将同一条光线上的多个查询点进行累积渲染,得到最后的像素值。其结构图如图2所示。具体一共包括四个模块。

    图 2:GRF原理结构图

    3.2 模块一:Extracting General Features for 2D Pixels

    二维图像的每个像素都描述了空间中一个确定的三维点,为了学习每条光线的局部几何性质,我们需要得到每个像素的通用特征。但是由于RGB值对光照条件、环境噪声等因素很敏感,导致鲁棒性较差。我们设计了基于CNN的encoder-decoder结构用于提取更加鲁棒和通用的像素特征。

    像素的通用特征提取模块如图3所示,我们设计的结构不是直接将原始的RGB图像输入到CNN网络中,而是将RGB值与图像当前位置的视角方向(即沿着相机光心到每个像素点的射线方向)堆叠后作为输入。这样做的目的是允许学习的像素特征可以明确地意识到它在3D空间中的相对位置。 除此之外,我们使用了Skip Connection 来保留每个像素的高频局部特征,同时在CNN模块的中间选择性地集成了几个全连接层来学习全局特征。这种多层级特征的混合使得最终结果更具有普遍性和代表性。

    图 3:基于CNN结构的特征提取模块

    3.3 模块二:Reprojecting 2D Features to 3D Space

    为了将上一步提取的像素特征与空间中的3D点进行对应,考虑到提取的像素特征是对从相机光心发射到三维物体表面的光线的描述,我们自然的想到了可以将这个特征沿着光线重投影。但由于我们没有每个像素对应的深度信息,所以无法确定该像素特征是对应哪个特定的三维表面点。我们的做法是认为沿相机光心穿过像素的射线上的每个空间点都可以用同一个像素特征值进行表示。

    图 4:像素特征到3D空间的重投影过程

    如图4,此模块表示像素特征到空间中的3D点重投影过程,输入为3D 点p,重投影的过程如下式所示,该函数P()遵循多视图几何原理 [2],得到的特征F表示空间中点p在不同图像中对应的像素特征。

    3.4 模块三:Obtaining General Features for 3D Points

    给定一个空间点p,现在可以从每张图像上得到各自对应的像素特征,但如何得到该空间点p最终的一个特征值还是一个问题。因为每个3D场景的输入图像总数和顺序都是可变的。因此,得到的特征向量也是无序的,大小是任意的。其次,由于视觉遮挡的问题,无法确定哪些特征是空间点的真实描述。为了解决这个问题,如图5,我们采用了注意力机制方法,比如AttSets [3] 和Slot Attention [4],将多视角投影的特征向量聚合为点p唯一对应的特征值。对于每个查询的3D点p,其最终特征显式地保留了2D图像的通用特征和3D空间中的位置信息。这使得3D点特性对自身的几何形状和外观具有一定的普遍性和代表性。

    图 5:将多个3D点像素特征向量聚合为一个特征向量

    3.5 模块四:Rendering 3D Features via NeRF

    渲染模块仍然使用经典的NeRF结构,如图6所示,我们输入点p对应的特征值和光线方向,然后通过MLP预测出RGB和体积密度。GRF可以通过输入渲染的光线直接合成新的二维图像,且整个网络只需要一组2D图像就可以训练,不需要3D数据进行监督。

    图 6:使用NeRF结构预测每个点的颜色和密度

    4. Experiments

    在这一部分,我们针对GRF在同类别不同物体、不同类别物体、不同场景进行泛化性实验,并测试了单场景的渲染质量。最终验证,我们的GRF在多种情况下都具有很好的泛化性,并且可以合成更加真实的新视图。

    4.1. Generalization to Unseen Objects

    首先我们评估了GRF在同一类别的不同物体上测试新视角合成的结果。由于NeRF不可同时学习大量场景,故不作为baseline进行对比。从表1可以看出,GRF在汽车类别上取得了与SRN [5]相当的性能,在两组中都实现了新视图合成。值得注意的是,我们的GRF仅需要训练一次就可以对新的物体进行预测,而SRN则需要对所有新对象进行重新训练用来优化latent code。结果表明, GRF学习到的局部像素特征使其在新物体上的泛化性更强。新视角合成的效果如图7所示,GRF更接近Ground Truth, SRN无法恢复不进行再训练的汽车的真实形状。

    表 1:在ShapeNetV2数据集上的定量结果对比
    图 7:定下结果比较

    4.2. Generalization to Unseen Categories

    我们进一步评估了GRF针对不同类别模型的结果。结果如表2所示。值得注意的是,SRN方法在新的类别上首先进行了再训练过程,结果可以看出,我们的GRF在新类别上可以保持相似的性能,显示出较强的泛化能力。

    表 2:GRF和SRN在新类别下的定量对比分析

    4.3. Generalization to Unseen Scenes

    我们在一个更复杂的数据集Synthetic-NeRF 上进一步评估了GRF的泛化性能。我们在随机选择的4个场景上训练一个模型,分两组进行实验,第一组评估学习到的特征是否能够真正泛化到新的场景中,第二组评估了GRF的初始学习到的特征如何转移到新场景中。

    通过表3和图8我们可以看到,我们的GRF在具有复杂几何的新场景上也具有很好的效果,证明了GRF可以有效的学习点的局部特征。此外,从Group2 的结果可以看出,我们可以在迭代次数少的同时学习到高质量的新场景表征,更多结果请查看论文附录。

    表 3:定量结果对比
    图 8:定性结果对比

    4.4. Pushing the Boundaries of Single Scenes

    GRF除了对没有见过的物体和场景的进行泛化性测试外,其学习到的像素特征也有望显著提高单场景渲染图像的质量。我们使用LLFF[6]和SRN作为baseline,对每个场景单独训练一个模型,测试其单场景的渲染效果。

    表 4:单个真实场景学习的定量结果对比
    图 9:单个复杂场景下的定性结果对比
    表 5:Ablation study结果对比

    5. 结语

    最后总结一下,我们提出的GRF方法将三维几何建模为通用的神经辐射场。我们证明它可以从一组二维观测中学习到通用和鲁棒的三维点特征。利用多视图几何原理将二维像素特征映射到三维空间,并利用注意机制隐式的解决视觉遮挡问题,最终我们的GRF可以合成更加真实的新视图。当然GRF可以进一步提高:1)可以设计更高级的CNN模块,学习更好的像素特征。2)深度信息可以集成到网络中,以明确地解决视觉遮挡。

    欢迎大家关注我们更多的新工作,https://yang7879.github.io/

    (多谢魏小康博士翻译整理!)

    参考文献

    [1] Ben Mildenhall,Pratul P. Srinivasan,Matthew Tancik,Jonathan T Barron,Ravi Ramamoorthi,and Ren Ng. NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis. _European Conference on Computer Vision,_pages 405–421,2020.

    [2] Richard Hartley and Andrew Zisserman. Multiple View Geometry in Computer Vision. Cambridge University Press,2004.

    [3] Bo Yang,Sen Wang,Andrew Markham,and Niki Trigoni. Robust Attentional Aggregation of Deep Feature Sets for Multi-view 3D Reconstruction. International Journal of Computer Vision,128:53–73,2020.

    [4] Francesco Locatello,Dirk Weissenborn,Thomas Un- 949 terthiner,Aravindh Mahendran,Georg Heigold,Jakob 950 Uszkoreit,Alexey Dosovitskiy,and Thomas Kipf. Object-Centric Learning with Slot Attention. _Advances in Neural Information Processing Systems,_2020.

    [5] Vincent Sitzmann,Michael Zollho ̈fer,and Gordon Wet- zstein. Scene Representation Networks: Continuous 3D- Structure-Aware Neural Scene Representations. Advances in Neural Information Processing Systems,pages 1119-1130,2019.

    [6] Ben Mildenhall,Pratul Srinivasan,Rodrigo Ortiz-Cayon,Nima Khademi Kalantari,Ravi Ramamoorthi,Ren Ng,and Abhishek Kar. Local light field fusion: Practical view synthesis with prescriptive sampling guidelines. SIGGRAPH,2019.

    本文仅做学术分享,如有侵权,请联系删文。

    下载1

    在「3D视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

    下载2

    在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。

    下载3

    在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

    重磅!3DCVer-学术论文写作投稿 交流群已成立

    扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

    同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

    一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

    ▲长按加微信群或投稿

    ▲长按关注公众号

    3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列三维点云系列结构光系列手眼标定相机标定orb-slam3等视频课程)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

    学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

     圈里有高质量教程资料、可答疑解惑、助你高效解决问题

    觉得有用,麻烦给个赞和在看~  

    展开全文
  • 本资源包含:慕尼黑工业大学(TUM)Multiple View Geometry课程讲义、作业和作业解答
  • 除了上述内容外,其中摄像机视图几何及其计算方法,值得读者关注。这是因为当前计算机的性能价格比大大提高,使人们有条件在视觉系统中使用更的摄像机,以利用冗余的信息,来换取系统对噪声的鲁棒性。系统对噪声...
  • 《计算机视觉中的视图几何》匹配源代码,matlab中关于三维重建的源代码
  • 计算机视觉——视图几何

    千次阅读 2020-04-21 23:41:10
    视图几何1.前言1.1 视图几何概念2. 基本原理2.1 对极几何2.2 基础矩阵2.2.1 基础矩阵推导2.2.2 求解基础矩阵3. 实验过程3.1 实验数据准备3.2 实验代码3.3 实验结果及分析4. 实验中遇到的问题 1.前言 1.1 视图...

    1.前言

    1.1 多视图几何概念

    多视图几何是利用在不同视点所拍摄图像间的关系,来研究照相机之间或者特征之间关系的一门科学。

    多视图几何(Multiple View Geometry)多视图几何主要研究用几何的方法,通过若干幅二维图像,来恢复三维物体。换言之就是研究三维重构,主要应用与计算机视觉中。

    三维重构,即如何从静止物体不同视点下的图像中恢复物体三维几何结构信息。

    在三维重构的过程中摄像机标定是一个极其重要环节,摄像机标定的研究分为三个部分:
    (1)基于场景结构信息的标定;
    (2)基于摄像机主动信息(纯旋转)的自标定;
    (3)不依赖场景结构和摄像机主动信息的自标定。

    2. 基本原理

    2.1 对极几何

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

    如下图所示,X为空间中的一点,x和x’为X在不同像平面中的投影,其中X与C, C’, x, x’ 共面。

    tips:如果知道空间中点X在一幅图像中的投影点x,是无法确定空间中点X的位置以及X在其他图像中的投影点。

    这里可以明确如下概念:

    对极平面束(epipolar pencil):以基线为轴的平面束;下图给出了包含两个平面的对极平面束。

    对极平面(epipolar plane):任何包含基线的平面都称为对极平面,或者说是对极平面束中的平面;例如,下图中的平面π就是一个对极平面。

    对极点(epipole):摄像机的基线与每幅图像的交点;即下图中的点e和e’。

    对极线(epipolar line):对极平面与图像的交线;例如,上图中的直线l和l’。

    在这里插入图片描述
    点x、x’与摄像机中心C和C’是共面的,并且与空间点X也是共面的,这5个点共面于平面π,这是一个最本质的约束,即5个点决定了一个平面π。

    由该约束,可以推导出一个重要性质:由图像点x和x’反投影的射线共面,并且,在平面π上。 在搜索点对应中,该性质非常重要
    由此引出基础矩阵的概念。

    2.2 基础矩阵

    2.2.1 基础矩阵推导

    在这里插入图片描述
    如上图所示,设X分别以C,C’为坐标原点,x的坐标被表示为p和p’,则有
    p = R p ′ + T p=Rp'+T p=Rp+T
    其中R、T表示在两个坐标系之间的旋转和位移。
    在以C为坐标系原点的时候有: x = K p ⇒ p = K − 1 x x=Kp \Rightarrow p=K^{-1}x x=Kpp=K1x
    在以C’为坐标系原点的时候有: x ′ = K ′ p ′ ⇒ p ′ = K ′ − 1 x ′ x'=K'p' \Rightarrow p'=K'^{-1}x' x=Kpp=K1x
    根据三点共面的性质可以知道:
    ( p − T ) T ( T × p ) = 0 (p-T)^T(T×p)=0 (pT)T(T×p)=0
    又因为 p = R p ′ + T p=Rp'+T p=Rp+T得到 p − T = R p ′ p-T=Rp' pT=Rp,所以上式可化简如下:
    ( R T p ′ ) T ( T × p ) = 0 (R^Tp')^T(T×p)=0 (RTp)T(T×p)=0
    其中 T × p = S p T×p=Sp T×p=Sp,又 S = [ 0 − T z T y T z 0 − T x − T y T x 0 ] S=\begin{bmatrix} 0& -T_z & T_y\\ T_z& 0 &-T_x \\ -T_y& T_x & 0 \end{bmatrix} S=0TzTyTz0TxTyTx0
    所以 ( R T p ′ ) T ( T × p ) = 0 (R^Tp')^T(T×p)=0 (RTp)T(T×p)=0可写为下式:
    ( R T p ′ ) T ( S p ) = 0 ⇒ ( p ′ T R ) ( S p ) = 0 ⇒ p ′ T E p = 0 (R^Tp')^T(Sp)=0\Rightarrow (p'^TR)(Sp)=0\Rightarrow p'^TEp=0 (RTp)T(Sp)=0(pTR)(Sp)=0pTEp=0
    最终得到的如上式为本质矩阵。本质矩阵描述了空间中的点X在两个坐标系中的坐标对应关系。

    根据上一篇博客中提到的 K K K K ′ K' K分别为两个相机的内参矩阵,有:
    p = K − 1 x p ′ = K ′ − 1 x ′ p=K^{-1}x \quad \quad p'=K'^{-1}x' p=K1xp=K1x
    用上式代替 p ′ T E p = 0 p'^TEp=0 pTEp=0 中的p和p’ 可以得到下式:
    ( K − 1 x ) T E ( K ′ − 1 x ′ ) = 0 (K^{-1}x)^TE(K'^{-1}x')=0 (K1x)TE(K1x)=0

    ⇒ x ′ T K − T E K − 1 x = 0 \Rightarrow x'^TK^{-T}EK^{-1}x=0 xTKTEK1x=0

    ⇒ x ′ T F x = 0 \Rightarrow x'^TFx=0 xTFx=0
    经推到得到了上述基础矩阵 F F F,基础矩阵描述了空间中的点在两个像平面中的坐标对应关系。

    注意:
    分别以C,C’为坐标原点,x的坐标被表示为p和p’,则有下式:
    p ′ T E p = 0 p'^TEp=0 pTEp=0
    其实E表示p’和p之间的位置关系,E为本质矩阵。

    2.2.2 求解基础矩阵

    基本矩阵是由下述方程定义:
    x ′ T F x = 0 x'^TFx=0 xTFx=0
    其中 x ↔ x ′ x ↔ x ′ x↔x'x↔x′ xxxx是两幅图像的任意一对匹配点。由于每一组点的匹配提供了计算 F F F系数的一个线性方程,当给定至少7个点(3×3的齐次矩阵减去一个尺度,以及一个秩为2的约束),方程就可以计算出未知的 F F F
    记点的坐标为 x = ( x , y , 1 ) T , x ′ = ( x ′ , y ′ , 1 ) T , x=(x,y,1)^T,x'=(x',y',1)^T, x=(x,y,1)Tx=(x,y,1)T则对应的方程为:
    [ x x 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} x& x& 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 [xx1]f11f21f31f12f22f32f13f23f33xy1=0
    展开后有:
    x ′ x f 11 + x ′ y f 12 + x ′ f 13 + y ′ x f 21 + y ′ y f 22 + y ′ f 23 + x f 31 + y f 32 + f 33 = 0 x'xf_{11}+x'yf_{12}+x'f_{13}+y'xf_{21}+y'yf_{22}+y'f_{23}+xf_{31}+yf_{32}+f_{33}=0 xxf11+xyf12+xf13+yxf21+yyf22+yf23+xf31+yf32+f33=0
    把矩阵 F F F写成列向量的形式,则有:
    [ x ′ x x ′ y x ′ y ′ x y ′ y y ′ x y 1 ] f = 0 [x'x \quad x'y \quad x' \quad y'x \quad y'y \quad y' \quad x \quad y \quad 1]f=0 [xxxyxyxyyyxy1]f=0
    给定 n n n组点的集合,我们有如下方程:
    A f = [ 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 ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ 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 ] f = 0 Af=\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\\ ⋮ & ⋮& ⋮& ⋮& ⋮ &⋮ & ⋮& ⋮&⋮ \\ 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}f=0 Af=x1x1xnxnx1y1xnynx1xny1x1ynxny1y1ynyny1ynx1xny1yn11f=0

    如果存在确定(非零)解,则系数矩阵 A A A的秩最多是 8 8 8。由于F是齐次矩阵,所以如果矩阵 A A A的秩为 8 8 8,则在差一个尺度因子的情况下解是唯一的。可以直接用线性算法解得。

    如果由于点坐标存在噪声则矩阵 A A A的秩可能大于 8 8 8(也就是等于 9 9 9,由于 A A A n ∗ 9 n*9 n9的矩阵)。这时候就需要求最小二乘解,这里就可以用SVD来求解,ff的解就是系数矩阵 A A A最小奇异值对应的奇异向量,也就是 A A A奇异值分解后 A = U D V T A=UDV^T A=UDVT
    中矩阵 V V V的最后一列矢量,这是在解矢量 f f f在约束 ∥ f ∥ \left \| f\right \| f下取 ∥ A f ∥ \left \|Af \right \| Af最小的解。

    求解基础矩阵可分为如下两步:

    1. 求线性解。由系数矩阵 A A A最小奇异值对应的奇异矢量 f f f求的 F F F
    2. 奇异性约束。是最小化Frobenius范数 ∥ F − F ′ ∥ \left \|F-F' \right \| FF的F’代替F。

    8点求解基础矩阵算法是计算基本矩阵的最简单的方法。为了提高解的稳定性和精度,往往会对输入点集的坐标先进行归一化处理。

    3. 实验过程

    3.1 实验数据准备

    在本次实验中,拍摄三组不同的图像来求解基础矩阵并且观察极线的分布,数据如下:
    第一组数据:左右拍摄,极点位于图像平面上(左右拍摄)
    在这里插入图片描述
    第二组数据:像平面接近平行,极点位于无穷远(左右平移)
    在这里插入图片描述
    第三组数据:图像拍摄位置位于前后(远近不同)
    在这里插入图片描述

    3.2 基础矩阵的计算

    关于基础矩阵的计算,本次实验设计7点、8点、10点计算基础矩阵,对于匹配点的个数对于基础矩阵的结果有何影响。

    3.2.1 实验代码

    from PIL import Image
    from numpy import *
    from pylab import *
    import numpy as np
    from PCV.geometry import camera
    from PCV.geometry import homography
    from PCV.geometry import sfm
    from PCV.localdescriptors import sift
    # Read features
    # 载入图像,并计算特征
    im1 = array(Image.open('data/5.jpg'))
    sift.process_image('data/5.jpg', 'im5.sift')
    l1, d1 = sift.read_features_from_file('im5.sift')
    im2 = array(Image.open('data/6.jpg'))
    sift.process_image('data/6.jpg', 'im6.sift')
    l2, d2 = sift.read_features_from_file('im6.sift')
    # 匹配特征
    matches = sift.match_twosided(d1, d2)
    ndx = matches.nonzero()[0]
    # 使用齐次坐标表示,并使用 inv(K) 归一化
    x1 = homography.make_homog(l1[ndx, :2].T)
    ndx2 = [int(matches[i]) for i in ndx]
    x2 = homography.make_homog(l2[ndx2, :2].T)
    x1n = x1.copy()
    x2n = x2.copy()
    print(len(ndx))
    figure(figsize=(16,16))
    sift.plot_matches(im1, im2, l1, l2, matches, True)
    show()
    # Don't use K1, and K2
    #def F_from_ransac(x1, x2, model, maxiter=5000, match_threshold=1e-6):
    def F_from_ransac(x1, x2, model, maxiter=5000, match_threshold=1e-6):
        """ Robust estimation of a fundamental matrix F from point
        correspondences using RANSAC (ransac.py from
        http://www.scipy.org/Cookbook/RANSAC).
        input: x1, x2 (3*n arrays) points in hom. coordinates. """
        from PCV.tools import ransac
        data = np.vstack((x1, x2))
        d = 20 # 20 is the original
        # compute F and return with inlier index
        F, ransac_data = ransac.ransac(data.T, model,8, maxiter, match_threshold, d, return_all=True)
        return F, ransac_data['inliers']
    # find E through RANSAC
    # 使用 RANSAC 方法估计 E
    model = sfm.RansacModel()
    F, inliers = F_from_ransac(x1n, x2n, model, maxiter=5000, match_threshold=1e-4)
    print(len(x1n[0]))
    print(len(inliers))
    # 计算照相机矩阵(P2 是 4 个解的列表)
    P1 = array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]])
    P2 = sfm.compute_P_from_fundamental(F)
    # triangulate inliers and remove points not in front of both cameras
    X = sfm.triangulate(x1n[:, inliers], x2n[:, inliers], P1, P2)
    # plot the projection of X
    cam1 = camera.Camera(P1)
    cam2 = camera.Camera(P2)
    x1p = cam1.project(X)
    x2p = cam2.project(X)
    figure()
    imshow(im1)
    gray()
    plot(x1p[0], x1p[1], 'o')
    #plot(x1[0], x1[1], 'r.')
    axis('off')
    figure()
    imshow(im2)
    gray()
    plot(x2p[0], x2p[1], 'o')
    #plot(x2[0], x2[1], 'r.')
    axis('off')
    show()
    figure(figsize=(16, 16))
    im3 = sift.appendimages(im1, im2)
    im3 = vstack((im3, im3))
    imshow(im3)
    cols1 = im1.shape[1]
    rows1 = im1.shape[0]
    for i in range(len(x1p[0])):
        if (0<= x1p[0][i]<cols1) and (0<= x2p[0][i]<cols1) and (0<=x1p[1][i]<rows1) and (0<=x2p[1][i]<rows1):
            plot([x1p[0][i], x2p[0][i]+cols1],[x1p[1][i], x2p[1][i]],'c')
    axis('off')
    show()
    print(F)
    x1e = []
    x2e = []
    ers = []
    for i,m in enumerate(matches):
        if m>0: #plot([locs1[i][0],locs2[m][0]+cols1],[locs1[i][1],locs2[m][1]],'c')
            x1=int(l1[i][0])
            y1=int(l1[i][1])
            x2=int(l2[int(m)][0])
            y2=int(l2[int(m)][1])
            # p1 = array([l1[i][0], l1[i][1], 1])
            # p2 = array([l2[m][0], l2[m][1], 1])
            p1 = array([x1, y1, 1])
            p2 = array([x2, y2, 1])
            # Use Sampson distance as error
            Fx1 = dot(F, p1)
            Fx2 = dot(F, p2)
            denom = Fx1[0]**2 + Fx1[1]**2 + Fx2[0]**2 + Fx2[1]**2
            e = (dot(p1.T, dot(F, p2)))**2 / denom
            x1e.append([p1[0], p1[1]])
            x2e.append([p2[0], p2[1]])
            ers.append(e)
    x1e = array(x1e)
    x2e = array(x2e)
    ers = array(ers)
    indices = np.argsort(ers)
    x1s = x1e[indices]
    x2s = x2e[indices]
    ers = ers[indices]
    x1s = x1s[:20]
    x2s = x2s[:20]
    figure(figsize=(16, 16))
    im3 = sift.appendimages(im1, im2)
    im3 = vstack((im3, im3))
    imshow(im3)
    cols1 = im1.shape[1]
    rows1 = im1.shape[0]
    for i in range(len(x1s)):
        if (0<= x1s[i][0]<cols1) and (0<= x2s[i][0]<cols1) and (0<=x1s[i][1]<rows1) and (0<=x2s[i][1]<rows1):
            plot([x1s[i][0], x2s[i][0]+cols1],[x1s[i][1], x2s[i][1]],'c')
    axis('off')
    show()
    

    3.2.2 实验结果及分析

    ① 第一组数据
    七点匹配点计算基础矩阵:
    控制台输出:

    461
    461
    36
    [[  1.97239734e-07  -4.26561273e-05   2.52904527e-02]
     [  4.24989402e-05  -1.90178422e-06  -2.44330900e-02]
     [ -2.44701559e-02   2.30334778e-02   1.00000000e+00]]
    

    结果图:

    八点匹配点计算基础矩阵:
    控制台输出:

    461
    461
    29
    [[ -2.55224960e-07  -3.00786795e-07   1.58976498e-03]
     [  2.89707522e-06   1.45441317e-07  -1.46080960e-02]
     [ -2.81378730e-03   1.23999326e-02   1.00000000e+00]]
    

    结果图:

    十点匹配点计算基础矩阵:
    控制台输出:

    processed tmp.pgm to im1.sift
    processed tmp.pgm to im2.sift
    461
    461
    36
    [[  6.79062229e-06  -3.58141837e-06  -3.86536085e-02]
     [  4.48539039e-06  -1.53238078e-07  -5.44511839e-03]
     [  2.94374668e-02   3.04050052e-03   1.00000000e+00]]
    

    结果图:

    ② 第二组数据
    七点匹配点计算基础矩阵:
    控制台输出:

    734
    734
    32
    [[  4.41348662e-08  -3.42650050e-06   2.34914137e-03]
     [  3.37627195e-06   3.86920082e-08  -2.77634118e-03]
     [ -2.51280140e-03   1.50309243e-03   1.00000000e+00]]
    

    结果图:

    八点匹配点计算基础矩阵:
    控制台输出:

    734
    734
    59
    [[  5.13681399e-08  -2.72006999e-06   2.33030990e-03]
     [  2.71521610e-06   1.85826640e-08  -2.25616582e-03]
     [ -2.51198132e-03   1.22928879e-03   1.00000000e+00]]
    

    结果图:

    十点匹配点计算基础矩阵:
    控制台输出:

    734
    734
    46
    [[  3.32345027e-08  -5.21542621e-06   1.99979624e-03]
     [  5.14872251e-06   2.89078827e-08  -6.53046230e-03]
     [ -2.23058142e-03   4.65965814e-03   1.00000000e+00]]
    

    结果图:

    ③第三组数据
    七点匹配点计算基础矩阵:
    控制台输出:

    632
    632
    28
    [[  2.87480615e-06  -2.51191641e-04   1.83003566e-01]
     [  2.49457112e-04   3.69779415e-06  -1.27817047e-01]
     [ -1.69252496e-01   1.14233511e-01   1.00000000e+00]]
    

    结果图:

    八点匹配点计算基础矩阵:
    控制台输出:

    632
    632
    32
    [[  3.78497574e-08   2.12332184e-05  -3.28211216e-02]
     [ -2.20359610e-05   4.36071279e-07   2.63780580e-02]
     [  3.62485855e-02  -2.94763915e-02   1.00000000e+00]]
    

    结果图:

    十点匹配点计算基础矩阵:
    控制台输出:

    632
    632
    53
    [[  4.66996990e-08  -2.04474321e-05   1.99506699e-02]
     [  2.07208420e-05   2.14957900e-07  -1.06213988e-02]
     [ -2.00422549e-02   9.28538206e-03   1.00000000e+00]]
    

    结果图:

    实验分析:
    (1)由第一组的实验结果分析可得:随着改变参数7、8、10,即匹配点的个数,得到的基础矩阵是各不相同的,对基础矩阵的有非常大的影响;除此之外匹配点的个数对于最终得到的特征匹配图也有较大的影响,其规律不是特别明显,但当参数较大时,匹配线的数量较多。
    (2)远近不同的图片组经过算法匹配效果相对于远近相同的图片组效果要差一些,甚至出现了明显的错误匹配,第一组的图片匹配点较多,但是优化后所剩下的较少,第二张匹配点相对第一组较少,但是优化过后明显特征的匹配点仍被保留。
    (3)sift算法本身有时候会因为匹配点附近太过相似而出现错误匹配,这个算法便能在这个基础上相对优化,避开错误的匹配,但是以上的结果都出现了一个情况,优化后的结果仍存在错误的匹配点,整体效果并不好,由于图像远近以及光线的影响,呈现的效果也不够理想,而相对的,远近相同的测试图片效果会比远近相差较大的图片要好,更容易匹配。
    (4)在本次实验中,三组数据相较来说,平移变换图像相比较其他两种构图方式的图像有着较多的特征匹配数,因为平移变换对物体特征点的影响较小,而远近和左右角度变换都会在不同程度上影响到特征点的收集和遮蔽。

    3.3 极点与极线

    3.3.1 实验代码

    import numpy as np
    import cv2 as cv
    from matplotlib import pyplot as plt
    def drawlines(img1, img2, lines, pts1, pts2):
        ''' img1 - image on which we draw the epilines for the points in img2
            lines - corresponding epilines '''
        r, c = img1.shape
        img1 = cv.cvtColor(img1, cv.COLOR_GRAY2BGR)
        img2 = cv.cvtColor(img2, cv.COLOR_GRAY2BGR)
        for r, pt1, pt2 in zip(lines, pts1, pts2):
            color = tuple(np.random.randint(0, 255, 3).tolist())
            x0, y0 = map(int, [0, -r[2] / r[1]])
            x1, y1 = map(int, [c, -(r[2] + r[0] * c) / r[1]])
            img1 = cv.line(img1, (x0, y0), (x1, y1), color, 1)
            img1 = cv.circle(img1, tuple(pt1), 5, color, -1)
            img2 = cv.circle(img2, tuple(pt2), 5, color, -1)
        return img1, img2
    img1 = cv.imread('data/1.jpg', 0)  # queryimage # left image
    img2 = cv.imread('data/2.jpg', 0)  # trainimage # right image
    sift = cv.xfeatures2d.SIFT_create()
    # find the keypoints and descriptors with SIFT
    kp1, des1 = sift.detectAndCompute(img1, None)
    kp2, des2 = sift.detectAndCompute(img2, None)
    # FLANN parameters
    FLANN_INDEX_KDTREE = 1
    index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
    search_params = dict(checks=50)
    flann = cv.FlannBasedMatcher(index_params, search_params)
    matches = flann.knnMatch(des1, des2, k=2)
    good = []
    pts1 = []
    pts2 = []
    # ratio test as per Lowe's paper
    for i, (m, n) in enumerate(matches):
        if m.distance < 0.8 * n.distance:
            good.append(m)
            pts2.append(kp2[m.trainIdx].pt)
            pts1.append(kp1[m.queryIdx].pt)
    pts1 = np.int32(pts1)
    pts2 = np.int32(pts2)
    F, mask = cv.findFundamentalMat(pts1, pts2, cv.FM_LMEDS)
    # We select only inlier points
    pts1 = pts1[mask.ravel() == 1]
    pts2 = pts2[mask.ravel() == 1]
    # Find epilines corresponding to points in right image (second image) and
    # drawing its lines on left image
    lines1 = cv.computeCorrespondEpilines(pts2.reshape(-1, 1, 2), 2, F)
    lines1 = lines1.reshape(-1, 3)
    img5, img6 = drawlines(img1, img2, lines1, pts1, pts2)
    # Find epilines corresponding to points in left image (first image) and
    # drawing its lines on right image
    lines2 = cv.computeCorrespondEpilines(pts1.reshape(-1, 1, 2), 1, F)
    lines2 = lines2.reshape(-1, 3)
    img3, img4 = drawlines(img2, img1, lines2, pts2, pts1)
    plt.subplot(121), plt.imshow(img5)
    plt.subplot(122), plt.imshow(img3)
    plt.show()
    

    3.3.2 实验结果及分析

    ① 第一组数据
    在这里插入图片描述
    ② 第二组数据
    在这里插入图片描述
    ③ 第三组数据
    在这里插入图片描述
    实验分析:

    对于第三组实验数据来说,极点为途中所有直线的交点处,由于改组图像为前后远近不同的图像组,所以该图像组的极线呈散射状,极点位于所有极线的交点处。

    4. 实验中遇到的问题

    在本次实验中遇到如下问题,在代码运行过程中遇到如下报错:

    ImportError: cannot import name 'ransac'
    

    解决方法:
    将代码中的from PCV.geometry import ransac改为from PCV.tools import ransac即可,因为ransac.py文件夹在PCV下的tools文件夹内,不在geometry 内。

    展开全文
  • 尽管图像中包含着丰富的信息,但是仅从一幅图像无法直接...一、双视角1.外极几何 2.标定的情况3.微小运动4.非标定的情况5.弱标定二、三视图 1.三焦几何2.标定的情形3.未标定的情况4.三焦张量的估算三、更的视图
  • 视图几何

    千次阅读 2019-04-17 20:47:52
    1、对极几何(Epipolar Geometry) 对极几何,用来描述的是如果有一个场景的两个视图以及视图中的对应图像点,那么根据照相机间的空间相对位置关系、照相机的性质以及三维场景点的位置,可以得到对这些图像点的一些...
  • 对极几何约束
  • 2017年10月23日 如此定义直线的交点的原因是,两个向量的叉积是垂直于这两个向量的,然后正好直线上的点满足aX+bY+c=0,即矩阵和向量的乘积为0,定义符合要求。
  • 视图几何总结——单应矩阵和基础矩阵关系视图几何总结——单应矩阵和基础矩阵关系(1)单应矩阵和基础矩阵的兼容性(2)基础矩阵 —> 单应矩阵(3)单应矩阵 —> 基础矩阵 视图几何总结——单应矩阵和...
  • 学习资料来源为《计算机视觉中的视图几何(原书第二版)》,计划学习范围到两视图几何结束 数学基础 1.平面几何与代数的关系:向量就是点,对称矩阵就是二次曲线 2.----n维标准欧式几何空间 ----射影空间,在...
  • #资源达人分享计划#
  • 视图几何中的三维重建

    千次阅读 2020-09-21 11:05:27
    1)B站视图几何三维重建视频讲解:https://www.bilibili.com/video/BV1Sj411f73e 2)武汉大学摄影测量与遥感专业博士李迎松的CSDN: https://blog.csdn.net/rs_lys/article/list/1 涉及的内容主要是 sfm, Patch...
  • SLAM代码(几何基础)

    千次阅读 2016-09-16 01:26:14
    本文主要介绍几何的一些概述 首先介绍单视的情况,从空间三维点经过世界到相机坐标系的转换,以及透视投影和相机的镜头畸变得到最终的2D点。前者称为外参数,后者成为内参数,两者的乘积称为camera matrix相机...
  • 为了采集物体在不同视角的形貌图像信息,并实现同步化输出的显示系统,设计并验证了一种可供多视角同步观察的悬浮式动态图像显示系统。该系统中的投射式图像源融合了物体在不同视角的形貌图像信息,它能够被同步地...
  • 提岀了一种多阶段优化的方法来解决基于多视角图片在未知姿态、表情以及光照条件下的高精度三维人脸重建问题。首先,通过重新渲染合成的方法将参数化模型拟合到输入的多视角图片,然后在纹理域上求解一个光流问题来...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,712
精华内容 5,884
关键字:

多视角几何

友情链接: 瞬时频率.rar