2019-06-26 10:41:11 jishijian7408 阅读数 595

应用灭点进行相机标定

  • 根据灭点的三个属性找出相机的内参数与灭点之间的关系
  • 通过单像中的立方体(标定物)标定出相机的内参数
  • 根据某一特定平面模板(标定模板)的立体像对估算出相机的外部参数

E.Guillou, D.Meneveaux, E.Maisel etc. Using Vanishing Points for Camera Calibration and Coarse 3D Reconstruction from a Single Image.

该方法利用两个灭点进行相机的标定,对相机的内、外参数进行估算,在此基础上,基于单幅图像实现三维物体的粗略重建。
1)使用的是两个消失点(手工标定且论述足够精确)。
2)计算平移矩阵,需要知道真实场景中一个段(或边)的长度
3)该文不仅包含相机标定,还包含三维重建的工作——标定完成后,在每个势对象周围放置一个矩形框,实现重构,盒子的正面被分配了纹理。

邓刚, 张志强, 孙济洲. 用未标定相机构造三维模型.

用三个灭点确定相机的内部参数矩阵,然后通过分解基础矩阵求解出相机的外部参数,从而完成相机的定标过程,在此基础上,实现三维模型的构造。

基于灭点的相机标定的两幅图像的三维物体重建
在这里插入图片描述

一种基于二消失点的相机自标定方法(专利)

本发明公开了一种基于二消失点的相机自标定方法。以场景中两组正交的平行线为自标定图案,获取不同视点的四幅及以上序列图像,用基于Harris亚像素角点检测方法提取每幅图像中自标定图案的四个交点,并求出两个消失点的图像坐标。

求灭点:
(1)角点检测:采用基于Harris像素角点检测方法检测序列图像,提取每幅图像的两组相互正交的平行直线的四个交点的图像坐标
(2)根据四个交点的坐标和灭点的定义,求出两灭点的图像坐标

计算相机内参(主点坐标 + 焦距):
需要四张以上的图像,因为未知数的个数
在这里插入图片描述

灭点检测方法包括两个步骤:

第一步,输入图像的直线检测。最常用的直线检测方法就是先进行canny边界检测,然后将线段连接。第二步,计算这些直线的交点作为消失点的候选,然后使用一些优化方法(例如最小二乘、投票方式)来获得最优的三个消失点。

相机标定中四个坐标系之间的变换关系

https://blog.csdn.net/lyl771857509/article/details/79633412

在这里插入图片描述

2016-06-06 19:34:20 u013517182 阅读数 4708


灭点检测在三维重建、计算机视觉有着重要的应用;主要的应用是根据单幅图像能够获取相机的内参数,适应的大多数场景为曼哈顿结构。

最近参考了2013年CVPR的一篇文章《Globally Optimal Line Clustering and Vanishing Point Estimation in ManhattanWorld》,没有对于该文章的算法进行算法测试。不过目前业界公认的最好的灭点检测算法为J-Linkage,J-linkage灭点检测算法最初被R Toldo,A Fusiello在2008年的一篇ECCV文章:Robust Multiple Structures Estimation with J-Linkage提出,2009年被加拿大麦吉尔大学Jean-Philippe Tardif推广到灭点检测算法上:《Non-iterative approach for fast and accurate vanishing point detection》,在其主页上能够下载到J-Linkage源码,但环境配置略微复杂。

调研了很多灭点检测的算法,写一个综述。

灭点检测算法综述

       以2013年的《Globally Optimal Line Clustering and Vanishing Point Estimation in ManhattanWorld》为例对于灭点检测算法进行一个综述。灭点检测算法实质即为聚类算法,直线段能够检测出,直线的交点亦能够检测出,若已知灭点的位置,则直线的分类能够计算出,若已知直线的分类,则灭点的位置亦能够计算出,这是一个先有鸡还是先有蛋的问题。


现有的灭点检测算法可分为四类。

第一类即为通过霍夫变换来进行灭点的检测,对于每一个可能的直线对,这对直线交点的方向能够被计算出来,并且他们的角度能够积累到一个参量中。通过选择包含最高数量词目的参量来获得占据主导的灭点。然而,这种方法对于角度参量量化的水平十分的敏感,可能导致多重的检测。除此之外,由于灭点是各自独立检测,所以这种方法并不能够直接在灭点上强加正交性的约束。高斯球灭点检测算法的思想与该算法类似,即把图像中的直线映射到高斯球上,在高斯球上划分累加单元,求取交点数目最多的累加单元对应的球坐标,再映射到原图像中即为灭点的位置。


