OpenCV实现SfM(一):相机模型

OpenCV实现SfM(一):相机模型相机的标定SfM介绍SfM的全称为StructurefromMotion,即通过相机的移动来确定目标的空间和几何关系,是三维重建的一种常见方法。

大家好,又见面了,我是你们的朋友全栈君。

注意:本文中的代码必须使用OpenCV3.0或以上版本进行编译,因为很多函数是3.0以后才加入的。

目录:

文章目录

#SfM介绍

SfM的全称为Structure from Motion,即通过相机的移动来确定目标的空间和几何关系,是三维重建的一种常见方法。它与Kinect这种3D摄像头最大的不同在于,它只需要普通的RGB摄像头即可,因此成本更低廉,且受环境约束较小,在室内和室外均能使用。但是,SfM背后需要复杂的理论和算法做支持,在精度和速度上都还有待提高,所以目前成熟的商业应用并不多。

本系列介绍SfM中的基本原理与算法,借助OpenCV实现一个简易的SfM系统。

#小孔相机模型
在计算机视觉中,最常用的相机模型就是小孔模型(小孔成像模型),它将相机的透镜组简化为一个小孔,光线透过小孔在小孔后方的像面上成像,如下图所示。
这里写图片描述
由上图可知,小孔模型成的是倒像,为了表述与研究的方便,我们常常将像面至于小孔之前,且到小孔的距离仍然是焦距f,这样的模型与原来的小孔模型是等价的,只不过成的是正像,符合人的直观感受。在这种情况下,往往将小孔称作光心(Optical Center)。
这里写图片描述
小孔模型是一种理想相机模型,没有考虑实际相机中存在的场曲、畸变等问题。在实际使用时,这些问题可以通过在标定的过程中引入畸变参数解决,所以小孔模型仍然是目前最广泛使用的相机模型。

#坐标系
为了用数学研究SfM,我们需要坐标系。在SfM中主要有两类坐标系,一类为相机坐标系,一类为世界坐标系。在本系列中,所以坐标系均为右手坐标系。
相机坐标系以相机的光心(小孔)作为原点,X轴为水平方向,Y轴为竖直方向,Z轴指向相机所观察的方向。
世界坐标系的原点可以任意选择,与相机的具体位置无关。
相机坐标系与世界坐标系的关系

#内参矩阵
设空间中有一点P,若世界坐标系与相机坐标系重合,则该点在空间中的坐标为(X, Y, Z),其中Z为该点到相机光心的垂直距离。设该点在像面上的像为点p,像素坐标为(x, y),那么(X, Y, Z)和(x, y)有什么关系呢?
这里写图片描述
由上图可知,这是一个简单的相似三角形关系,从而得到
x = f X Z ,     y = f Y Z x = \frac{fX}{Z},\ \ \ y = \frac{fY}{Z} x=ZfX,   y=ZfY
但是,图像的像素坐标系原点在左上角,而上面公式假定原点在图像中心,为了处理这一偏移,设光心在图像上对应的像素坐标为 ( c x , c y ) (c_x, c_y) (cx,cy),则
x = f X Z + c x ,     y = f Y Z + c y x = \frac{fX}{Z} + c_x,\ \ \ y =\frac{fY}{Z} + c_y x=ZfX+cx,   y=ZfY+cy
将以上关系表示为矩阵形式,有
Z [ x y 1 ] = [ f 0 c x 0 f c y 0 0 1 ] [ X Y Z ] Z\left[\begin{matrix} x\\y\\1 \end{matrix}\right] = \left[\begin{matrix} f & 0 & c_x \\ 0 & f & c_y \\ 0 & 0 & 1\end{matrix} \right]\left[\begin{matrix} X\\Y\\Z \end{matrix} \right] Zxy1=f000f0cxcy1XYZ
其中,将矩阵
K = [ f 0 c x 0 f c y 0 0 1 ] K = \left[\begin{matrix} f & 0 & c_x \\ 0 & f & c_y \\ 0 & 0 & 1\end{matrix} \right] K=f000f0cxcy1
称为内参矩阵,因为它只和相机自身的内部参数有关(焦距,光心位置)。

