一、针孔照相机模型

针孔照相机模型(有时称为射影照相机模型)是计算机视觉中广泛使用的照相机模型。对于大多数应用来说,针孔照相机模型简单,并且具有足够的精确度。这个名字源于一种类似暗箱机的照相机,该照相机从一个小孔采集射到暗箱内部的光线,如图所示。

比较基础简单的投影变换有正交变换和透视变换。正交变换就是物体上的点全都平行地投射到投影面,没有远近的区别,即没有透视效果。 透视变换正好相反,被投影物体处于一个四棱台区域中,物体被投影到离相机较近的平面上。相机被抽象为一个点,而投影点是物体上的点和相机的连线与投影平面的交点。由于投影的路径不再相互平行,因此会产生透视效果。

1、照相机矩阵

照相机矩阵可分解为:P=K[R∣t],其中R是描述照相机方向的旋转矩阵,t是描述照相机中心位置的三维平移向量,内标定矩阵K描述照相机的投影性质。

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

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

2、三维点的投影

首先创建照相机类,用来处理对照相机和投影建模所需要的全部操作代码:

from scipy import linalgclass 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#该函数是一种矩阵因子分解方法,称为RQ因子分解。其结果不是唯一的,结果存在符号二义性。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#计算照相机的中心def center(self):"""计算并返回照相机的中心"""if self.c is not None:return self.celse:#通过因子分解计算cself.factor()self.c = -dot(self.R.T,self.t)return self.c

3、照相机矩阵的分解

针孔相机模型是基于透视变换的相机模型。公式为:

简化公式为:s ⋅ m ′ = A ⋅ [ R ∣ t ] ⋅ M ′
其中m ′ 为屏幕uv坐标,A为相机内参,[ R ∣ t ] 为相机外参,M ′ 为物体世界坐标,而s为物体在相机坐标系中的z坐标,这是公式推导过程中产生的参数。这里提到的相机内参是指仅由相机本身决定的参数,也就是对某一相机一旦这个值算好就不用再次进行计算。相对的,外参是和世界坐标系和相机位置有关的。
照相机模型是属于计算机3D视觉中的,而所谓3D视觉就是要建立二维图像和三维场景的联系,比较主要的一个用途是根据二维图片重建三维场景。所以一个自然的想法就是通过各种方式使得可以从三维坐标计算得到屏幕空间坐标或者相反。

二、照相机标定

简单来说就是从世界坐标系换到图像坐标系的过程,也就是求最终的投影矩阵P的过程。

原理:一般来说,标定的过程分为两个部分

1、从世界坐标系转换为相机坐标系,这一步是三维点到三维点的转换,包括 R ,t (相机外参)等参数。

2、从相机坐标系转为图像坐标系,这一步是三维点到二维点的转换,包括 K(相机内参)等参数。

步骤:

  1. 打印一张棋盘格,把它贴在一个平面上,作为标定物。
  2. 通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片。
  3. 从照片中提取棋盘格角点。
  4. 估算理想无畸变的情况下,五个内参和六个外参。
  5. 应用最小二乘法估算实际存在径向畸变下的畸变系数。
  6. 极大似然估计法,优化估计,提升估计精度。

三、增强现实(AR)

增强现实是将物体和相应信息放置在图像数据上的一系列操作的总称。需要用到两个工具包,分别是:PyGame和PyOpenGL。

1、PyGame和PyOpenGL

pygame可直接使用pip install命令安装,pip install PyGame 。

但PyOpenGL默认安装32位,我们要手动下载64位下载地址然后在下载位置使用pip install (文件名.whl)进行安装。pip install PyOpenGL-3.1.3b2-cp37-cp37m-win_amd64.whl 进行下载,这个根据自己的情况来进行调整。我所使用的电脑是win10,64位,使用的版本是Python3.7。
为了使用上面两个工具包,需要在脚本的开始部分载入下面的命令:

from OpenGL.GL import *
from OpenGL.GLU import *
import pygame, pygame.image
from pygame.locals import *

2、从照相机矩阵到OpenGL格式

openGL使用4×4的矩阵来表示变换。但是照相机与场景的变换分成了两个矩阵,GL_PROJECTION矩阵和GL_MODELVIEW矩阵。GL_PROJECTION矩阵处理图像成像的性质,等价于我们的内标定矩阵K 。GL_MODELVIEW矩阵处理物体和照相机之间的三维变换关系,对应于我们照相机矩阵中的R 和t 部分。

3、在图像中放置虚拟物体
在OpenGL中,该操作可以通过创建一个四边形的方式来完成,该四边形为整个视图。完成该操作最简单的方式是绘制出四边形,同时将投影和模拟视图矩阵重置,使得每一维的坐标范围在-1到1之间。

注:最近几天不知道电脑还是网页怎么回事,CSDN的公式编辑用不了,没法自己编辑公式了。只能用截图的方式,望谅解。