第二类即为通过RANSAC的方法对灭点进行检测。具体的过程是:随机的选择两条直线来创建一个假设的灭点,之后再计算通过这个假设灭点的直线的数量。经过一定数量的迭代之后,返回值是一个能够最大化相交直线数量的灭点(同时返回相关联的直线簇)。J-Linkage是对于RANSAC多模型的扩展。RANSAC以及它的延伸算法(multi-RANSAN,J-linkage等等)的一个重要的理论限制是不能够保证它们解的最优化(就最大化直线的数量来说)。并且结果不是唯一的,即对于同一组数据两次运行的结果可能不一样。《Consensus set maximization with guaranteed global optimality for robust geometry estimation》提出一种能够克服这些限制的方法,但是这种方法受限于有着线性距离函数的线性问题。《Optimal estimation of vanishing points in a manhattanworld》提出了一种多项式逼近来使得灭点正交的方法,然而这只能够考虑到代数的损失。


第三种涉及到对于未知实体进行穷举搜索的过程。例如《Rotation estimation and vanishing point extraction by omnidirec-tional vision in urban environment》中展示了一种对于旋转空间采样来确定最为一致的旋转,这是一种能够最大化直线簇的方法。这种方法能够很好的对直线进行分类并且能够很好地使得灭点正交。然而这取决于采样的间隔以及初始值。而且即使采样取得很好也并不能够保证得到最佳值。


第四种则直接面对先有鸡还是先有蛋的问题,这种方法也基本上遵循EM方法。即它交替在给定一个已经存在的或者假设的灭点,来进行直线分类的期望(E)步骤,与通过E步骤给定的数据集,来计算灭点这样一个最大化的步骤(M)。这样迭代计算直至收敛即可。然而这种方法高度依赖初始情况以及可能汇聚到局部最小值这种情况。EM算法在灭点检测领域有三篇文章供参考,最早的问CVPR2000的一篇《Automatic Recovery of Relative Camera Rotations for Urban Scenes》,该文章中对于EM算法讲述的十分详细,并且利用霍夫变换的方法进行初始化;另外一篇为Video Compass2002年的《Video Compass》,该文章中对于EM迭代算法讲述的较为简略;还有一篇《Efficient Edge-Based Methods for Estimating Manhattan Frames in Urban Imagery》,文章浏览了一下,内容涉及EM算法进行求解最优值的问题。



2017-08-04 22:29:23 mutouafangzi 阅读数 2369

景深

概念

  • 简单的理解,景深就是我们的肉眼距离显示器的距离,景深越大,元素离我们越远,效果就不好,在我们CSS3中,perspective用于激活一个3D空间,属性值就是景深大小(默认none无景深);
  • 设置景深:

    //在父元素上设置
    perspective: 200px;
    //或者
    transform:perspective(300px);
  • 应用景深的元素称为“舞台元素”,舞台元素的所有后代元素都会受影响,(如果后代元素中也添加了perspective属性,效果会叠加而不是覆盖);

  • CSS3 3D transform的透视点是在浏览器的前方,或者这么理解吧:显示器中3D效果元素的透视点在显示器的上方(不是后面),近似就是我们眼睛所在方位!
    • 比方说,一个1680像素宽的显示器中有张美女图片,应用了3D transform,同时,该元素或该元素父辈元素设置的perspective大小为2000像素。则这张美女多呈现的3D效果就跟你本人在1.2个显示器宽度的地方(1680*1.2≈2000)看到的真实效果一致!!
      图说perspective

景深示例

示例一

  • 当两个父级元素设置不同的景深距离,那么将两个父元素的子元素设置相同的translateZ,则两个子盒子呈现的3D平移效果导致子盒子大小不同;
    不通景深距离设置相同 translateZ
//css样式设置
<style>
    *{
        padding: 0;
        margin: 0;
    }
    #box1{
        float: left;
        width: 300px;
        height: 300px;
        background-color: red;
        perspective:3000px;
        position: relative;
    }
    #box2{
        float: left;
        width: 300px;
        height: 300px;
        background-color: gray;
        perspective:6000px;
        position: relative;
    }
    #innerbox1{
        position: absolute;
        width: 150px;
        height: 150px;
        left: 50%;
        top: 50%;
        margin-left: -75px;
        margin-top: -75px;
        background-color:green;
        transform: translateZ(1200px);
    }
    #innerbox2{
        position: absolute;
        width: 150px;
        height: 150px;
        left: 50%;
        top: 50%;
        margin-left: -75px;
        margin-top: -75px;
        background-color:blue;
        transform: translateZ(1200px);
    }
