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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 更改pip源至国内镜像,显著提升下载速度

    更改pip源至国内镜像,显著提升下载速度经常在使用python的时候需要安装各种模块,而pip是很强大的模块安装工具,但是由于国外官方pypi经常被墙,导致不可用,所以我们最好是将自己使用的pip源更换一下,这样就能解决被墙导致的装不上库的烦恼。网上有很多可用的源,例如豆瓣:http://pypi.douban.com/simple/                     清华

    2022年6月4日
    54
  • mysql中联合索引abc 使用bac_mysql 联合索引

    mysql中联合索引abc 使用bac_mysql 联合索引mysql联合索引详解联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是keyindex(a,b,c).可以支持a|a,b|a,b,c3种组合进行查找,但不支持b,c进行查找.当最左侧字段是常量引用时,索引就十分有效。两个或更多个列上的索引被称作复合索引。利用索引中的附加列,您可以缩小搜索的…

    2022年5月24日
    62
  • verycd下载办法_无损音乐 MKV 下载

    verycd下载办法_无损音乐 MKV 下载自2012年8月30日之后,verycd上所有资源的ed2k下载链接均被隐藏。没有登录的会员会显示“该资源为版权方声明保护内容,VeryCD不提供其下载”的字样现在电驴也不让下载了,和以前的狗狗一样,资源都屏蔽了,今天无意得到了一个可以下载电驴上的资源的方法,很简单,应该是漏洞,不知道能用多久,但是目前至少可以用。自2012年8月30日之后,verycd上所有资源的ed2k下载链接均被隐藏。没有登

    2022年8月10日
    6
  • java四舍五入取整算法(小数四舍五入取整公式)

    简介Math类中提供了5个与取整相关的函数,如下所示:staticdoubleceil(doublea):天花板函数,返回大于等于a的最小整数(但是以浮点数形式存储)。staticdoublefloor(doublea):地板函数,返回小于等于a的最大整数(但是以浮点数形式存储)。staticdoublerint(doublea):四舍五入函数,返

    2022年4月16日
    381
  • 解决Oracle数据库1521端口telnet不通问题

    解决Oracle数据库1521端口telnet不通问题现象:服务器的ip地址可以ping通,但是安装oracle过程中的指定的“1521”端口telnet不通过解决办法:1、确保防火墙对1521端口开启; 2、修改oracle安装之后的文件tnsnames.ora(F:\install\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora)中“HOST”的值为”计算机全名“(桌面属性\高级

    2022年5月27日
    552
  • mysql error 1227 42000_mysql导入报错

    mysql error 1227 42000_mysql导入报错今天在学习mysql的时候,一顿蜜汁操作,再次使用mysql的时候发现,不管用啥子命令,都出现了一个报错mysql>selectuser,passwordfrommysql.user;ERROR1142(42000):SELECTcommanddeniedtouser‘root’@‘localhost’fortable‘user’看了一下报错信息,权限不够…

    2022年10月1日
    3

发表回复

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

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