精华内容
下载资源
问答
  • 主要是计算两个图形平面间的点对应关系,即单应性矩阵。通过MATLAB实现。SelectPoint.m主要实现两个图片中各选取四个点,然后保存在H.mat文件中,运行玩这个程序后直接运行testH.m文件即可
  • 单应性矩阵的估计

    2018-04-20 17:23:48
    两个不同视角的图像上的点对的homogeneous coordinate可以用一个射影变换(projective transformation)表述
  • 具体包含了ransac算法、multi-GSsampling算法、求取单应性矩阵Homography的奇异矩阵算法、相似矩阵变换的求取、图像翘曲、局部单应性矩阵权重占比、图像融合等算法。具体过程为:1.利用sift算法提取特征点 2.利用...
  • 针对三维视觉测量中棋盘格标定板的角点检测,给出了基于单应性矩阵这一计算机视觉重要工具为基础的检测方法。首先通过点选得到待测角点外接四边形的4个角点坐标,接着利用单应性矩阵映射得到所有角点的初始位置,...
  • 提取单应性矩阵

    2014-06-09 17:55:10
    用于图像变换过程提取单应性矩阵,xue xi guochengzhong
  • 单应性矩阵实现推导.pdf
  • 针对交通场景中对视频拼接速度要求较高的特点,提出了利用视频帧最优单应性矩阵进行实时拼接的双线程快速算法首先,利用SURF(Speededuprobustfeatures)算法提取图像特征点;其次,通过NN(Nearestneighbor)算法以及优化的...
  • 单应性矩阵

    2019-08-23 18:22:37
    二维中的单应性矩阵 单应性矩阵与射影矩阵基本是一回事,都有8个自由度,摄影矩阵是从二维平面的操作。单应性矩阵可以看成从二维的操作到三维操作的一个过度。 单应性变换又称为射影变换或者透视变换,有很多的...

    一.二维中的单应性矩阵

    1. 单应性矩阵与射影矩阵基本是一回事,都有8个自由度,摄影矩阵是从二维平面的操作。单应性矩阵可以看成从二维的操作到三维操作的一个过度。
    2. 单应性变换又称为射影变换或者透视变换,有很多的叫法。
    3. 单应性矩阵就是个3*3的矩阵。
    4. 单应性矩阵(H)可以描述两个图片之间的变换,可以进行图片的拼接

     或者   

    这里H是单应性矩阵,可以从一个图像把每一个像素变换到另一个图像平面,这样就可以进行图像的拼接。

    利用单应性矩阵做图像拼接的时候,如果之灾二维的空间中处理,要求相机的中心不能有平移,因为这样可以在不知道场景深度信息的条件下就可以完成图像的拼接。

    如果相机中心有移动就可能产生重影,因为这个时候两个相机看到的场景可能会不一致。

    在数学几何的层面来看,利用单应性矩阵做图像拼接是要求相机中心点不能移动,但拍室外的话,因为场景较远,相机移动的距离相比于场景的距离可以忽略不记,所以拍出来的效果还好。拍室内的话,因为场景较近,要是有移动,会有很多重影。

    有一种情况,就算相机中心有移动,也可以利用单应性矩阵对图像拼接。就是拍摄的场景是平面的时候。

    二.三维中的单应性矩阵

    当相机拍摄的对象是平面的时候,可以从两个视图测量的单应矩阵中,通过分解的方式获取相机的位姿信息(前提是相机的内参已知)。

    单应性矩阵分解中,单应性矩阵8个自由度,旋转矩阵R有三个自由度,平移矩阵t有3个自由度,法向量n有2个自由度,相机中心距平面的距离d有1个自由度。

    单应性矩阵分解问题分解的结果为:

    展开全文
  • 再谈单应性矩阵及位姿分解

    千次阅读 2019-12-12 23:42:19
    本文打算总结下我所了解单应性矩阵,因为针对不同场景的单应性矩阵,矩阵分解有不同方法。 1.什么是单应性矩阵 平面的单应性即为一个平面到另一个平面的映射。这个平面可以是图像平面,也可以是三维世界中的...

    最近在研究无人驾驶的定位问题,想利用车载摄像头提取的车道线、配合厂商提供的GNSS+IMU(非ADMA级别方案,存在一定误差),还有地图厂商提供的HD map(包含车道线元素)纠正定位。也就是说不依赖于视觉slam构造的特征图层,尝试下在GNSS+IMU定位不精确的情况下,仅利用前置摄像头的车道线,纠正lateral以及heading angle的误差。

    偶然之间,搜到一篇论文“Lane Level LocalizationUsing Images and HD Maps to Mitigate the Lateral Error”.

    论文大致思想通过初始定位位置搜索到地图对应的车道线元素,然后假设车身在longitudinal方向的错位尚可,在摄像头提取的左和右车道线上分别提取2个对共4个点,取车头前方D米以及2D米的视觉车道线,同理在地图的对应位置上也提取这么4个点,然后求图像平面到地图平面的单应性变换关系,再分解单应性矩阵得到R和T作为修正汽车定位的依据。(注意:厂商提供的地图和视觉车道线,可能是N阶曲线的系数,自己采样即可;另外,提取的车道线越远误差越大,但是地图误差不会随着距离增加而加大)

    这篇论文的假设在一定情况下是成立的,汽车虽然行径方向误差较大,上述车道线采样的点和地图采样的点实际上不一定匹配,但是只要是车头前方不远处的点,都不影响纠正lateral误差。

    本文打算总结下我所了解单应性矩阵,因为针对不同场景的单应性矩阵,矩阵分解有不同方法。

    1.什么是单应性矩阵

    平面的单应性即为一个平面到另一个平面的映射。这个平面可以是图像平面,也可以是三维世界中的平面(z=0)

    数学定义为,x=Mx'

    单应性矩阵解法,一般就是DLT 4点法。如果给定的匹配点比较多,可以考虑RANSAC之类的,opencv有很方便的库

    2.单应性矩阵有哪些场景

    单应性变换适用于如下两种场景,这种变换矩阵都叫做单应性矩阵。但是他们是不同的。

    a.图像平面与物理平面

    如下例子相机与物理平面不必是正对的,可以想想下无人机定位航拍,俯视角度做定位

    b.图像平面与图像平面

    两个相机平面看着同样的物理平面,但是相机在不同位置拍摄

    3.如何分解R和T

    a.针对图像平面与物理世界平面

    上述公式是套用了相机模型的投影公式,理论上旋转和平移应该是,

    但是由于噪声,实际情况是h1和h2并不正交,所以有如下处理

    这里,解是唯一的,也是易于理解的。有人这么干的,

    void cameraPoseFromHomography(const Mat& H, Mat& pose)
    {
        pose = Mat::eye(3, 4, CV_32FC1);      // 3x4 matrix, the camera pose
        float norm1 = (float)norm(H.col(0));  
        float norm2 = (float)norm(H.col(1));  
        float tnorm = (norm1 + norm2) / 2.0f; // Normalization value
    
        Mat p1 = H.col(0);       // Pointer to first column of H
        Mat p2 = pose.col(0);    // Pointer to first column of pose (empty)
    
        cv::normalize(p1, p2);   // Normalize the rotation, and copies the column to pose
    
        p1 = H.col(1);           // Pointer to second column of H
        p2 = pose.col(1);        // Pointer to second column of pose (empty)
    
        cv::normalize(p1, p2);   // Normalize the rotation and copies the column to pose
    
        p1 = pose.col(0);
        p2 = pose.col(1);
    
        Mat p3 = p1.cross(p2);   // Computes the cross-product of p1 and p2
        Mat c2 = pose.col(2);    // Pointer to third column of pose
        p3.copyTo(c2);       // Third column is the crossproduct of columns one and two
    
        pose.col(3) = H.col(2) / tnorm;  //vector t [R|t] is the last column of pose
    }

    b.针对图像平面之间的情况

    假设3D平面方程为(一般式)

    那么有,

    根据两个相机的成像模型,我们有

    我们对第二个图像画面做如下扩展,

    上述公式只是证明了,这种变换也是单应性变换。接下来怎么求这个R和t呢?比较麻烦

    数值法:

    解析法:(opencv函数就是这种)

     

    虽然能做R和T的分解,但是对于位移T来说单目视觉没有实际的scale深度信息,只能知道一个位移的方向。

    所以那个论文被我同事鄙视了,lateral方向不能给出明确的偏移量。关于位移量的问题,可以看如下仿真代码。

    #include <opencv2/opencv.hpp>
    #include <iostream>
    #include <vector>
    
    
    int main() {
      // set up a virtual camera
      float f = 100, w = 640, h = 480;
    
      cv::Mat1f K = (cv::Mat1f(3, 3) <<
          f, 0, w/2,
          0, f, h/2,
          0, 0,   1);
    
      // set transformation from 1st to 2nd camera (assume K is unchanged)
      cv::Mat1f rvecDeg = (cv::Mat1f(3, 1) << 45, 12, 66);
      cv::Mat1f t = (cv::Mat1f(3, 1) << 100, 200, 300);
    
      std::cout << "-------------------------------------------\n";
      std::cout << "Ground truth:\n";
    
      std::cout << "K = \n" << K << std::endl << std::endl;
      std::cout << "rvec = \n" << rvecDeg << std::endl << std::endl;
      std::cout << "t = \n" << t << std::endl << std::endl;
    
      // set up points on a plane
      std::vector<cv::Point3f> p3d{{0, 0, 10},
                                   {100, 0, 10},
                                   {0, 100, 10},
                                   {100, 100, 10}};
    
      // project on both cameras
      std::vector<cv::Point2f> Q, P, S;
    
      cv::projectPoints(p3d,
                        cv::Mat1d::zeros(3, 1),
                        cv::Mat1d::zeros(3, 1),
                        K,
                        cv::Mat(),
                        Q);
    
      cv::projectPoints(p3d,
                        rvecDeg*CV_PI/180,
                        t,
                        K,
                        cv::Mat(),
                        P);
    
      // find homography
      cv::Mat H = cv::findHomography(Q, P);
    
      std::cout << "-------------------------------------------\n";
      std::cout << "Estimated H = \n" << H << std::endl << std::endl;
    
    
      // check by reprojection
      std::vector<cv::Point2f> P_(P.size());
      cv::perspectiveTransform(Q, P_, H);
    
      float sumError = 0;
    
      for (size_t i = 0; i < P.size(); i++) {
        sumError += cv::norm(P[i] - P_[i]);
      }
    
      std::cout << "-------------------------------------------\n";
      std::cout << "Average reprojection error = "
          << sumError/P.size() << std::endl << std::endl;
    
    
      // decompose using identity as internal parameters matrix
      std::vector<cv::Mat> Rs, Ts;
      cv::decomposeHomographyMat(H,
                                 K,
                                 Rs, Ts,
                                 cv::noArray());
    
      std::cout << "-------------------------------------------\n";
      std::cout << "Estimated decomposition:\n\n";
      std::cout << "rvec = " << std::endl;
      for (auto R_ : Rs) {
        cv::Mat1d rvec;
        cv::Rodrigues(R_, rvec);
        std::cout << rvec*180/CV_PI << std::endl << std::endl;
      }
    
      std::cout << std::endl;
    
      std::cout << "t = " << std::endl;
      for (auto t_ : Ts) {
        std::cout << t_ << std::endl << std::endl;
      }
    
      return 0;
    }

    输出结果:

    -------------------------------------------
    Ground truth:
    K =
    [100, 0, 320;
    0, 100, 240;
    0, 0, 1]
    
    rvec =
    [45;
    12;
    66]
    
    t =
    [100;
    200;
    300]
    
    -------------------------------------------
    Estimated H =
    [0.04136041220427821, 0.04748763375951008, 358.5557917287962;
    0.05074854454707714, 0.06137211243830468, 297.4585754092336;
    8.294458769850147e-05, 0.0002294875562580223, 1]
    
    -------------------------------------------
    Average reprojection error = 0
    
    -------------------------------------------
    Estimated decomposition:
    
    rvec =
    [-73.21470385654712;
    56.64668212487194;
    82.09114210289061]
    
    [-73.21470385654712;
    56.64668212487194;
    82.09114210289061]
    
    [45.00005330430893;
    12.00000697952995;
    65.99998380038915]
    
    [45.00005330430893;
    12.00000697952995;
    65.99998380038915]
    
    
    t =
    [10.76993852870029;
    18.60689642878277;
    30.62344129378435]
    
    [-10.76993852870029;
    -18.60689642878277;
    -30.62344129378435]
    
    [10.00001378255982;
    20.00002581449634;
    30.0000336510648]
    
    [-10.00001378255982;
    -20.00002581449634;
    -30.0000336510648]

    As you can see, there is correct estimation of rotation vector among the hypothesis, and there's a up-to-scale correct estimation of translation.

    关于尺度问题,它和像素点的取值有关系。大家可以把那个3D 平面坐标,放大/缩小10倍,观察translation的区别

    4.单应性矩阵与对极几何的关系

    这里援引高翔的话,

    单应性在 SLAM 中具重要意义。当特征点共面,或者相机发生纯旋转的时候,基础矩阵的自由度下降,这就出现了所谓的退化( degenerate)。现实中的数据总包含一些噪声。这时候如果我们继续使用八点法求解基础矩阵,基础矩阵多余出来的自由度将会主要由噪声决定。为了能够避免退化现象造成的影响,通常我们会同时估计基础矩阵 F 和单应矩阵H,选择重投影误差比较小的那个作为最终的运动估计矩阵。

    展开全文
  • 针对现有变焦镜头标定方法难度大、动态精度低等问题, 提出一种基于单应性矩阵的动态变焦双目内外参数估计方法和平面快速重建方法。利用双目图像匹配点及变焦前后的匹配点进行两类单应性矩阵估计;基于变焦数学模型和...
  • 针对图像拼接技术进行全景图像融合时出现瑕疵、畸变且不能保护图像内容的现象,提出了一种基于单应性矩阵和内容保护变形的图像拼接算法。首先选用单应性矩阵模型给定种子特征点,递增地对其相邻特征点进行分组;然后...
  • 单应性矩阵的理解及求解

    万次阅读 多人点赞 2018-12-29 15:52:13
    单应性矩阵的理解及求解 1. 齐次坐标(Homogeneous Coordinate) 一幅2D图像上的非齐次坐标为(x,y),而齐次坐标为(x,y,1),也可以写成(x/z,y/z,1)或(x,y,z)。齐次坐标有很多好处,比如可以很清楚的确定一个点在不...

    单应性矩阵的理解及求解

    1. 齐次坐标(Homogeneous Coordinate)

    一幅2D图像上的非齐次坐标为(x,y),而齐次坐标为(x,y,1),也可以写成(x/z,y/z,1)(x,y,z)。齐次坐标有很多好处,比如可以很清楚的确定一个点在不在直线上:

    T(x)*I=0, T表示转置矩阵;

    还可以描述无穷远点:(x,y,0)

    还可以把平移和旋转写到一个矩阵里(也有不愿意这么干的,摄影测量里用的都是非齐次坐标,平移和旋转分开写);

    具体的可去看<计算机视觉中的多视图几何>,i.e.,<multiple view geometry in computer vision>

    2. 单应性矩阵(Homography Matrix)

    两个不同视角的图像上的点对的homogeneous coordinate可以用一个射影变换(projective transformation)表述,即:x1 = H*x2

    二维和三维的图示如下:

    射影变换也叫“单应”--Homography,“Homo”前缀就是same的意思,表示“同”,homography就是用同一个源产生的graphy,中文译过来大概就是“单应”。

    因此上面式子中的矩阵H就叫单应性矩阵。上式中的x1x2都是3*1的齐次坐标,因此H是一个3*3的矩阵:{h00,h01,h02;h10,h11,h12;h20,h21,h22}

    然而,单应矩阵的自由度是多少呢?

    如果给定一个单应H={h_ij},给它的元素乘上同一个数a,得到的的单应a*HH作用相同,因为新单应无非把齐次点x1变成了齐次点a*x1,都是一回事。因此我们可以把a换成1/h22,那么H就变成了只有8个自由元素的矩阵。

    那么需要多少个点对求解这个H呢?如果需要唯一解的话,需要4个点对(对应8个方程,去解H中的8个未知数)。

    3. 两个应用例子

    例子1:如何进行两个图像的拼接?

    解答:通过图像特征点匹配+RANSAC可以获得图像之间的单应性矩阵,然后把其中一个图像通过这个矩阵投影到另一个图像上就完成了基本的拼接。

    例子2:在相机的内参数标定过程中会用到求解单应性矩阵吗?

    对一个棋盘格拍照,棋盘格的世界坐标系是用户任意设定的,标定的时候,默认世界坐标系就是以标定板左上角点为原点,z轴垂直于标定板,xoy面与标定板重合的三维直角坐标系。棋盘格的格子长度已知,因此可以知道各个角点的世界坐标系坐标XYZZ=0)。由于Z=0,因此可以忽略掉Z这个维度,世界坐标系中某个坐标(X,Y,Z,1)到图像坐标(x,y,1)的变换就等价于(X,Y,1)到图像坐标(x,y,1)的变换。此时的变换矩阵就由3*4变为3*3,成为了单应性矩阵。

    因此用4个角点就可以计算H8个参数。以不同的角度对棋盘格拍摄3张就可以得到3H,如果用张正友标定法,就可以得到6个约束方程,可以求解B矩阵(对称矩阵)的6个未知参数,进而通过Cholesky分解求解出内参矩阵A的参数。

    4. 单应矩阵Homography求解

    《从零开始学习「张氏相机标定法」(一)成像几何模型》中我们已经得到了像素坐标系和世界坐标系下的坐标映射关系:

    https://img-blog.csdnimg.cn/20181229155213467

    其中,uv表示像素坐标系中的坐标,s表示尺度因子,fxfyu0v0、γ(由于制造误差产生的两个坐标轴偏斜参数,通常很小)表示5个相机内参,Rt表示相机外参,XwYwZw(假设标定棋盘位于世界坐标系中Zw=0的平面)表示世界坐标系中的坐标。

    单应性概念的引出

    我们在这里引入一个新的概念:单应性(Homography)变换。可以简单的理解为它用来描述物体在世界坐标系和像素坐标系之间的位置映射关系。对应的变换矩阵称为单应性矩阵。在上述式子中,单应性矩阵定义为:

    https://img-blog.csdnimg.cn/20181229155213511

    其中,M是内参矩阵。

    https://img-blog.csdnimg.cn/20181229155213554

    从单应矩阵定义式子来看,它同时包含了相机内参和外参。在进一步介绍相机标定知识之前,我们重点来了解一下单应性,这有助于深入理解相机标定。因为在计算机视觉领域,单应性是一个非常重要的概念。

    为了不让读者淹没在公式的汪洋大海中失去兴趣,我们颠倒一下顺序,先来看看单应性到底有什么用,然后再介绍单应矩阵的估计方法。

    单应性在计算机视觉中的应用

    单应性在计算机视觉领域是一个非常重要的概念,它在图像校正、图像拼接、相机位姿估计、视觉SLAM等领域有非常重要的作用。

    1. 图像校正

    用单应矩阵进行图像矫正的例子如下图所示,最少需要四个对应点对(后面会给出原因)就可以实现。

    https://img-blog.csdnimg.cn/20181229155213595

    2. 视角变换

    单应矩阵用于视角变换的例子如下图所示,可以方便地将左边普通视图转换为右图的鸟瞰图。

    https://img-blog.csdnimg.cn/20181229155213634

    3. 图像拼接

    既然单应矩阵可以进行视角转换,那我们把不同角度拍摄的图像都转换到同样的视角下,就可以实现图像拼接了。如下图所示,通过单应矩阵H可以将image1image2都变换到同一个平面。

    https://img-blog.csdnimg.cn/20181229155213680

    单应矩阵用于图像拼接的例子如下所示。

    https://img-blog.csdnimg.cn/20181229155213726

    4. 增强现实(AR)

    平面二维标记图案(marker)经常用来做AR展示。根据marker不同视角下的图像可以方便的得到虚拟物体的位置姿态并进行显示,如下图所示。

    https://img-blog.csdnimg.cn/20181229155213765

    如何估计单应矩阵?

    了解了上述单应性的部分应用后,我们就有很大的动力来学习单应矩阵的推导和计算了。首先,我们假设两张图像中的对应点对齐次坐标为(x',y',1)(x,y,1),单应矩阵H定义为:

    则有:

    https://img-blog.csdnimg.cn/20181229155213807

    矩阵展开后有3个等式,将第3个等式代入前两个等式中可得:

    也就是说,一个点对对应两个等式。在此插入一个讨论:单应矩阵H有几个自由度?

    或许有人会说,9个啊,H矩阵不是9个参数吗?从h11h33总共9个。真的是这样吗?实际上并不是,因为这里使用的是齐次坐标系,也就是说可以进行任意尺度的缩放。比如我们把hij乘以任意一个非零常数k并不改变等式结果:

    https://img-blog.csdnimg.cn/20181229155213848

    所以实际上单应矩阵H只有8个自由度。8自由度下H计算过程有两种方法。

    第一种方法:直接设置h33=1,那么上述等式变为:

    第二种方法:将H添加约束条件,将H矩阵模变为1,如下:

    https://img-blog.csdnimg.cn/20181229155213925

    以第2种方法(用第1种也类似)为例继续推导,我们将如下等式(包含||H||=1约束):

    乘以分母展开,得到:

    https://img-blog.csdnimg.cn/20181229155213966

    整理,得到:

    https://img-blog.csdnimg.cn/2018122915521427

    假如我们得到了两幅图片中对应的N个点对(特征点匹配对),那么可以得到如下线性方程组:

    https://img-blog.csdnimg.cn/2018122915521468

    写成矩阵形式:

    由于单应矩阵H包含了||H||=1约束,因此根据上图的线性方程组,8自由度的H我们至少需要4对对应的点才能计算出单应矩阵。这也回答了前面图像校正中提到的为何至少需要4个点对的根本原因。

    但是,以上只是理论推导,在真实的应用场景中,我们计算的点对中都会包含噪声。比如点的位置偏差几个像素,甚至出现特征点对误匹配的现象,如果只使用4个点对来计算单应矩阵,那会出现很大的误差。因此,为了使得计算更精确,一般都会使用远大于4个点对来计算单应矩阵。另外上述方程组采用直接线性解法通常很难得到最优解,所以实际使用中一般会用其他优化方法,如奇异值分解、Levenberg-MarquaratLM)算法(后续文章会介绍)等进行求解。

    如何根据标定图得到单应矩阵?

    经过前面一系列的介绍,我们应该大致明白如何根据打印的棋盘标定图和拍摄的照片来计算单应矩阵H。我们来总结一下大致过程。

    1. 打印一张棋盘格标定图纸,将其贴在平面物体的表面。

    2. 拍摄一组不同方向棋盘格的图片,可以通过移动相机来实现,也可以移动标定图片来实现。

    3. 对于每张拍摄的棋盘图片,检测图片中所有棋盘格的特征点(角点,也就是下图中黑白棋盘交叉点,中间品红色的圆圈内就是一个角点)。我们定义打印的棋盘图纸位于世界坐标系Zw=0的平面上,世界坐标系的原点位于棋盘图纸的固定一角(比如下图中黄色点)。像素坐标系原点位于图片左上角。

    https://img-blog.csdnimg.cn/20181229155214118

    4. 因为棋盘标定图纸中所有角点的空间坐标是已知的,这些角点对应在拍摄的标定图片中的角点的像素坐标也是已知的,如果我们得到这样的N>=4个匹配点对(越多计算结果越鲁棒),就可以根据LM等优化方法得到其单应矩阵H。当然计算单应矩阵一般不需要自己写函数实现,OpenCV中就有现成的函数可以调用,对应的C++函数是:

    Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )

    从函数定义来看,只要输入匹配点对,指定具体计算方法即可输出结果。

    展开全文
  • ORB-SLAM点云地图中相机的位姿初始化,无论算法工作在平面场景,还是非平面场景下,都能够完成初始化的工作。其中主要是使用了适用于平面场景的单应性矩阵H和适用于非平面场景的基础矩阵F,...

    ORB-SLAM点云地图中相机的位姿初始化,无论算法工作在平面场景,还是非平面场景下,都能够完成初始化的工作。其中主要是使用了适用于平面场景的单应性矩阵H和适用于非平面场景的基础矩阵F,程序中通过一个评分规则来选择适合的模型,恢复相机的旋转矩阵R和平移矩阵t

    那么下面主要讲解关于对极几何中的基础矩阵,本质矩阵,和单应矩阵之间的区别与联系。

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

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

    (1)基线(base line):两个相机中心的连线CC'称为基线。

    (2)对极点(epipolar):ee'是对极点,是基线与两个成像平面的交点,也就是两个相机在另一个成像平面上的像点。

    (3)对极平面(epipolar  plane):过基线的平面都称之为对极平面,其中两个相机的中心C和C',三维点X,以及三维点在两个相机成像点xx'这五点必定在同一对极平面上,当三维点X变化时,对极平面绕着基线旋转,形成对极平面束。

    (4)对极线(epipolar line):是对极平面和成像平面的交线,所有的对极线都相交于极点。

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

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

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

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

    从p1=KP可以得到

    带入到第二个式子得到

    两边同时乘以K_1得到

    设x1,和x2表示为

    带入到x2=Rx1+t中,两边同时左乘向量t的反对称矩阵t×,由于t×t=0,消除t,

    两边再同时左乘xT2

    由于t×x2是向量t和向量x2的叉积,同时垂直于向量t和向量x2,所以左边的式子为0得到:

    将x1,x2替掉

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

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

    F矩阵的性质有三:

    1, 3*3且自由度为7的矩阵

    2,kF 为基础矩阵,相差一个尺度自由度

    3,F矩阵的秩为2

    基础矩阵的求解方法:

    1,直接线性变换法(8点法+最小二乘法)

    2,RANSAC-估计基础矩阵

    求解基础矩阵后,我们实际上是想求R和t.所以还是要继续求解本质矩阵直到分解出R,t

    E矩阵的性质:

    (1)3*3且自由度为5的矩阵

    (2)因为只包含R,t共有6个自由度,又因为尺度等价去掉一个自由度

    (3)本质矩阵E的奇异值 必定为[ delta delta,0]T 的形式 

    ORB-SLAM中通过E、F矩阵就可以利用两视图中的匹配点求解出相对姿态了,不过这个方法存在一个问题——当两个视图的相机中心相同时,也就是R,t中的t为0,这时对极几何的基础也就不成立了,可知E、F均为0无法求解。这时就需要使用平面间的单应性H矩阵恢复R,t。

    单应性矩阵Homogeneous是射影几何中的一个术语,又称之为射影变换。本质上是一个数学概念,一般所说的单应矩阵是平面上的单应性矩阵,主要用来解决两个问题:

    (1)表述真实世界中一个平面与他对应图像的透视变换

    (2)通过透视变换实现图像从一个视图变换到另一个视图的转换。

    把一个射影平面上的点(三维齐次矢量)映射到另一个射影平面上,并且把直接射影为直线,具有保线性,总的来说单应是关于三维齐次矢量的一种线性变换,如图所示,两个平面之间的关系可以用一个3*3的非奇异矩阵H表示x1=Hx2,H表示单应矩阵,定义了八个自由度。这种关系定义为平面单应性。

    假设已经取得了两图像之间的单应,则可单应矩阵HH可以将两幅图像关联起来:

    其中,(u1,v1,1)T(u1,v1,1)T表示图像1中的像点,(u2,v2,1)T(u2,v2,1)T是图像2中的像点,也就是可以通过单应矩阵H将图像2变换到图像1,该功能有很多实际的应用,例如图像的校正、对齐以及在SLAM中估计两个相机间的运动。并保持某些性质的不变性,显然具有保线性。

    而在视觉slam中一般为同一相机在不同的位姿得到同一平面的图像有以下公式

    以上公式如何推导而来呢?假设使用同一相机在不同的位姿下拍摄了同一平面,如图:

    上图表示场景中的平面π在两相机的成像,设平面π在第一个相机坐标系下的单位法向量为N,其到第一个相机中心(坐标原点)的距离为d,则平面π可表示为:

    变换为

    其中,X1是三维点P在第一相机坐标系下的坐标,其在第二个相机坐标系下的坐标为X2,则

    将上面式子结合起来有

    得到了同一平面两个不同相机坐标系的单应矩阵

    单应矩阵求解方法:

    (1)直接线性变换法。

    (2)RANSAC-估计单应矩阵

    平面的单应矩阵和对极约束的F矩阵的区别

    两图像间的对极约束和场景的结构无关,可以理解对极约束对于任意场景结构的两幅图像都是成立的,约束是不能给出两幅图像上的像点的一一对应关系,但是可以给出点对应的必要条件,另一幅图像上对应的像点位于对应的对极线上。基础矩阵F描述的实际是一种点和直线的映射关系,而不是一种点对点的约束关系,并不能给出另一个点的确切位置。

    平面间的单应矩阵,并不像对极约束完全不需要场景的结构信息,它对场景的结构有了要求,场景的点必须在同一个平面上,因此单应矩阵H也就能够对两图像上对应点的提供更多的约束,知道了某点在一幅图像的像点位置后,可以通过单应矩阵,求得其在另一幅图像中像点的确切位置。

    单应矩阵的应用场景是相机只有旋转而无平移的时候,两视图的对极约束不成立,基础矩阵F为零矩阵,这时候需要使用单应矩阵H,场景中的点都在同一个平面上,可以使用单应矩阵计算像点的匹配点。 相机的平移距离相对于场景的深度较小的时候,也可以使用单应矩阵H。

    本文内容推导大部分来自《视觉SLAM14讲》。如有补充请大家积极留言,并且希望大家能够在阅读论文或者有推荐的论文或者开源代码,只要和点云相关,都可以留言给群主,如果有必要将会出与你推荐相关的资料。希望大家能够积极参与分享。如有侵权请第一时间联系本平台,将及时删除。

    资源

    三维点云论文及相关应用分享

    【点云论文速读】基于激光雷达的里程计及3D点云地图中的定位方法

    3D目标检测:MV3D-Net

    三维点云分割综述(上)

    3D-MiniNet: 从点云中学习2D表示以实现快速有效的3D LIDAR语义分割(2020)

    win下使用QT添加VTK插件实现点云可视化GUI

    JSNet:3D点云的联合实例和语义分割

    大场景三维点云的语义分割综述

    PCL中outofcore模块---基于核外八叉树的大规模点云的显示

    基于局部凹凸性进行目标分割

    基于三维卷积神经网络的点云标记

    点云的超体素(SuperVoxel)

    基于超点图的大规模点云分割

    更多文章可查看:点云学习历史文章大汇总

    SLAM及AR相关分享

    【开源方案共享】ORB-SLAM3开源啦!

    【论文速读】AVP-SLAM:自动泊车系统中的语义SLAM

    【点云论文速读】StructSLAM:结构化线特征SLAM

    SLAM和AR综述

    常用的3D深度相机

    AR设备单目视觉惯导SLAM算法综述与评价

    SLAM综述(4)激光与视觉融合SLAM

    Kimera实时重建的语义SLAM系统

    SLAM综述(3)-视觉与惯导,视觉与深度学习SLAM

    易扩展的SLAM框架-OpenVSLAM

    高翔:非结构化道路激光SLAM中的挑战

    SLAM综述之Lidar SLAM

    基于鱼眼相机的SLAM方法介绍

    往期线上分享录播汇总

    第一期B站录播之三维模型检索技术

    第二期B站录播之深度学习在3D场景中的应用

    第三期B站录播之CMake进阶学习

    第四期B站录播之点云物体及六自由度姿态估计

    第五期B站录播之点云深度学习语义分割拓展

    第六期B站录播之Pointnetlk解读

    [线上分享录播]点云配准概述及其在激光SLAM中的应用

    [线上分享录播]cloudcompare插件开发

    [线上分享录播]基于点云数据的 Mesh重建与处理

    [线上分享录播]机器人力反馈遥操作技术及机器人视觉分享

    [线上分享录播]地面点云配准与机载点云航带平差

    点云PCL更多活动请查看:点云PCL活动之应届生校招群

    扫描下方微信视频号二维码可查看最新研究成果及相关开源方案的演示:

    如果你对本文感兴趣,请点击“原文阅读”获取知识星球二维码,务必按照“姓名+学校/公司+研究方向”备注加入免费知识星球,免费下载pdf文档,和更多热爱分享的小伙伴一起交流吧!

    以上内容如有错误请留言评论,欢迎指正交流。如有侵权,请联系删除

    扫描二维码

                       关注我们

    让我们一起分享一起学习吧!期待有想法,乐于分享的小伙伴加入免费星球注入爱分享的新鲜活力。分享的主题包含但不限于三维视觉,点云,高精地图,自动驾驶,以及机器人等相关的领域。

    分享及合作方式:可联系微信“920177957”(需要按要求备注)联系邮箱:dianyunpcl@163.com,欢迎企业来联系公众号展开合作。

    点一下“在看”你会更好看耶

    展开全文
  • 什么是单应性矩阵

    千次阅读 2021-02-08 10:05:00
    现在我们知道了单应性矩阵如何根据其层次结构转换图像,我们需要确定图像的原点和目标点,分别将其表示为p和p'。在识别这些点时,其中三个点必须是共线的,否则等式无法区分变换。但是,有一种自动检测点的算法,...
  • 单应性矩阵H和基础矩阵F

    千次阅读 2019-11-12 16:25:30
    一、单应性矩阵 单应性矩阵描述的是共面点在两个相机视图下的像素点的约束关系,描述的是点与点之间的约束关系,使用单应矩阵可以找到像点在另一幅图像上对应点的确切位置。 即当已知两幅图像间的单应性矩阵H时,...
  • 单应性矩阵及其应用

    2020-05-30 15:55:35
    什么是单应性? 考虑图1所示的平面的两个图像(书的顶部)。红点表示两个图像中的相同物理点。在计算机视觉术语中,我们称这些对应点。图1.用四种不同的颜色(红色,绿色,黄色和橙色)显示了四个对应的点。那么单...
  • 所以最后打算不求内参和外参,直接通过二维平面转换求出对应的单应性矩阵H,然后需要的高度Z再单独通过深度相机得到,所以用了单应性来标定,过程中采集了48个角点,最后的误差x轴在3厘米左右,y轴误差在毫米级,...
  • 两图像间的单应性矩阵估计 单应性矩阵的定义: 两图像间的单应性矩阵估计基于一个假设: 这两个图像拍摄的场景在一个平面上或者两图像是由相机发生纯旋转时采集的。当满足这个假设后,就可以根据两图像上提取的匹配...
  • 单应性矩阵,是用来描述两个平面之间的变换关系,是一个3x3的齐次矩阵。 图上的4个绿色的圈,两两可以对应,H可以表达第一张图变换到第二张图的转换关系。具体的表达式: aaa表示尺度信息,h1−h9h_1-h_9h1​−h9...
  • RANSAC算法的单应性矩阵讲解

    千次阅读 2020-04-11 18:22:34
    在上述式子中,单应性矩阵定义为: 其中,M是内参矩阵 从单应矩阵定义式子来看,它同时包含了相机内参和外参。在进一步介绍相机标定知识之前,我们重点来了解一下单应性,这有助于深入理解相机标定。因为在计算机...
  • 图像处理(三):单应性矩阵 概念介绍 很多时候我们需要把一张图片“均匀”地扭曲一下。比如说,你有一本书封面的正面照片,现在你想生成这个封面放在桌面上,与你视线有一定夹角的的照片。很显然这是一个线性变换,...
  • 单应性矩阵的理解

    2020-08-20 14:03:38
    单应性矩阵就是一个平面到另一个平面的投影矩阵,这里可以简单理解为用来描述物体在世界坐标系和像素坐标系之间的位置映射关系,即它同时包含了相机的内参和外参,假设标定平面放置在Z=0的位置,可以得到: ...
  • Homography单应性矩阵原理

    千次阅读 2019-03-19 22:20:33
    考虑图1所示的两个平面图像(书的顶部)。红点表示两个图像中相同的物理点。在计算机视觉术语中,我们把这些对应的点称为。...在计算机视觉中,平面的单应性被定义为一个平面到另外一个平面的投影映射。因此一个二...
  • 单应性矩阵变换

    2020-04-02 14:50:57
    单应性矩阵H,原始图像Src(x,y),输出图像Dst(x,y) 原始图像到目标图像变换 ,参考opencv官方文档...
  • 单应性矩阵的理解及求解3

    万次阅读 多人点赞 2018-08-31 13:15:17
    在上述式子中,单应性矩阵定义为: 其中,M是内参矩阵 从单应矩阵定义式子来看,它 同时包含了相机内参和外参 。在进一步介绍相机标定知识之前,我们重点来了解一下单应性,这有助于深入理解相机标定。...
  •   本文主要介绍了如何使用ViSP计算两幅图像之间的单应性矩阵,在已知同一个物体的特征点在两个相机中的图像坐标后,就能够计算两个相机坐标之间的单应性矩阵。如果能够保证两幅图像中的特征点是一一对应匹配的可以...
  • 单应性矩阵的求解过程及应用

    千次阅读 2018-11-28 16:51:36
    在上述式子中,单应性矩阵定义为: 其中,M是内参矩阵 从单应矩阵定义式子来看,它 同时包含了相机内参和外参 。在进一步介绍相机标定知识之前,我们重点来了解一下单应性,这有助于深入理解相机标定。因为...
  • 单应性矩阵MATLAB程序

    千次阅读 2019-01-16 23:50:07
    单应性(Homography)描述的是同一个平面上的点,在两幅... 本文计算单应性矩阵在两个图像平面中都需要选择四个点,选点程序如下: %单应矩阵 选点 clear clc; image1=imread('firstView000000.jpg'); image2=imr...
  • 最近星球里有个小伙伴问了一个这样的问题,我个人觉得问题蛮深刻。此处将我的回答分享给大家,也欢迎大家一起交流讨论,共同进步。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,665
精华内容 15,866
关键字:

单应性矩阵