</style>
//HTML结构设置
<body>
    <div id="box1">
        <div id="innerbox1">inner1</div>
    </div>
    <div id="box2">
        <div id="innerbox2">inner2</div>
    </div>
</body>

示例二

  • 设置父元素perspective为200px,则其子元素的变化;
  • 设置的translateZ值越小,则子元素大小越小(因为元素远去,我们眼睛看到的就会变小);
    这里写图片描述

  • 设置的translateZ值越大,该元素也会越来越大;
    这里写图片描述

  • 所以,当translateZ值非常接近201像素,但是不超过201像素的时候(如200像素),该元素的大小就会撑满整个屏幕(如果父辈元素没有类似overflow:hidden的限制的话)。因为这个时候,子元素正好移到了你的眼睛前面,所谓“一叶蔽目,不见泰山”,就是这么回事。当translateZ值再变大,超过201像素的时候,该元素看不见了——这很好理解:我们是看不见眼睛后面的东西的!

//css样式设置
<style>
    *{padding: 0;margin: 0;}
    #box1{
        float: left;
        width: 300px;
        height: 300px;
        background-color: red;
        perspective:200px;
        position: relative;
    }
    #innerbox1{
        position: absolute;
        width: 150px;
        height: 150px;
        left: 50%;
        top: 50%;
        margin-left: -75px;
        margin-top: -75px;
        background-color:green;
        //设置相同的perspective:200px;然后将子元素设置不同的translateZ。越大的translateZ,显示越大。
        transform: translateZ(80px);
        //transform: translateZ(10px);
    }
</style>

//HTML设置
<body>
    <div id="box1">
        <div id="innerbox1">inner1</div>
    </div>
</body>

景深和灭点关系

  • 灭点指的是立体图形各条边的延伸线所产生的相交点,透视点的消失点;
  • 景深越大,灭点越远,元素的变形越小;
  • 景深越小,灭点越近,元素的变形越大;

    //css样式的设置
    <style>
        *{margin:0;padding:0;}
        /*
        景深越大,灭点越远,元素的变形越小
        景深越小,灭点越近,元素的变形越大
        */
    
        //设置一个盒子的样式
        #wrap{float: left;width: 100px;height: 100px;padding: 100px;border: 1px solid;perspective: 200px;}
        #inner{transform: rotateX(120deg);}
        #inner{width: 100px;height: 100px;background-color: deeppink;transition: 2s;}
    
        //设置另外一个盒子的样式
        #wrap1{float: left;width: 100px;height: 100px;padding: 100px;border: 1px solid;perspective: 600px;}
        #other{width: 100px;height: 100px;background-color: hotpink;transition: 2s;}
        #other{transform: rotateX(120deg);}
    </style>
    
    
    //HTML结构如下
    <body>
        <div id="wrap">
            <div id="inner">inner</div>
        </div>
        <div id="wrap1">
            <div id="other">other</div>
        </div>
    </body>

    结果如下图:
    这里写图片描述

2016-04-10 16:15:58 u013517182 阅读数 1601

EM算法在机器学习领域有着重要的应用,其根本上要解决的问题即为是先有鸡还是先有蛋的问题;LZ最近在看EM算法在直线分类与灭点检测中的应用;翻阅了不少文献,主要参考MIT的Automatic Recovery of Relative Camera Rotation for Urban Scenes,链接如下http://biorobotics.ri.cmu.edu/papers/sbp_papers/a/cvpr2000_arrcrus.pdf,翻阅了几篇关于EM在直线分类与灭点检测中的应用,也就数此篇讲述较为详细。以下为小白对于此篇文章中介绍到到的算法进行分析与理解。 顾名思义,算法分为3部分,第一步为E步骤,按照字面上理解E步骤应该是期望(Expection)的意思,然而在直线分类灭点检测中并不能够直接的看到E步骤中有期望的意思,若是要追溯到期望,参考以下两篇文章http://blog.csdn.net/zouxy09/article/details/8537620 http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html 第二步即为M步骤,即为最大(Maximition),同样的可以在以上两篇文章中找到答案;初始化也十分的重要;以下给出具体的步骤。  

1.E step E步骤假设已经灭点的向量(考虑到外点的存在,所以此处假设为多个灭点,一般应该为4个灭点)以及与之相联系的概率,另外还有

