精华内容
下载资源
问答
  • 双目视觉三维重建

    2018-08-14 12:45:37
    一些双目三维重建的代码,有matlab和c++的,效果不错。
  • 本发明为双目立体视觉三维重建方法,属于图像处理与机器视觉领域,涉及halcon软件,具体涉及空间场景的三维重建。背景技术:三维重建技术作为计算机视觉领域的一个重要分支,在人工智能、虚拟现实、非接触无损检测...

    本发明为双目立体视觉的三维重建方法,属于图像处理与机器视觉领域,涉及halcon软件,具体涉及空间场景的三维重建。

    背景技术:

    三维重建技术作为计算机视觉领域的一个重要分支,在人工智能、虚拟现实、非接触无损检测等方面起着重要的作用。获取物体表面三维数据的方法有:一、利用建模软件进行重建。该方法可以构造出物体的精细结构,但是这些软件操作复杂,自动化程度低,建模周期长,需要大量的人力物力,在对不规则物体重建时真实感不高;二、利用激光设备、深度扫描仪等进行三维重建。该方法能够获得比较精确的三维数据,并且简单方便,建模周期短,但其设备比较昂贵,携带不方便;三、利用视频或图像来进行三维重建。该方法具有成本低、效率高、灵活性强、所需设备简单等特点,适合各种三维物体的重建。因此,基于图像或视频的重建方法无疑具有很高的使用价值。人类视觉能够把图像信息转换成立体信息,从而达到对客观真实世界在三维空间上的认知。在众多基于图像或视频进行三维场景重建的方法中,立体视觉的研究目标就是通过模仿人类的视觉机理,使机器人具有通过多幅图像认知周围环境信息的能力,这种能力不仅可以使机器人对客观三维场景中物体的几何信息、外形、位置、运动形态等进行感知,并且能够完成对这些信息的保存、描述、归纳与识别。

    技术实现要素:

    本发明为了重建现实场景中的三维模型,提供了一种基于双目立体视觉的三维重建方法,该系统包括图像采集模块、摄像机标定模块、图像预处理模块、立体校正模块、立体匹配模块、点云重建及模型重建模块;具体检测方法步骤为:

    A、图像采集;B、摄像机标定;C、立体校正;D、图像预处理;E、立体匹配;F、点云重建及模型重建。

    所述的图像采集模块的功能为:根据物体的尺寸,调整相机的位置及两个相机的距离与角度,拍摄物体不同角度的两幅图像,完成图像的实时采集。摄像机标定模块的功能为:以张正友标定法为基础对相机进行标定,建立摄像机图像像素坐标与场景点三维坐标之间的关系,根据摄像机模型,由标定板己知特征点的图像坐标和世界坐标求解摄像机的内外参数。立体校正模块的功能为:采用相交光轴结构的视觉系统,通过极线约束将图像校正为标准的外极线几何结构,使两图像的对应点在同一条极线上,缩小匹配搜索空间。图像预处理模块的功能为:将采集的电信号转化为数字图像信息,在计算机内实现存储、处理。图像处理软件采用德国MVtec公司开发的具有标准的机器视觉算法包、拥有应用广泛的机器视觉集成开发环境的HALCON软件。立体匹配模块的功能为:通过基于多重网格的立体匹配算法找到空间中一点在两幅图像投影中的对应点,获取得到整幅图像的稠密视差图。点云重建及模型重建模块的功能为:通过双目立体视觉的深度信息恢复原理获取物体的深度信息,计算空间点的三维坐标,得到空间三维点云,并对三维点云进行平滑滤波,最后进行三角剖分。

    前面所述系统中,优选方案为,所述步骤A用到的设备有两个CCD摄像机、设备支架和计算机;两个CCD摄像机是采用相交光轴的结构形式固定在设备支架上,采集不同角度的物体图像对,通过总线接口将图像传输到计算机进行处理;所述摄像机的相机和镜头分别选用MV-VS120 CCD彩色高清工业相机和M-1614MP2工业镜头。

    前面所述系统中,优选方案为,所述步骤B选用30×30mm,图像阵列为7×7,黑色圆点半径为0.9375mm,圆点中心距离为3.75mm的圆心陈列型平面标定模板,以张正友标定法为基础,具体步骤如下所示:

    B1、采集多幅标定板图像,通过阈值分割找到标定板的内部区域;

    B2、通过亚像素边缘提取方法得到标定板各个圆点的边缘,通过最小二乘圆拟合获取圆点的圆心坐标,确定圆心坐标与它们在图像中投影之间的对应关系以及标定板与摄像机之间大致的位置关系,即摄像机的外参初始值;

    B3、调用Halcon库函数来确定两个摄像机的内参数、外参数以及两个摄像机之间的相对位置关系;最后,通过多次测量取平均值来确定相关参数信息。

    前面所述系统中,优选方案为,所述步骤C通过极线约束进行立体校正,使两幅图像中的对应点在同一条水平极线上,并获取校正后相机参数。

    前面所述系统中,优选方案为,所述步骤D具体步骤如下:

    D1、把采集的彩色图像对通过加权平均法转化为灰度图像;

    D2、全局阈值分割,获取图像中感兴趣的区域;

    D3、进行直方图均衡化操作处理,使得图像的灰度分布趋向平均,图像所占有的像素灰度间距拉开,加大图像的反差,达到图像增强的目的。

    前面所述系统中,优选方案为,所述步骤E具体步骤如下:

    E1、通过极线约束及测量相机与目标物体的距离估计出的视差搜索空间,从而减少匹配的搜索范围;

    E2、通过多重网格技术引进粗网格系列加速偏微分方程的收敛,提高匹配速度;

    E3、通过细网格迭代,将残差从最细网格依次限制到粗糙的网格中,运用像素的灰度、梯度及平滑度相结合的相似度判断准则在粗网格搜索空间内寻找匹配点,得到视差值;

    E4、将粗网格得到的视差值依次延拓到细网格,通过修正组合得到最终匹配点的视差值;

    E5、按照以上步骤在整幅图像上进行遍历,直到得到完整连续的视差图。

    前面所述系统中,优选方案为,所述步骤F具体步骤如下:

    F1、通过双目立体系统深度恢复原理,获取图像每个点的三维空间坐标,得到三维点云;

    F2、对空间点云进行基于移动最小二乘法的平滑滤波,获取平滑后的三维点云;

    F3、对平滑后的三维点云进行基于贪婪算法的三角剖分,并立体显示。

    与现有技术相比,本发明的优点在于:

    1、本发明采用基于多重网格的密集型立体匹配算法。通过极线约束及测量相机与目标物体的距离估计出的视差搜索空间,从而减少匹配的搜索范围;通过多重网格技术引进粗网格系列加速偏微分方程的收敛,提高匹配速度,该方法首先通过细网格迭代,将残差从最细网格依次限制到粗糙的网格中,运用像素的灰度、梯度及平滑度相结合的相似度判断准则在粗网格搜索空间内寻找匹配点,然后依次延拓到细网格,通过修正组合得到最终匹配点的视差值,避免了对灰度值的过度依赖,并且可以通过平滑度估计未找到对应点的点的视差,所得视差域平滑连续;

    2、本发明通过移动最小二乘拟合法对点云进行平滑滤波。通过采用局部高阶多项式为散乱点云提供一个逼近或插值曲面,然后通过迭代投影方法将分布在逼近曲面周围的点移至到曲面上来消除噪声,有效解决了分段拟合不能局部化处理的缺点,极大地提高了拟合曲面的连续性和光滑性;

    3、本发明采用贪婪算法对平滑后的三维点云进行三角剖分。首先通过半径邻域搜索算法搜索符合条件的邻近点,并将邻域点投影到切平面上,使用贪婪算法进行局部二维三角剖分,然后将二维三角剖分点映射回空间中,形成空间三角网格,该方法思想简单,易于实现。

    附图说明

    图1为本发明的硬件连接图。

    图2为本发明重建方法流程图。

    图3为本发明得到的视差图。

    图4为本发明平滑后的三维点云图。

    图5为本发明得到的三角剖分图。

    图6为本发明得到的模型图。

    具体实施方式

    下面结合实施例和实验例详细说明本发明的技术方案,但保护范围不限于此。

    实施例

    一种基于双目立体视觉的三维重建方法以及实现这种方法的图像处理系统,从而实现现实场景的重建。

    图像处理系统结构图包含图像采集模块、摄像机标定模块、立体校正模块、图像处理模块、立体匹配模块以及点云重建及模型重建模块。

    图1为本发明的系统结构图,其包括:

    通过两个CCD相机拍摄两幅物体不同角度的图像;

    通过摄像机总线接口将获取的图像传输到计算机进行处理;

    图像处理单元为安装在计算机内部的halcon软件,用于将采集的图像进行灰度化、自动阈值分割、直方图均衡化、基于多重网格的立体匹配、基于移动最小二乘法的点云平滑以及基于贪婪算法的三角剖分等处理,进而获得物体的立体显示图;

    图2为本发明的图像处理流程图,该方案包括如下步骤:

    A、图像采集,具体步骤:两个CCD摄像机是采用相交光轴的结构形式固定在设备支架上,通过采集不同角度的物体图像对,通过总线接口传输到计算机进行处理;所述摄像机的相机和镜头分别选用维视图像MV-VS120 CCD彩色高清晰工业相机和M-1614MP2工业镜头;

    B、摄像机标定,具体步骤如下所示:

    B1、采集多幅标定板图像,通过阈值分割找到标定板的内部区域;

    B2、通过亚像素边缘提取方法得到标定板各个圆点的边缘,通过最小二乘圆拟合获取圆点的圆心坐标,确定圆心坐标与它们在图像中投影之间的对应关系以及标定板与摄像机之间大致的位置关系,即摄像机的外参初始值;

    B3、调用Halcon库函数来确定两个摄像机的内参数、外参数以及两个摄像机之间的相对位置关系;最后,通过多次测量取平均值来确定相关参数信息;

    C、立体校正将图像校正为标准极线几何结构,并得到校正后的相机参数;

    D、图像处理,具体步骤如下所示:

    D1、把采集的彩色图像对通过加权平均法转化为灰度图像;

    D2、进行直方图均衡化操作处理,使得图像的灰度分布趋向平均,图像所占有的像素灰度间距拉开,加大图像的反差,达到图像增强的目的;

    D3、全局阈值分割,获取图像中感兴趣的区域;

    E、基于多重网格的立体匹配,具体步骤如下所示:

    E1、通过极线约束及测量相机与目标物体的距离估计出的视差搜索空间,从而减少匹配的搜索范围;

    E2、通过多重网格技术引进粗网格系列加速偏微分方程的收敛,提高匹配速度;其基本思想是引进一种粗网格系列加速细网格修正量的传播,并通过套迭代过程反复求解,以得到快速消除低频误差,提高结果的准确性。多重网格方法包括细网格松弛、粗网格校正和套迭代技术过程,细网格松弛过程可以迅速去除高频分量,而粗网格修正过程可以消除被光滑的低频分量,套迭代技术负责通过限制算子和延拓算子连接各层通过不断迭代快速精确地处理问题;

    E3、通过细网格迭代,将残差从最细网格依次限制到粗糙的网格中,运用像素的灰度、梯度及平滑度相结合的相似度判断准则在粗网格搜索空间内寻找匹配点,得到视差值;

    E4、将粗网格得到的视差值依次延拓到细网格,通过组合修正得到最终匹配点的视差值;

    E5、按照以上步骤在整幅图像上进行遍历,直到得到完整连续的视差图,如图3所示;

    F、点云重建及模型重建,具体步骤如下所示:

    F1、通过双目立体系统深度恢复原理,获取图像每个点的三维空间坐标,得到三维点云;

    F2、对空间点云进行基于移动最小二乘法的平滑滤波,获取平滑后的三维点云。其基本思想通过采用局部高阶多项式为离散点云提供一个逼近曲面,然后采用迭代投影的方式将分布在逼近曲面周围的点移至到曲面上来,达到光滑点云表面的目的,通过拟合函数计算得到光滑后的三维坐标,获得平滑后的三维点云图,如图4所示;

    F3、对平滑后的三维点云进行基于贪婪算法的三角剖分,该算法思想简单,易于实现,一旦被写入将不会被删除,这样使得算法的内存利用率较高。首先通过半径邻域搜索算法在以某空间点为中心半径为r的球内搜索符合条件的邻近点;将中心点以及它的邻域点投影到切平面上,使用基于三角形生长法的贪婪算法进行局部二维三角剖分;然后将二维三角剖分点映射回空间中,形成一张空间三角网格,继续对空间中其他点进行上述操作,直到形成一张完整的曲面,如图5所示,并立体显示,如图6所示。

    应当指出的是,具体实施方式只是本发明比较有代表性的例子,显然本发明的技术方案不限于上述实施例,还可以有很多变形。本领域的普通技术人员,以本发明所明确公开的或根据文件的书面描述毫无异议的得到的,均应认为是本专利所要保护的范围。

    展开全文
  • 双目三维对好像就听过:Bundler和CMVS-PMVS但是三维重建开源项目就很多了1、Meshroom ⭐4,474Meshroom是一款基于AliceVision摄影测量计算机视觉框架的免费开源三维重建软件。...

    双目三维对好像就听过:

    Bundler和CMVS-PMVS

    但是三维重建开源项目就很多了

    1、Meshroom ⭐4,474

    Meshroom是一款基于AliceVision摄影测量计算机视觉框架的免费开源三维重建软件。https://github.com/alicevision/meshroom​github.com

    2、 Openmvg ⭐2,829

    Openmvg库根据三维计算机视觉和结构的运动。OpenMVG提供了一个端到端的3D重建,它由图像框架组成,包含库、二进制文件和管道。这些库提供了简单的功能,如:图像处理,功能描述和匹配,功能跟踪,相机模型,多视图几何,旋转估计…

    该二进制文件解决了管道可能需要的单元任务:场景初始化、特征检测与匹配和运动重建的结构,并将重建的场景导出到其他多视点立体视觉框架中,以计算密集的点云或纹理网格。

    这些管道通过链接各种二进制文件来计算图像匹配关系

    OpenMVG是用c++开发的,可以在Android、iOS、Linux、macOS和Windows上运行。https://github.com/openMVG/openMVG​github.com

    3、 Awesome_3dreconstruction_list ⭐2,261

    与图像3D重建相关的论文和资源精选清单https://github.com/openMVG/awesome_3DReconstruction_list​github.com

    4、Awesome Point Cloud Analysis ⭐1,801

    关于点云分析(处理)的论文和数据集列表https://github.com/Yochengliu/awesome-point-cloud-analysis​github.com

    5、Opensfm ⭐1,635

    OpenSfM是一个用Python编写的运动库的结构。该库作为一个处理管道,用于从多个图像重建相机姿态和3D场景。它由运动结构的基本模块(特征检测/匹配,最小解算)组成,重点是构建一个健壮的、可伸缩的重建管道。它还集成了外部传感器(如GPS、加速计)测量,以实现地理定位和鲁棒性。提供了一个JavaScript查看器来预览模型和调试管道。

    mapillary/OpenSfM​github.com

    6、Alicevision ⭐1,318

    AliceVision是摄影测量计算机视觉框架,可提供3D重建和相机跟踪算法。AliceVision旨在通过可测试,分析和重用的最新计算机视觉算法提供强大的软件基础。该项目是学术界和工业界合作的结果,旨在为尖端算法提供鲁棒性和生产使用所需的质量。https://github.com/alicevision/AliceVision​github.com

    7、Openmvs ⭐1,193

    OpenMVS是面向计算机视觉的库,尤其是针对多视图立体重建社区的。尽管有针对运动结构管道(例如OpenMVG)的成熟而完整的开源项目,这些管道可以从输入的图像集中恢复相机的姿势和稀疏的3D点云,但没有一个解决摄影测量链的最后一部分-流。OpenMVS旨在通过提供一套完整的算法来恢复要重建场景的整个表面来填补这一空白。输入是一组摄影机姿势加上稀疏的点云,输出是带纹理的网格。该项目涉及的主要主题是:密集的点云重构,以获得尽可能完整,准确的点云

    网格重建,用于估计最能解释输入点云的网格表面

    网格细化可恢复所有精细细节

    网格纹理,用于计算清晰准确的纹理以对网格着色https://github.com/cdcseacave/openMVS​github.com

    8、Bundler_sfm ⭐1,158snavely/bundler_sfm​github.com

    9、Bundlefusion ⭐752

    使用在线表面重新整合进行实时全局一致的三维重建https://github.com/niessner/BundleFusion​github.com

    10、Face_swap ⭐636

    面部交换:https://github.com/YuvalNirkin/face_swap​github.com

    11、Scannet ⭐678

    ScanNet是一个RGB-D视频数据集,包含超过1500次扫描中的250万次视图,使用3D摄像机姿态、表面重建和实例级语义分段进行注释。ScanNet/ScanNet​github.com

    12、Softras⭐540

    SoftRas是一个真正的可微分渲染框架,把渲染作为一个可微分的聚合过程,融合所有网格三角形的概率贡献相对于渲染像素。ShichenLiu/SoftRas​github.com

    13、Pifu ⭐474

    https://github.com/shunsukesaito/PIFu​github.com

    14、Matterport ⭐460

    用于RGB-D机器学习任务的非常棒的数据集。niessner/Matterport​github.com

    15、Kimera⭐456

    Kimera是一个用于实时度量-语义同步定位和映射的c++库,它使用摄像机图像和惯性数据来构建环境的语义注释3D网格。Kimera是模块化的,支持ros,在CPU上运行。https://github.com/MIT-SPARK/Kimera​github.com

    16、 Mvs Texturing ⭐421

    项目可以根据图像对3D重建进行纹理处理。该项目专注于使用运动和多视图立体技术的结构生成的3D重建。nmoehrle/mvs-texturing​github.com

    17、Livescan3d ⭐402

    LiveScan3D是一个实时三维重建系统,使用多个Kinect v2深度传感器同时进行三维重建。产生的3D重建形式是有色点云的形式,所有Kinect的点都放置在同一坐标系中。该系统的可能使用场景包括:同时从多个视点捕获对象的3D结构,

    捕获场景的“全景” 3D结构(通过使用多个传感器来扩展一个传感器的视场),

    将重建的点云流式传输到远程位置,

    通过让多个传感器捕获同一场景来提高单个传感器捕获的点云的密度。MarekKowalski/LiveScan3D​github.com

    18、Voxelhashing ⭐364

    大规模、实时三维重建:niessner/VoxelHashing​github.com

    19、Layoutnet ⭐298

    从单个RGB图像重建三维房间布局

    https://github.com/zouchuhang/LayoutNet​github.com

    20、 Tsdf Fusion Python ⭐295

    这是一个轻量级的python脚本,可将多个颜色和深度图像融合到TSDF体积中,然后可以将其用于创建高质量的3D表面网格和点云。在Ubuntu 16.04上测试效果如下图:

    andyzeng/tsdf-fusion-python​github.com

    21、Intrinsic3d ⭐231

    通过外观和几何优化以及空间变化的照明实现高质量3D重构

    NVlabs/intrinsic3d​github.com

    22、Kimera Semantics ⭐228

    从2D数据进行实时3D语义重构

    https://github.com/MIT-SPARK/Kimera-Semantics​github.com

    23、Awesome Holistic 3d ⭐209

    3D重建的论文和资源清单:https://github.com/holistic-3d/awesome-holistic-3d​github.com

    24、3dreconstruction ⭐151

    使用Python3进行SFM的3D重建alyssaq/3Dreconstruction​github.com

    25、Structured3d ⭐121

    用于结构化3D建模的大型照片级数据集

    https://github.com/bertjiazheng/Structured3D​github.com

    26、Synthesize3dviadepthorsil ⭐117

    通过对多视图深度图或轮廓建模来生成和重建3D形状

    Amir-Arsalan/Synthesize3DviaDepthOrSil​github.com

    27、Msn Point Cloud Completion ⭐111

    https://github.com/Colin97/MSN-Point-Cloud-Completion​github.com

    28、Cnncomplete ⭐107

    用于训练体积深层神经网络以完成部分扫描的3D形状的代码

    angeladai/cnncomplete​github.com

    29、Reconstructiondataset ⭐95

    用于进行三维重建的一组图像https://github.com/rperrot/ReconstructionDataSet​github.com

    30、3d Recgan Extended ⭐81

    从单个深度视图进行密集的3D对象重建Yang7879/3D-RecGAN-extended​github.com

    展开全文
  • 各位好,最近在学习双目立体视觉的相关知识,有没有大神能讲解一下利用双目相机的原始图、生成的视差图和相机内参生成点云的方法和 demo code,还有我在利用BM算法生成的深度图用照片查看器无法打开,提示无效的位图...

    各位好,最近在学习双目立体视觉的相关知识,有没有大神能讲解一下利用双目相机的原始图、生成的视差图和相机内参生成点云的方法和 demo code,还有我在利用BM算法生成的深度图用照片查看器无法打开,提示无效的位图文件或不支持文件的格式,代码如下,不知道什么原因?

    #include

    #include

    #include

    #include

    #include

    #include "time.h"

    using namespace std;

    using namespace cv;

    int main()

    {

    IplImage* img_r, *img_l;//定义两个图像指针 img_l = cvLoadImage("left_4.png",0);

    img_r = cvLoadImage("right_4.png",0);

    CvSize size = cvGetSize(img_l);

    CvMat* disparity_left = cvCreateMat(size.height,size.width,CV_16S);

    CvMat* disparity_right = cvCreateMat(size.height,size.width,CV_16S);

    CvStereoBMState *BMState = cvCreateStereoBMState();

    assert(BMState != 0);

    BMState->preFilterSize=41;

    BMState->preFilterCap=31;

    BMState->SADWindowSize=15;

    BMState->minDisparity=0;//最小视差,默认值为 0, 可以是负值,int 型 BMState->numberOfDisparities=32;

    BMState->textureThreshold=10;

    BMState->uniquenessRatio=15;//该参数不能为负值,一般5-15左右的值比较合适15 BMState->speckleWindowSize =100;

    BMState->speckleRange = 32;

    cvFindStereoCorrespondenceBM(img_l,img_r,disparity_left,BMState);

    cvReleaseStereoBMState(&BMState);

    CvMat* disparity_left_visual = cvCreateMat(size.height,size.width,CV_8UC1);

    cvNormalize(disparity_left,disparity_left_visual,0,256,CV_MINMAX);

    cvSave("disparity.png",disparity_left_visual);

    cvShowImage("disparity",disparity_left_visual);

    cvWaitKey(0);

    cvDestroyWindow("disparity");

    return 0;

    }

    展开全文
  • 双目视觉三维重建框架

    万次阅读 多人点赞 2018-01-23 14:08:52
    玉米竭力用轻松具体的描述来讲述双目三维重建中的一些数学问题。希望这样的方式让大家以一个轻松的心态阅读玉米的《计算机视觉学习笔记》双目视觉数学架构系列博客。这个系列博客旨在捋顺一下已标定的双目视觉中的...

    一、图像坐标:我想和世界坐标谈谈(A)

    玉米竭力用轻松具体的描述来讲述双目三维重建中的一些数学问题。希望这样的方式让大家以一个轻松的心态阅读玉米的《计算机视觉学习笔记》双目视觉数学架构系列博客。这个系列博客旨在捋顺一下已标定的双目视觉中的数学主线。数学推导是有着几分枯燥的,但奇妙的计算机视觉世界是建立在严密的数学架构之上的。所以对数学框架的理解是理解双目视觉的必由之路。不过请大家放心,接下来玉米会以尽量有趣,尽量更接地气儿的方式,阐释一下自己对双目视觉数学或者说是投影几何的理解。

           先来张《计算机视觉:算法与应用》中的3D重建示例图镇楼!

             好吧,现在言归正传,来看看几何学上世界是怎样投影进摄相机里的吧!接下来让我们来看一下本系列博客的第一“搏”:

    图像坐标:我想和世界坐标谈谈(A)

    首先,我先解释一下这个题目吧。题目的字面意义是说:图像坐标系想和世界坐标系谈谈。这里面包含着两个问题:

             A、谈话对象:视觉系统的三大坐标系:世界坐标系,摄像机坐标系和图像坐标系。这是玉米在本文《我想和世界坐标谈谈 (A)》中想要和大家分享的内容。其中主要包含:三大坐标系的位置、作用和应用场景。

             B、谈话方式:两个不同的坐标系之间该如何沟通呢?玉米将在《我想和世界坐标谈谈(B)》中和大家分享一下刚体变换和透视                 投影变换。连起两个坐标系之间这不在一个参考系的“世界上最远的距离”。

    好吧,下面让我们来揭开三大坐标系的庐山真面目。

             上图是三个坐标的示意简图,通过它大家可以对三个坐标有一个直观的认识。下面来看看三个坐标系的骨子里藏了什么。

             世界坐标系(XW,YW,ZW):其是目标物体位置的参考系。除了无穷远,世界坐标可以根据运算方便与否自由放置。在双目视觉中世界坐标系主要有三个用途:1、标定时确定标定物的位置2、作为双目视觉的系统参考系,给出两个摄像机相对世界坐标系的关系,从而求出相机之间的相对关系3、作为重建得到三维坐标的容器,盛放重建后的物体的三维坐标。世界坐标系是将看见中物体纳入运算的第一站。

            摄像机坐标系(XC,YC,ZC):其是摄像机站在自己角度上衡量的物体的坐标系。摄像机坐标系的原点在摄像机的光心上,z轴与摄像机光轴平行。它是与拍摄物体发生联系的桥头堡,世界坐标系下的物体需先经历刚体变化转到摄像机坐标系(旋转和平移),然后再和图像坐标系发生关系。它是图像坐标与世界坐标之间发生关系的纽带,沟通了世界上最远的距离。哈哈

             图像坐标系(x,y)/(u,v)像素 :其是以摄像机拍摄的二维照片为基准建立的坐标系。用于指定物体在照片中的位置。玉米更倾向将(x,y)称为连续图像坐标或空间图像坐标,将(u,v)称为离散图像坐标系或者是像素图像坐标系(虽然这样的称呼未经考证,但更能传达二者的物理意义)。

              (x,y)坐标系的原点位于摄像机光轴与成像平面的焦点O’(u0,v0)上,单位为长度单位(米)。(u,v)坐标系的原点在图片的左上角(其实是存储器的首地址)如上图所示,单位为数量单位(个)。(x,y)主要用于表征物体从摄像机坐标系向图像坐标系的透视投影关系。而(u,v)则是实实在在的,我们能从摄像机中得到的真实信息。

    (x,y)与(u,v)存在如下转换关系:

              dx代表x轴方向一个像素的宽度,dy代表y轴方向上一个像素的宽度。dx、dy为摄像机的内参数。(u0,v0)称为图像平面的主点,也是摄像机的内参数。其实相当于对x轴和y轴的离散化。其可以运用齐次坐标,将上式写成矩阵形式,如下:

     

          (1)式运用了齐次坐标,初学者可能会感到有些迷惑。大家会问:怎样将普通坐标转换为齐次坐标呢?齐次坐标能带来什么好处呢?

             玉米在这里对齐次坐标做一个通俗的解释。此处只讲怎么将普通坐标改写为齐次坐标及为什么引入齐次坐标。这里只做一个通俗但不太严谨的表述。力求简单明了。针对齐次坐标的严谨的纯数学推导,可参见“周兴和版的《高等几何》---1.3拓广平面上的齐次坐标”。玉米曾详细读过《高等几何》这本书,但觉得离计算机视觉有点远,是讲纯数学的投影关系的,较为生涩难懂。

            齐次坐标可以理解为在原有坐标后面加一个“小尾巴”。将普通坐标转换为齐次坐标,通常就是在增加一个维度,这个维度上的数值为1。如图像坐标系(u,v)转换为(u,v,1)一样。对于无穷远点,小尾巴为0。注意,给零向量增加小尾巴,数学上无意义。

    那么,为什么计算机视觉在坐标运算时要加上这个“小尾巴”呢?

            玉米看来有两点原因:

             1、 将投影平面扩展到无穷远点。如对消隐点(vanishing point)的描述。

              2、 使得计算更加规整

             如式(1)如果用普通坐标来表达的话,会是下面的样子:

    这样的运算形式会给后与运算带来一定的麻烦,所以齐次坐标是一个更好的选择。

              齐次坐标还有一个重要的性质,伸缩不变性。即:设齐次坐标M,则αM=M。

    玉米才疏学浅,笔记中如有纰漏指出,希望大家不吝指出。玉米在这里拜谢啦!

    二、图像坐标:我想和世界坐标谈谈(B)

             玉米将在这篇博文中,对图像坐标与世界坐标的这场对话中涉及的第二个问题:谈话方式,进行总结。世界坐标是怎样变换进摄像机,投影成图像坐标的呢?

            玉米做了一个简单的图示,在这里做一个提纲。图中显示,世界坐标系通过刚体变换到达摄像机坐标系,然后摄像机坐标系通过透视投影变换到达图像坐标系。可以看出,世界坐标与图像坐标的关系建立在刚体变换和透视投影变换的基础上。为了奖励刚体变和透视投影变换沟通了“世界上最远的距离”,玉米在图上奖励了他们两朵小红花。哈哈

            首先,让我们来看一下刚体变换是如何将世界坐标系与图像坐标系联系起来的吧。这里,先对刚体变换做一个介绍:

            刚体变换(regidbody motion):三维空间中, 当物体不发生形变时,对一个几何物体作旋转, 平移运动,称之为刚体变换

    因为世界坐标系和摄像机坐标都是右手坐标系,所以其不会发生形变。我们想把世界坐标系下的坐标转换到摄像机坐标下的坐标,如下图所示,可以通过刚体变换的方式。空间中一个坐标系,总可以通过刚体变换转换到另外一个个坐标系的。转一转,走一走,就到另外一个坐标系下了。以前可能是面朝大海,经过平移旋转,最终可能只能面朝冰山了,哈哈

             下面让我来看一下,二者之间刚体变化的数学表达。

             其中,XC代表摄像机坐标系,X代表世界坐标系。R代表旋转,T代表平移。R、T与摄像机无关,所以称这两个参数为摄像机的外参数(extrinsic parameter)可以理解为两个坐标原点之间的距离,因其受x,y,z三个方向上的分量共同控制,所以其具有三个自由度。

             R则为分别绕XYZ三轴旋转的效果之和。如下面所示:

             R=r1*r2*r3.其由三个方向的θ控制,故具有三个自由度。

       好了,刚体变换就讲完了。大家应该都了解,世界坐标系到摄像机坐标系之间的转换过程了吧。

              接下来,让我们看看摄像机坐标下的坐标如何投影到图像坐标系下,最终变为照片中的一个像素。这其中包含两个过程:一是从摄像机坐标到“空间图像坐标”(x,y)所发生的透视投影;二是从“连续图像坐标”到“离散图像坐标”(u,v)。后者我们已经在第一篇博文中解释过。所以在这里,主要介绍一下透视投影。

    透视投影(perspective projection): 用中心投影法将形体投射到投影面上,从而获得的一种较为接近视觉效果的单面投影图。有一点像皮影戏。它符合人们心理习惯,即离视点近的物体大,离视点远的物体小,不平行于成像平面的平行线会相交于消隐点(vanish point)。

             啰嗦这么多,其实大家看看示意图,看看公式,秒懂。

             以图中B(XB,YB)点为例,在小孔成像摄像机模型下(几何分析的最常用模型)。这里的f为摄像机的焦距,其属于摄像机的内参数(intrinsic parameter)。其在成像平面上的投影点b(xb,yb)的坐标利用简单的相似三角形比例关系很容易求出:

             上面两式也阐明了摄像机坐标与图像坐标之间的透视投影关系。

    好吧,现在玉米已经把图像坐标与世界坐标之间的这场对话所需经历的三个波折的过程加以了解释。即:刚体变换、透视投影、(x,y)换(u,v)(ps.这个在上一篇博文中讲过)。接下来玉米用一张图把三个过程连接起来。实现从世界坐标(X,Y,Z)到(u,v)之间的转换。让图像坐标与世界坐标直接对话。

             下图中的转换关系,都是用齐次坐标表达的,大家会发现这样的表达非常整洁。

             其实这张图显示的过程还有一个名字:摄像机模型(camera model)。其实也就是摄像机的几何模型了。

             将三者相乘,可以把这三个过程和在一起,写成一个矩阵:

             P就是世界坐标到图像坐标的直接联系人,P就表示了一个投影相机,有下面公式:

             注意在表示齐次坐标时,需要在符号上面加个小帽子。除去齐次坐标控制位P23P具有11个自由度

    20141102170636562

            摄像机模型及其中涉及的坐标系等,是弄清3D重建几何框架的基础。可以把它们视为基本运算关系。后面对于三维重建几何框架的推导,都是要用到三个基本坐标系和摄像机模型的。

             到这里玉米就顺利搭建起了图像坐标与世界坐标间的这场对话。如有纰漏还请大家担待,并指正!

    三、致敬“张正友标定”

             此处“张正友标定”又称“张氏标定”,是指张正友教授于1998年提出的单平面棋盘格的摄像机标定方法。张氏标定法已经作为工具箱或封装好的函数被广泛应用。张氏标定的原文为“A Flexible New Technique forCamera Calibration”。此文中所提到的方法,为相机标定提供了很大便利,并且具有很高的精度。从此标定可以不需要特殊的标定物,只需要一张打印出来的棋盘格。So great! 这样的方法让人肃然起敬。所以玉米的这篇博客的题目是:致敬“张氏标定”。

             当然,此博的内容也是围绕着“张氏标定”进行的,在这里,玉米主要介绍一下,“张氏标定”的数学思路。因为标定在整个基于标定摄像机的三维重建的几何过程占有最重要最核心的地位。如下图:

             从图中明显可以看出,标定得到的内参、外参和畸变系数,是双目视觉进行图片矫正,摄像机校正和3D恢复的基础。没有好的标定,双目视觉系统就无法完成3D重建。

            既然标定对双目视觉如此重要,我们有必要对数学的深层含义多加理解。以张氏标定为例,让我们挖开工具箱,看看其数学本质吧。因为张教授的论文中对标定方法的讲述是循序渐进的,所以玉米在这里将按照张教授论文中的顺序,为大家讲述一下,张氏标定的脉络。

    1、标定平面到图像平面的单应性

            因为张氏标定是一种基于平面棋盘格的标定,所以想要搞懂张氏标定,首先应该从两个平面的单应性(homography)映射开始着手。

            单应性(homography):在计算机视觉中被定义为一个平面到另一个平面的投影映射。首先看一下,图像平面与标定物棋盘格平面的单应性。

            由上两篇博文中讲到的摄像机模型,肯容易得到:

             其中m的齐次坐标表示图像平面的像素坐标(u,v,1),M的齐次坐标表示世界坐标系的坐标点(X,Y,Z,1)。A[R t]即是上面一篇博客推出的P。R表示旋转矩阵、t表示平移矩阵、S表示尺度因子。A表示摄像机的内参数,具体表达式如下:

    α=f/dx,β=f/dy,因为像素不是规规矩矩的正方形,γ代表像素点在x,y方向上尺度的偏差。

             这里还有一个“梗儿”,就是S。它只是为了方便运算,对于齐次坐标,尺度因子不会改变坐标值的。

    因为标定物是平面,所以我们可以把世界坐标系构造在Z=0的平面上。然后进行单应性计算。令Z=0可以将上式转换为如下形式:

             既然,此变化属于单应性变化。那么我们可以给A[r1 r2 t]一个名字:单应性矩阵。并记H= A[r1 r2 t]。

             那么现在就有:

             大家可以分析一下,H是一个三3*3的矩阵,并且有一个元素是作为齐次坐标。因此,H有8个未知量待解。

    (x,y)作为标定物的坐标,可以由设计者人为控制,是已知量。(u,v)是像素坐标,我们可以直接通过摄像机获得。对于一组对应的(x,y)-à(u,v)我们可以获得两组方程。

            现在有8个未知量需要求解,所以我们至少需要八个方程。所以需要四个对应点。四点即可算出,图像平面到世界平面的单应性矩阵H。

            这也是张氏标定采用四个角点的棋盘格作为标定物的一个原因。

            在这里,我们可以将单应性矩阵写成三个列向量的形式,即:

    2、利用约束条件求解内参矩阵A

            从上面可知,应用4个点我们可以获得单应性矩阵H。但是,H是内参阵和外参阵的合体。我们想要最终分别获得内参和外参。所以需要想个办法,先把内参求出来。然后外参也就随之解出了。我们可以仔细的“观摩”一下下面的式子。

           从中可以得出下面两个约束条件,这两个约束条件都是围绕着旋转向量来的。

           1、r1,r2正交 得:r1r2=0。这个很容易理解,因为r1,r2分别是绕x,y轴旋转的。应用高中立体几何中的两垂直平面上(两个旋转向量分别位于y-z和x-z平面)直线的垂直关系即可轻松推出。

            2、旋转向量的模为1,即|r1|=|r2|=1。这个也很容易理解,因为旋转不改变尺度嘛。如果不信可以回到上一篇博客,找到个方向的旋转矩阵化行列式算一下。

            通过上面的式子可以将r1,r2代换为h1,h2与A的组合进行表达。即       r1=h1A-1,r2=h2A-1.根据两约束条件,可以得到下面两个式子:

            大家从上面两个式子是不是看出一点端倪了。式子中,h1,h2是通过单应性求解出来的那么未知量就仅仅剩下,内参矩阵A了。内参阵A包含5个参数:α,β,u0,v0,γ。那么如果我们想完全解出这五个未知量,则需要3个单应性矩阵。3个单应性矩阵在2个约束下可以产生6个方程。这样可以解出全部的五个内参了。大家想一下,我们怎样才能获得三个不同的单应性矩阵呢?答案就是,用三幅标定物平面的照片。我们可以通过改变摄像机与标定板间的相对位置来获得三张不同的照片。(当然也可以用两张照片,但这样的话就要舍弃掉一个内参了γ=0)

           到这里,大家应该就明白我们在张氏标定法时为什么要不断变换标定板的方位了吧。当然这只是一个原因。第二个原因,玉米会在讲极大似然时讲到。

           下面在对我们得到的方程做一些数学上的变化,这些变化都是简单的运算变化了,相信大家动动笔,一算就可以算出。这些变化都是为了运算方便的,所以也没什么物理意义。

    首先令:

            很容易发现B是一个对称阵,所以B的有效元素只剩下六个(因为有三对对称的元素是相等的,所以只要解得下面的6个元素就可以得到完整的B了),让这六个元素构成向量b。

            接下来在做一步纯数学化简:

            可以计算得:

             利用约束条件可以得到下面,方程组:

              这个方程组的本质和前面那两个用h和A组成的约束条件方程组是一样的。在此重复一遍解释:如果我们想完全解出这五个未知量,则需要3个单应性矩阵。3个单应性矩阵在2个约束下可以产生6个方程。这样可以解出全部的五个内参了。大家想一下,我们怎样才能获得三个不同的单应性矩阵呢?答案就是,用三幅标定物平面的照片。我们可以通过改变摄像机与标定板间的相对位置来获得三张不同的照片。(当然也可以用两张照片,但这样的话就要舍弃掉一个内参了γ=0)

           通过至少含一个棋盘格的三幅图像,应用上述公式我们就可以估算出B了。得到B后,我们通过cholesky分解 ,就可以轻松地得到摄像机的内参阵A。

    3、基于内参阵估算外参阵

           通过上面的运算,我们已经获得了摄像机的内参阵。那么对于外参阵,我们很容易通过下面的公式解得:

           对上面公式进行化简,可以得到:

            至此,玉米已经将张氏标定的主体数学框架已经讲完了。介于篇幅关系(怕太长大机会读的昏昏欲睡,哈哈)。但其实我们做了这么多推导,仅仅是为后面的极大似然参数估计提供初值。但当然这个初值也是不可或缺的,因为没有这个初值,就无法估计出更为准确的参数。玉米将张氏标定中用于提高标定精度的极大似然算法,放到下一篇博客中进行讲解。

    还是老话:玉米才疏学浅,讲解之中难免有纰漏,请大家谅解,并指正。

    四、极大似然参数估计

    此篇博文,玉米将和大家分享一下“张氏标定”除几何推导外的另外一大精髓:参数估计。

             张教授在大作“A Flexible New Technique for Camera Calibration”中的原话如下:” The above solution is obtained through minimizing an algebraic distancewhich is not physically meaningful. We can refine it through maximum likelihoodinference”.意思是:上面的几何推导仅仅是纯代数上的拟合,没有物理意义。下面让我们通过极大似然理论对得到的结果进行改善。

           顺着张教授的意思,玉米先在这里为大家从概念上讲述一下极大似然估计。

    极大似然估计是一种估计总体未知参数的方法。它主要用于点估计问题。所谓点估计是指用一个估计量的观测来估计未知参数的真值。说穿了就一句话:就是在参数空间中选取使得样本取得观测值的概率最大的参数。

           我们定义似然函数:

           总体分布为离散型的:(p是已知的分布律)

            总体分布为连续性的:(f为概率密度函数)

            极大似然法就是在的可取范围内,挑选出来的使L达到最大的未知参数的估计值

             如果在内:,那么就称为极大似然估计值。

    列了这么一大圈儿概念,估计大家看的都昏昏入睡了。玉米在这里用通俗点儿的方式解释一下极大似然估计:

            对很多实验,我们可以观察到样本,但影响样本的参数却是未知的。那我们就得对样本进行估计。既然我们要去估计,那么就想要估计的准。极大似然法就只在概率分布的观念下,指导我们估计的更准的方法。现实世界中,存在着一条普遍规律:与现实相差越远的概率越小。这就相当于人群中,非主流总是比主流要少一样,偏差大的总是占少数。所以,可能发生的概率越大就会越接近真实值。极大似然法就是应用这种思想,认为可能性最大的就是最优的估计值。即极大似然估计值就是最接近真实值的参数值。

    那么,极大似然为什么有这么一个别致的名字呢?什么是似然呢?是因为估计值不是随机变量,所以不能把它的可能性称为概率,那么数学家们就想了这样(likelihood)一个名字来代表可能性。

           极大似然法的一些概念上的问题玉米就讲到这里了。下面然玉米带这大家分析一个具体问题:张教授在张氏标定法中所用的极大似然估计。

           首先来看一下,为什么标定的内外参数可以用极大似然法进行估计:

           因为我们是假定图像上的角点是被噪声干扰的,且我们认为这些噪声是高斯噪声。那么对于噪声的幅度就是给观测值造成的误差。但高斯噪声的概率密度我们是已知的,所以我们可以用前面所述的极大似然估计的思想去“猜”真值。

           那么接下来我们就需要构造一个似然函数,然后寻找其最大值了。张教授在文章中直接略过推导,直接给出了公式:

    说当此式取得最小值时,就是参数的最大似然估计值。

           玉米在这里为大家讲一下自己的理解:

           设,角点附近的噪声服从高斯分布

           则:角点mij的样本值服从如下,概率密度函数:

           现在构造,似然函数:

            现在让L取得最大值,则可令下式最小:

            那么怎么令上面这个目标函数达到最小值呢,张氏标定法运用了可以用来解决多参数非线性系统优化问题的Levenberg-Marquardt算法。对于该方法,详细的介绍大家可以参照《The levenberg-marquardt algorithm, implementation andtheory》一文进行深入了解。这里给出下载本文的链接:

    http://link.springer.com/chapter/10.1007%2FBFb0067700

             那么张氏标定法在不考虑镜头畸变的情况下的,获取摄像机内外参数的数理推导过程。玉米就为大家讲到这里了。下面一篇博文,玉米会给大家分析一下,张氏标定法是怎样分析摄像机的非线性畸变的。

    还是老话:玉米才疏学浅,讲解之中难免有纰漏,请大家谅解,并指正。

    六、张正友标定法小结

          这一博文,是玉米后补上的。因为觉得前面用了三篇博文来描述张氏标定法,略显散乱。在这里总结一下,使条理清晰一点。另外关于张氏标定所得参数也还有两点需要澄清。下面这个总结,其实也是在“A Flexible New Technique forCamera Calibration”中出现的。

    一、张氏标定的过程:

           1.      打印一张棋盘格,把它贴在一个平面上,作为标定物。

           2.      通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片。

           3.      从照片中提取特征点(如角点)。

           4.      估算理想无畸变的情况下,五个内参和所有外参。

           5.      应用最小二乘法估算。实际存在径向畸变下的畸变系数。

           6.      极大似然法,优化估计,提升估计精度。

             通过这样的过程,我们就获得了具有高估计精度的五个内参,三个外参和两个畸变系数。利用这些信息,我们可以进行畸变矫正、图像校正和最终的三维信息恢复。

    二、以下是对于张氏标定求得的内参,需要注意的一点:

             通过张氏标定,我们并不能得到:焦距(f)和像素的物理尺寸(sx,sy)两个参数。因为我们在求解内参阵A时,求解出的是α和β。

    α=f/ sx,β= f/ sy 。分别代表焦距长度上,x轴和y轴像素的个数。

            虽然,没有求得焦距,但这并不影响,我们在三维坐标恢复时,进行三角运算。因为彼时,我们的计算中用到的也是α和β。

           大家可能会有疑问,既然我们无法得到焦距(f)和像素的物理尺寸(sx,sy)两个参数。那么在opencv中,调用的cvCalibrateCamera2时返回的参数中是包含焦距(f)的。Opencv的这个函数也是用了张氏标定法。为什么可以得到f呢?

           答案是这条opencv函数对内参阵做了简化,其认为γ=0即像素的物理尺寸(sx,sy)两个参数相等。然后统一约掉物理尺寸s。得到的B阵如下:

           这样我们就可以解出f了。

           张氏标定的精确度可达到0.5个像素,这样的指标已经可以满足绝大多数的应用了。所以如此简单的方法,得到了这么高的精度。这样的方法是值得人们膜拜的。在此,在次向张正友教授致敬!

           在此,玉米又对张氏标定法进行了一个总结。张氏标定的原理分析就到此为止了。但是它的作用还会延续到下面两篇博文中。

           玉米才疏学浅,文中如有纰漏,请大家批评指正。

    七、立体标定与立体校正

            这篇博文中,让玉米和大家一起了解一下,张氏标定是怎样过渡到立体标定的?在这里主要以双目立体视觉进行分析。对于双目立体视觉,我们有两个摄像头。它们就像人的一双眼睛一样,从不同的方向看世界。两只眼睛中的图像的视差,让我们对世界有了三维的认识。

            那么,想要知道视差,首先应该知道双目视觉系统中两个摄像头之间的相对位置关系。我们可以通过同时对两个摄像头进行标定,分别得到二者相对同一坐标系的旋转矩阵和平移矩阵。获得这两个矩阵的过程,就是立体标定的过程。也即是:从张氏标定走向立体标定!

           两摄像头之间的旋转矩阵和平移矩阵可以由下式求出:

           其中,R为两摄像头间的旋转矩阵,T为两摄像头间的平移矩阵。Rr为右摄像头经过张氏标定得到的相对标定物的旋转矩阵,Tr为右摄像头通过张氏标定得到的相对标定物的平移向量。Rl为左摄像头经过张氏标定得到的相对相同标定物的旋转矩阵,Tl为左摄像头经过张氏标定得到的相对相同标定物的平移向量。

          两个式子是可以通过数学代换推导来的。但玉米觉得对这样有明显物理意义并且空间过程简单的计算式。物理上的空间想象,比纯代数代换,要生动的多。并且有利于大家揣摩整个物理过程。

          在玉米眼里,这两个式子是这样的:

          对于R,首先用T把左摄像机坐标系平移到右摄像机坐标系上(即两坐标系远点重合)。然后在同一参考系下的两个旋转矩阵相乘,表示世界坐标先向右旋转到Rr ,再向左旋转Rl。那么两次旋转后得到的旋转,就是有摄像机旋转到左摄像机所需的旋转矩阵R。

          对于T,那就更容易理解了,先用R对左坐标系旋转一下,把左右两摄像机调成平行,然后直接平移向量相减,即得到。两摄像机之间的平移向量T。

          上面求得的R和T就是立体标定得到的参数了。

          那么运用的立体标定所得的参数了,下一步我们该做什么呢?答案是:立体校正。

          在介绍立体校正的具体方法之前,让我们来看一下,为什么要进行立体校正?

          因为当两个图像平面是完全共面行对准时,计算立体视差是最简单的。但是,在现实的双目立体视觉系统中,是不存在完全的共面行对准的两个摄像机图像平面的。所以我们要进行立体校正。立体校正的目的就是,把实际中非共面行对准的两幅图像,校正成共面行对准。如下面示意图所示。(共面行对准是指:两摄像机图像平面在同一平面上,且同一点投影到两个摄像机图像平面时,应该在两个像素坐标系的同一行)

    有了上述铺垫,下面让玉米给大家陈述一下基于立体标定所获参数的立体校正的数学原理,或者说是几何原理。但玉米在这里,主要和大家分享一下,如此校正的物理意义。

             立体校正应该分两步走:

             1、 将两个图像平面拉回同一平面。

             这一步,该怎么做呢?玉米相信,经过这么多铺垫,大家应该早就心里有数了。这一步很简单。可以这样:两个平面在方向上            之间不是相差一个旋转矩阵R吗,那么我们让两个相机个旋转一半,但需注意二者的旋转,应该是反向的。如下式所示:

             上面的这个公式是玉米根据物理意义自己总结的。r、r分别代表左摄像机和右摄像机为达到共面所需的旋转矩阵。rl、rr程度             相同,但旋转方向相反。左右相机分别经历了这样的旋转之后,二者就已经共面了。大家应该明白了吧?

              2、 旋转图像使得同行对准

             玉米在这里先为大家展示一个,校正成功的图吧。

                      大家可以像小学时候写看图说话作文一样,观察一下图中校正前和校正后左右两摄像机的图像到底发生了什么本质的变                化。

                      玉米的答案是:左右两图分别绕光轴作了旋转,旋转过后两摄像机的主点连线平行像素坐标的行线。

                      玉米的答案也是自己对行对准的理解,比较通俗。这与很多书上用极几何术语描述的有些不同,大家可以思考一下,玉米           说的有没有道理。

                       好,既然已经明确了,要达到行对准,图像所需发生的变化。那么就让我们用数学表达式来表达它们吧。

              玉米画了一个简单的示意图,画的丑大家不要见笑。

              红色的线表示的是校正后的行线,其是左右对准的。大家可以看到,从原图像的行线转到校正后图像的行线,左图像转动了α,右图像转动了θ。那么怎样来确定两个旋转角度呢?

               大家可以回忆一下,我们在本系列博文中的第二篇中讲述刚体变换时,把旋转矩阵按不同轴分解的方法。可以看做是沿光轴旋转,旋转目的是与主点连线平行。先以左图像为例:

              那么我们设旋转矩阵为Rh , 

              则Rh可以表示为以归一化T(平移向量):e1为旋转的指针,则随之e2为e1与光轴的叉积,e3为e2与e1的叉积:

              大家可以进一步算一下:

              我们发现,其实行对准就是绕e3方向,转了α。同样的,对右图就是转了θ。

              通过上面的推导,我们就把立体标定与立体校正中的数学思想理清楚了。其实,立体匹配是有很多种方法的,玉米在里只是介绍了立体校正的基本原理。其他方法中,有一些可以不依赖标定参数,如果大家想要对立体校正进行深入研究,大家可以搜索一些经典论文进行深入学习。如:A. Fusiello, E. Trucco, and A. Verri.写的 Acompact algorithm for rectification of stereo pairs.等等

             截止目前对于三维重建的所有准备工作,都已完成。几何框架也仅剩下最后一步:立体成像。(因为本系列博文只介绍双目视觉的几何架构,所以跳过匹配不谈)玉米在下一篇博文中将与大家分享一下,几何脉络的最终果实:立体成像。这也是我们对于双目视觉几何框架推导和理解的最终目标。

             玉米才疏学浅,文中如有纰漏,请大家批评指正!

    八、走向三维

            我们前面花了七篇博文做铺垫,我们所做的一切努力都是为了最后的这一击——立体成像。因为玉米的这个系列文章是对双目视觉几何框架的总结。此处跳过匹配,假设左右图像点的完美匹配的。只看在几何上,三维坐标是如何被还原的。相对来说,最后的这一步,比前面是要轻松许多的,因为我们前面已经做了大量的工作。这些工作使得最后的这一步,由不可能称为可能,由复杂变得简单,吧啦吧啦。好吧,闲话少说,让我们一起来见证这一时刻吧。

            此处我们按opencv中cvcalibratecamera2()函数得到的焦距f进行三维坐标的求解。

            请大家看下面示意图(莫怪,玉米的图一向画的丑):

            根据最简单的相似三角形关系,我们就可以求出,物点坐标(X,Y,Z)。

            首先,

             其中,s为像素的物理尺寸,d就是两个摄像机间的视差,d=(uL-uR)s。

            我们得到的这个三维坐标,相当于是在右摄像机的摄像机坐标系上的。

           那么重建就是透视投影的逆过程,我们可以把这个过程表示成矩阵形式。我们定义Q为反投影矩阵。那么依照上式:

            齐次坐标形式的三维坐标恢复,矩阵形式如下:

            至此,玉米的《计算机视觉学习笔记》双目视觉几何框架系列文章顺利收尾。希望这八篇博文对大家,尤其是计算机视觉的初学者有所帮助。

            在行文过程中,玉米引用了网络上的一些图片,但大多找不到出处,所以未给出引用表。如这些图片的主人,发现了自己的图片在这个博客上,请和玉米联系,玉米会将引用出处,重新给出!

           本系列博文中涉及的数学运算颇多,玉米才疏学浅,中间若有理解上的错误,恳请大家批评指正!

     原创地址:http://blog.csdn.net/onthewaysuccess/article/details/40709745

    展开全文
  • 基于运动恢复的双目视觉三维重建系统设计与实现(一) 这是王欣 , 袁 坤 , 于晓 , 章明朝等人在2014年发表的一篇文章 , 我想实现用c++与opencv实现它 , 这篇文章可以在知网上下载<基于运动恢复的双目视觉三维重建...
  • 采用matlab和Vc混合编程实现了双目视觉三维重建
  • 原文:http://blog.csdn.NET/chenyusiyuan/article/details/5970799在获取到视差数据后,利用OpenCV的 reProjectImageTo3D 函数结合 Bouquet 校正方法得到的 Q 矩阵就可以得到环境的三维坐标数据,然后利用OpenGL 来...
  • 一、重投影残差 1.1基本概念 重投影残差,按照字面...假设P是世界坐标系中的一个三维点(真实物点),第一次投影指的就是双目相机C1、C2拍摄时,P点投影到二维像平面上所捕获到的图像点,即图中的P1和P2点;然后利...
  • 双目相机拍照 设备一个双目摄像头 使用双目摄像头拍照 #include <iostream> #include <chrono> #include<string> #include<sstream> #include<stdio.h> #include "opencv2/core/...
  • 文件名称: code下载 收藏√ [5 4 3 2 1]开发工具: Visual C++文件大小: 7733 KB上传时间: 2015-12-29下载次数: 0提 供 者: 赵凡详细说明:三维重建源码,由双目立体视觉进行三位重建。并给出了几种重建方法的介绍,...
  • 32S 十二位有符号整型 (int) 0–65535 5 CV_32F 十二位浮点数 (float) 0.0–1.0 6 CV_64F 六十四位浮点数 (double) 0.0–1.0 convertTo函数 xxx.convertTo(dst, type, scale, shift) dst:目的矩阵; type:需要...
  • 双目视觉三维重建

    2018-06-11 21:13:55
    双目视觉三维重建 双目视觉三维重建 双目视觉三维重建
  • 0.绪论这篇文章主要为了研究双目立体视觉的最终目标——三维重建,系统的介绍了三维重建的整体步骤。双目立体视觉的整体流程包括:图像获取,摄像机标定,特征提取(稠密匹配中这一步可以省略),立体匹配,三维重建。...
  • 双目立体视觉三维重建

    万次阅读 多人点赞 2018-07-22 17:15:08
    OpenCV+OpenGL 双目立体视觉三维重建 OpenCV 双目测距(双目标定、双目校正和立体匹配) 真实场景的双目立体匹配(Stereo Matching)获取深度图详解 图像获取 双目相机拍摄获取 左右目图像 双目标定 ...
  • OpenCV+OpenGL 双目立体视觉三维重建

    万次阅读 多人点赞 2016-08-08 00:02:47
    0.绪论这篇文章主要为了研究双目立体视觉的最终目标——三维重建,系统的介绍了三维重建的整体步骤。双目立体视觉的整体流程包括:图像获取,摄像机标定,特征提取(稠密匹配中这一步可以省略),立体匹配,三维重建...
  • 转载 双目视觉三维重建 作者tiemaxiaosu http://blog.csdn.net/tiemaxiaosu/article/details/51734667 一、三维重建概述  三维重建主要是研究如何从得到的匹配点中计算出相机的投影矩阵(如果是外部标定的话,...
  • 基于双目视觉三维重建 基于双目视觉三维重建
  • 基于双目视觉的深度计算和三维重建双目视觉opencv opengl三维重建,简单的三维重建系统,代码可正常运行
  • 双目立体视觉测量系统是工业测量中的重要手段,三维重建是双目立体视觉测量体统中非常重要的一环。基于视差原理的传统三维...结果表明该方法可达到传统视觉三维重建方法的测量精度,并可有效判断匹配点是否为误匹配点。
  • 双目视觉opencv opengl三维重建双目视觉opencv opengl三维重建双目视觉opencv opengl三维重建,请修改代码中opencv对应版本号

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 374
精华内容 149
关键字:

双目视觉三维重建