第四章 照相机模型与增强现实相关推荐

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

    文章目录 引言 4.1 针孔照相机模型 4.1.1 投影矩阵 4.1.2 三维点的投影 4.1.3 照相机矩阵的分解 4.1.4 计算照相机中心 4.2 照相机标定 4.2.1 相机参数标定实验 4. ...

  2. Python计算机视觉编程第四章——照相机模型与增强现实

    Python计算机视觉编程 照相机模型与增强现实 (一)针孔照相机模型 1.1 照相机矩阵 1.2 三维点的投影 1.3 照相机矩阵的分解 1.4 计算照相机中心 (二)照相机标定 (三)以平面和标记 ...

  3. Python计算机视觉编程第四章 照相机模型与增强现实

    照相机模型与增强现实 1 针孔照相机模型 1.1 照相机矩阵 1.2 三维点的投影 1.3 照相机矩阵的分解 1.4 照相机中心 2 照相机标定 3 以平面和标记物进行姿态估计 4 增强现实 4.1 ...

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

    文章目录 引言 4.1针孔照相机模型 4.1.1照相机矩阵 4.1.2三维点的投影 4.1.3照相机矩阵分解 4.1.4计算照相机中心 4.2照相机标定 4.2.1一个简单地标定方法 4.3以平面和标 ...

  5. Python计算机视觉编程学习笔记 四 照相机模型与增强现实

    照相机模型与增强现实 (一)针孔照相机模型 1.1 照相机模型 1.2 三维点的投影 1.3照相机矩阵的分解 1.4 计算照相机中心 (二)照相机标定 (三)以平面和标记物进行姿态估计 (四)增强现实 ...

  6. 四、【python计算机视觉编程】照相机模型与增强现实

    照相机模型与增强现实 (一)针孔照相机模型 (1)照相机矩阵 (2)三维点的投影 (3)照相机矩阵的分解 (4)计算照相机中心 (二)照相机标定 (三)以平面和标记物进行姿态估计 (四)增强现实 (A ...

  7. 照相机模型与增强现实(相机标定)

    计算机视觉:照相机模型与增强现实 针孔照相机模型 照相机标定 光学标定 自标定(SFM) 实验结果 本篇文章主要讲述如何通过通过照相机模型在映射中加入部分照相机产生图像过程的投影特性从而 处理三维图像 ...

  8. Python计算机视觉——照相机模型与增强现实

    Python计算机视觉--照相机模型与增强现实 文章目录 Python计算机视觉--照相机模型与增强现实 1 针孔照相机模型 1.1 照相机矩阵 1.2 三维点的投影 1.3 照相机矩阵的分解 1.4 ...

  9. 机器学习(周志华) 参考答案 第十四章 概率图模型 14.9

    机器学习(周志华西瓜书) 参考答案 总目录 http://blog.csdn.net/icefire_tyh/article/details/52064910 机器学习(周志华) 参考答案 第十四章 ...

最新文章

  1. spring的jar各包作用
  2. jquery设置属性值或移除属性
  3. 【视频】vue组件的局部注册
  4. spark 应用程序性能优化经验
  5. mysql like反义_MySQL条件检索_WHERE
  6. QT样式表(QStyleSheet)
  7. 基本排序算法之1——希尔排序shellsort
  8. 重装mysql 失败_重装MySQL最后一步失败的解决办法
  9. 细说 AppCompat 主题引发的坑:You need to use a Theme.AppCompat theme with this activity!
  10. PPT小技巧:拆解汉字!
  11. 自动驾驶决策规划研究综述
  12. 介绍几个巨佬给大家认识
  13. 《X战警:逆转未来》热映 破福斯海外开画纪录
  14. 点菜系统(适合Java基础练习)
  15. Linux 中的rsh,ssh
  16. pdf文件如何进行翻译?pdf文件翻译方法分享。
  17. Android-Application被回收引发空指针异常分析(消灭全局变量)
  18. ATTCK v10版本战术介绍—资源开发
  19. STEP7编程免驱动方式(METH-MPI-S2)
  20. 遇到收缴,扣留机动车号牌应当怎么办?

热门文章

  1. 网络综合布线公式 实用
  2. php 反射执行类方法,PHP的反射类ReflectionClass、ReflectionMethod使用方法
  3. matplotlib绘制四个子图
  4. 学习笔记 | 2023 AAAI 对抗性权值扰动改善图神经网络的泛化性能
  5. Oracle11g中---SqlPlus可以正常登陆,sqlDeveloper无法登录
  6. 失落的帝国-亚特兰蒂斯
  7. 智能卡操作系统COS概述
  8. Windows中如何使用vmware虚拟化
  9. 利用jQuery实现图片无限循环轮播(不借助于轮播插件)
  10. mysql创建学生答题系统_jsp+ssm+mysql实现的学生在线考试系统