#外参矩阵

一般情况下,世界坐标系和相机坐标系不重合,这时,世界坐标系中的某一点P要投影到像面上时,先要将该点的坐标转换到相机坐标系下。设P在世界坐标系中的坐标为X,P到光心的垂直距离为s(即上文中的Z),在像面上的坐标为x,世界坐标系与相机坐标系之间的相对旋转为矩阵R(R是一个三行三列的旋转矩阵),相对位移为向量T(三行一列),则
s x = K [ R X + T ] sx = K[RX + T] sx=K[RX+T]
其中 R X + T RX + T RX+T 即为P在相机坐标系下的坐标,使用齐次坐标改写上式,有
s x = K [ R T ] [ X 1 ] sx = K\left[\begin{matrix}R & T\end{matrix}\right]\left[\begin{matrix}X\\1\end{matrix}\right] sx=K[RT][X1]
其中 [ R T ] \left[\begin{matrix}R & T\end{matrix}\right] [RT]是一个三行四列的矩阵,称为外参矩阵,它和相机的参数无关,只与相机在世界坐标系中的位置有关。
这里写图片描述

#相机的标定
相机的标定,即为通过某个已知的目标,求取相机内参矩阵的过程。最常用的标定目标就是棋盘格。用相机对棋盘格从不同角度拍摄多张照片,然后将这些照片导入标定程序或算法,即可自动求出相机的内参。
相机标定的方法和工具,我在这篇文章中已有详细的介绍,这里就不再细述了。在此提醒一下,之后的文章中若无特殊说明,所有相机均假定内参已知。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151291.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea 2021.3.4激活码(JetBrains全家桶)[通俗易懂]

    (idea 2021.3.4激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月27日
    421
  • vue调用js文件_vue调用其他js文件中的方法

    vue调用js文件_vue调用其他js文件中的方法本文主要介绍了vue引用js文件的多种方式,本文大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 1、vue-cliwebpack全局引入jquery(1)首先npminstalljquery–save(–save的意思是将模块安装到项目目录下,并在package文件的dependencies节点写入依赖。)(2)在webpack.base.conf.js里加入varwebpack=require(“webpack”)(3)在module

    2022年10月8日
    0
  • photoshop是目前图像处理理最顶级的一款软件_图片处理软件app

    photoshop是目前图像处理理最顶级的一款软件_图片处理软件app说到照片和图像编辑/操纵,真的没有更好的应用,AdobePS图象处理软件。 摄影师和创意工作室会同意这是总理的照片编辑应用期。不幸的是,PS图象处理软件还配备了一个陡峭的学习曲线和价格标签,我们必须考虑我们不会使用矫枉过正的1/3的功能包装成PS图象处理软件。 记住让我们看一些免费的在线和客户端安装的应用程序可以在互联网上看。 选项是巨大的所以我缩小了我的审查,只有最好的在线和客户端安装

    2022年4月20日
    56
  • 华为模拟器ensp命令_vmware命令大全

    华为模拟器ensp命令_vmware命令大全命令符从用户视图切换到系统视图system–view从系统视图切换到用户视图quit连入接口命令interfaceIP地址、子网掩码配置命令ipaddress接口IP信息查看命令displayipinterfacebriefIPv4路由表信息查询命令displayiprouting–table配置完成退回视图界面命令return命令自动补全快捷键【Tab】…

    2025年6月27日
    0
  • java最长递增子序列_求数组中最长递增子序列「建议收藏」

    java最长递增子序列_求数组中最长递增子序列「建议收藏」什么是最长递增子序列呢?问题描述如下:设L=是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=,其中k1对于这个问题有以下几种解决思路:1、把a1,a2,…,an排序,假设得到a’1,a’2,…,a’n,然后求a的a’的最长公共子串,这样总的时间复杂度为o(nlg(n))+o(n^2)=o(n^2);2、动态规划的思路:另设一辅助数组b,定义b[n]表示以a[n]结尾的最长递增…

    2022年4月30日
    53
  • Java开发手册之其它规范[通俗易懂]

    Java开发手册之其它规范[通俗易懂]Java开发手册之其它规范

    2022年4月22日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号