高斯函数的方差。有了这些参量之后,对于所有的直线以及所有的灭点我们都可以进行下面的计算:,其中通过寻找下列矩阵的最大的特征值来得到,其中为边缘的协方差,表示协方差阵在上的投影。至此,得到了,此结果将在下述表达中用到。根据计算得到的,我们进行下列计算,这个表达式在数学上表示在发生的条件下,发生的概率,根据原文的叙述,这一步骤为对于直线进行classification的关键步骤,因为原文对于这一表达式给出的解释是每一个属于的概率,看起来事件的先后顺序有颠倒,这一点有待理解;那么分类的关键应该就是对于每一条直线,根据它的选择最大的那一个就可以对于这条直线属于哪一个灭点找到明确的答案。以上表示分类的步骤。
2.M step
对于直线分类完了之后,我们再次计算灭点的坐标,还记得在E step中我们已经假设了灭点的坐标,此步骤主要是对于灭点的坐标进行调整;要知道我们最终达到的目的是完成对于直线的分类,而这些直线已经全部检测到,并且位置不能够改变,而灭点的位置是不确定的,对于直线的属性的不确定性就是分类问题,对于灭点的不确定性就是位置问题。如果E步骤完成了对于直线的分类的话,那么M步骤可想而知将根据分类的直线对于灭点进行检测(此处分类的直线应该是所有的直线,只不过某条直线距离某个灭点比较大的话,该直线权重比较大,这一点在下面将会看到)。
调整,以及重新求取灭点的坐标值,即通过对于的SVD分解,求取最小奇异值对应的特征向量。为包含权重为对角元素的对角矩阵,的行向量为直线的向量。注意到我们M步骤修改的参量即为E步骤需要的值,也即初始化的值,上述的应该求取至少4次,因为需要知道4个灭点,而要知道对于同一条直线,不同的灭点的权重是不一样的,所以应该至少得到4个不同的值。

初始化
初始化用到了一些霍夫变换之类的东西,中间看到这样一句话,讲的是直方图中的极值点对应EM算法中的灭点,大概是对于直线的方向进行统计,然后对于灭点初始化。同样可以参考另外一篇文章,但是没有上述推荐的两篇文章讲的详细:http://xueshu.baidu.com/s?wd=paperuri%3A%289a32a6802b4514e9b7a9344e8726ce7f%29&filter=sc_long_sign&tn=SE_xueshusource_2kduw22v&sc_vurl=http%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Bjsessionid%3DCB7E0066B92E5409AC08C8B64F0C5610%3Fdoi%3D10.1.1.91.5186%26rep%3Drep1%26type%3Dpdf&ie=utf-8
2015-04-17 18:23:00 xiao_lxl 阅读数 5356

图像预处理——透视变换(一)

摄像机获取的像点会随着真实场景中的点距摄像机的远近不同而发生不同的变形,这即是所谓的透视畸变


透视投影的特征:

1、近大远小、近高远低;

2、近长远短,近高远低;

3、近疏远密;

4、互相平行的直线的透视汇交于一点

因此,要恢复场景的原来形状或者从原来图像中提取标志点的真实位置信息,就应该消除图像的透视效应。


灭点:

空间一组平行线的无穷远点在图像上的成像,即该组平行线在影响上的直线影像的交点。在坐标轴上的灭点为主灭点。透视投影按主灭点的个数分为一点透视、两点透视和三点透视。三维图形显示采用的投影一般为简单的一点透视投影, 由于在一点透视投影变换中,投影平面取坐标系中的一个坐标平面, 因而用一个坐标系即可表示透视投影变换。


摄像机模型

摄像机的投影几何模型是把三维坐标投影到一个球面(视球), 然后把球面上的影像投影到一个平面, 理想情况下,平面对称于光轴中心, 理想状况的透视模型等价于小孔成

像。小孔成像原理见图1 。图1 中, 平面S 为二维成像平面,O为小孔的位置(光学中心)。S 上的点p(u , v) 是三维空间点P(x , y , z)在视平面上的投影, f 是该光学系统的焦距。空间任意点P(物距w f )在图像上的成像位置都可以用针孔模型来近似表示, 即任意一点P 在图像上的位置p , 为光心O与P 点的连线OP 与图像平面的交点(这种关系也叫中心摄影)。且有如下比例关系式:

 


灭点

阅读数 3174

没有更多推荐了,返回首页