当前位置: 首页 > news >正文

python计算机视觉——第四章 照相机模型与增强现实

4.1 针孔照相机模型

        针孔照相机模型(有时称为射影照相机模型)是计算机视觉中广泛使用的照相机模型。对于大多数应用来说,针孔照相机模型简单,并且具有足够的精确度。这个名字来源于一种类似暗箱机的照相机。该照相机从一个小孔采集射到暗箱内部的光线。在针孔照相机模型中,在光线投影到图像平面之前,从唯一一个点经过,也就是照相机中心C。

         由图像坐标轴和三维坐标系中的x 轴和y 轴对齐平行的假设,我们可以得出针孔照相机的投影性质。照相机的光学坐标轴和z 轴一致,该投影几何可以简化成相似三角形。在投影之前通过旋转和平移变换,对该坐标系加入三维点,会出现完整的投影变换。

        在针孔照相机中,三维点X 投影为图像点x(两个点都是用齐次坐标表示的),如下所示:

\(\lambda\mathbf{x}=P\mathbf{X}\)

        这里,3×4 的矩阵P 为照相机矩阵(或投影矩阵)。注意,在齐次坐标系中,三维点X 的坐标由4 个元素组成,X=[X, Y, Z, W]。这里的标量λ 是三维点的逆深度。如果我们打算在齐次坐标中将最后一个数值归一化为1,那么就会使用到它。 

4.1.1 照相机矩阵

照相机矩阵可以分解为:

\(P=K[R|t]\)

        其中,R 是描述照相机方向的旋转矩阵,t 是描述照相机中心位置的三维平移向量,内标定矩阵K 描述照相机的投影性质。 

        标定矩阵仅和照相机自身的情况相关,通常情况下可以写成:

\(K=\begin{bmatrix}\alpha f&s&c_x\\0&f&c_y\\0&0&1\end{bmatrix}\)

        图像平面和照相机中心间的距离为焦距f。当像素数组在传感器上偏斜的时候,需要用到倾斜参数s。在大多数情况下,s 可以设置成0。也就是说: 

\(K=\begin{bmatrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\end{bmatrix}\)

        这里,我们使用了另外的记号\(f_x\)和\(f_y\),两者关系为\(f_{x}=af_{y}\)。

        纵横比例参数α 是在像素元素非正方形的情况下使用的。通常情况下,我们可以默认设置α=1。经过这些假设,标定矩阵变为: 

\(K=\begin{bmatrix}f&0&c_x\\0&f&c_y\\0&0&1\end{bmatrix}\)

        除焦距之外,标定矩阵中剩余的唯一参数为光心(有时称主点)的坐标c=[cx,cy],也就是光线坐标轴和图像平面的交点。因为光心通常在图像的中心,并且图像的坐标是从左上角开始计算的,所以光心的坐标常接近于图像宽度和高度的一半。特别强调一点,在这个例子中,唯一未知的变量是焦距f。 

4.1.2 三维点的投影

 下面来创建照相机类,用来处理我们对照相机和投影建模所需要的全部操作:

from scipy import linalg
from pylab import  *class Camera(object):""" 表示针孔照相机的类"""def __init__(self,P):""" 初始化 P = K[R|t] 照相机模型"""self.P = Pself.K = None # 标定矩阵self.R = None # 旋转self.t = None # 平移self.c = None # 照相机中心def project(self,X):""" X(4×n 的数组)的投影点,并且进行坐标归一化 """x = dot(self.P,X)for i in range(3):x[i] /= x[2]return x

        在这个例子中,我们将使用牛津多视图数据集中的“Model Housing”数据集,可以从http://www.robots.ox.ac.uk/~vgg/data/data-mview.html 下载。 

4.1.3 照相机矩阵的分解 

        如果给定如方程(4.1.1)所示的照相机矩阵P,我们需要恢复内参数K 以及照相机的位置t 和姿势R。矩阵分块操作称为因子分解。这里,我们将使用一种矩阵因子分解的方法,称为RQ 因子分解。 

        将下面的方法添加到Camera 类中:

def factor(self):""" 将照相机矩阵分解为K、R、t,其中,P = K[R|t] """# 分解前3×3 的部分K,R = linalg.rq(self.P[:,:3])# 将K 的对角线元素设为正值T = diag(sign(diag(K)))if linalg.det(T) < 0:T[1,1] *= -1self.K = dot(K,T)self.R = dot(T,R) # T 的逆矩阵为其自身self.t = dot(linalg.inv(self.K),self.P[:,3])return self.K, self.R, self.t

        RQ 因子分解的结果并不是唯一的。在该因子分解中,分解的结果存在符号二义性。由于我们需要限制旋转矩阵R 为正定的(否则,旋转坐标轴即可),所以可以在求解到的结果中加入变换T 来改变符号。

        观察照相机矩阵分解的效果:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • OpenCV绘图函数(8)填充凸多边形函数fillConvexPoly()的使用
  • 基于 Householder 变换的 qr 分解 算法与源码实现
  • sdk监控平台
  • 14.JS学习篇-CSR和SSR
  • golang并发编程——概述
  • sql中exist和in的区别
  • 240828-Gradio结合Html+Css+Javascript制作年历
  • Open3D编译安装
  • 同人小游戏之斗罗大陆3
  • 【STM32】IIC
  • es集群详解
  • IDEA导入第三方jar包, 并在Maven中打包该jar包
  • 医疗数字化转型数据中台架构方案(一)
  • vim 简易配置
  • 【视频讲解】SMOTEBoost、RBBoost和RUSBoost不平衡数据集的集成分类酵母数据集、治癌候选药物|数据分享...
  • 时间复杂度分析经典问题——最大子序列和
  • flask接收请求并推入栈
  • Leetcode 27 Remove Element
  • Mac转Windows的拯救指南
  • PHP变量
  • TypeScript迭代器
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 动态魔术使用DBMS_SQL
  • 记录一下第一次使用npm
  • 力扣(LeetCode)56
  • 马上搞懂 GeoJSON
  • 每天10道Java面试题,跟我走,offer有!
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 深度学习中的信息论知识详解
  • 数据仓库的几种建模方法
  • 王永庆:技术创新改变教育未来
  • 仓管云——企业云erp功能有哪些?
  • 交换综合实验一
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​Python 3 新特性:类型注解
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #Linux(权限管理)
  • #单片机(TB6600驱动42步进电机)
  • (1)虚拟机的安装与使用,linux系统安装
  • (23)Linux的软硬连接
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)springcloud实战之config配置中心
  • (回溯) LeetCode 46. 全排列
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (转)h264中avc和flv数据的解析
  • **python多态
  • .Net core 6.0 升8.0
  • .NET Core 版本不支持的问题
  • .net framework 4.8 开发windows系统服务
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET 快速重构概要1
  • .NET使用存储过程实现对数据库的增删改查