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


相关推荐

  • 宝塔服务器管理助手Linux面版-使用教程

    宝塔服务器管理助手Linux面版-使用教程

    2021年9月22日
    46
  • 考勤管理系统需求分析说明书

    考勤管理系统需求分析说明书目录一 引言 1 1 编写目的 1 2 背景 1 3 编写对象 1 4 参考资料二 任务概述 2 1 任务目标 2 2 运行环境 2 3 条件限制三 功能需求 3 1 功能描述 3 2 静态数据 3 3 动态数据 3 4 数据字典四 需求规定 4 1 运行需求 4 2 非性能需求附录任务分工一 引言 1 1 编写目的通过该系统考核学生

    2025年9月21日
    3
  • 操作系统中的同步和异步

    操作系统中的同步和异步操作系统中同步、异步性概念首先我们从操作系统的发展中学习什么是异步性。在操作系统发展的初期阶段,CPU处理的是作业,而且是单道批处理。什么意思呢?就是一个作业从提交到结束,程序员都不能干预,此时整台计算机就为这一个作业服务(可想有多少资源被”浪费”),这样有一点好处就是整个程序是”封闭的”。这样的操作表明人和机器是没有交互的。那我们怎么实现人机交互呢?这个答案是中断。中断的引入,使得工作人员能…

    2025年7月5日
    2
  • centos7如何关闭linux防火墙(centos关闭防火墙)

    在某些场景中我们会希望能够关闭防火墙,比如ftp连不上,又不想在iptable中添加端口配置,那么我直接就把防火墙给关了。下面是學習啦小編收集整理的centos如何关闭防火墙,希望對大家有幫助~~centos关闭防火墙工具/原料操作系统:centos6.5方法/步骤查看防火墙状态:命令:/etc/init.d/iptablesstatus如果是开着显示内容类是截图临时关闭防火墙:命令:…

    2022年4月11日
    112
  • null toarray php,解决Laravel5.5下的toArray问题

    null toarray php,解决Laravel5.5下的toArray问题作为一个有轻度强迫症且受ThinkPHP影响较深的PHP码农,总觉得Laravel5.5的DB::xxoo->get()->toArray()之后竟然还没得到我想要的ThinkPHP中的select()出来的数组,于是决定做一下修改。PS:出于尽量不影响原有框架的考虑,我是新建了一个方法叫getList来暂代toArray那不知所谓的返回结果,在没有找到更好的解决办法之前,暂时这么用着…

    2022年5月14日
    2.3K
  • UART和USART 有区别

    UART和USART 有区别UART:universalasynchronousreceiverandtransmitter通用异步收发器          [BusSignal]  TX ,RX USART:universalsynchronousasynchronousreceiverandtransmitter通用同步异步收发器          [BusSi

    2022年5月19日
    31

发表回复

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

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