CV学习笔记-相机模型(欧式变换及仿射变换)

简介: CV学习笔记-相机模型(欧式变换及仿射变换)

相机模型

1.相机模型原理

1. 相机成像

相机成像是一个小孔成像模型,将现实生活中的三维空间物体映射到二维的成像平面上,进而生成二维的图像。

2018122814580746.png

相机模型中的坐标系:

  • 世界坐标系Pw(Xw, Yw, Zw):对应真实客观三维世界的坐标系,也称为客观坐标系,表征物体在真实世界中的位置坐标。世界坐标系是随着物体的大小和位置变化的,单位一般是长度单位。
  • 摄像机坐标系PO(x, y, z):对应以相机的光心为原点的坐标系,其以平行于图像的x和y方向为x轴y轴,z轴与光轴平行,单位也为长度单位。

     图像物理坐标系P’(x’, y’): 对应以主光轴和图像平面交点为坐标原点的坐标系,单位仍为长度单位。

     图像像素坐标系P(u, v): 对应以图像的顶点为坐标原点的坐标系,u和v的方向平行于x’和y’方向, 单位是像素

2018122814580746.png

相机成像流程:

image.png

2. 坐标变换

欧式变换: 在任何的三维空间的物体,都可以以三维坐标系表示,也即在现实空间中的物体的点,在不同的坐标系下的坐标是不一样的,因为基底不同,那么一个固定的点,在一个坐标系下的坐标,如果转换到另一个坐标系下,使得另外一个坐标系能够确定这个位置,就需要用到欧式变换。 任何一个坐标系到另一个坐标系的转换可以通过旋转和平移完成。

平移变换&旋转变换&齐次坐标:

平移变换是指转换双方坐标系经过有限次平移可以重合,情形例如高帽在人脸的正上方的情况,这样人脸的中心坐标系转换到高帽中心坐标系,仅需将坐标原点向上平移变换即可,没有坐标轴的旋转偏移,在线性代数里的平移变换是在空间坐标系中所在位置的转换,习惯用坐标系中的O的向量表示,通过向量的加常量即可实现,多次平移变换直接进行向量相加即可实现。平移变换比较简单易懂,而旋转变换较为复杂,可以通过二维坐标旋转变换推广到三维笛卡尔坐标系下,对于空间里的刚体来说,是有六个自由度的,绕xyz的转动自由度有三个,而在二维平面中,只能绕垂直平面的轴旋转,即只能有一个自由度,那么对于三维坐标系来说能够写出3×3的R矩阵,记为旋转矩阵

2018122814580746.png

上式表示从B坐标系转换到A坐标系的旋转矩阵中的每一列子向量,等价为B坐标系的坐标轴单位向量在A坐标系中的表示。不难发现这个旋转矩阵是正交单位阵,故有以下推论:

2018122814580746.png

上式说明,矩阵的每一行就是A坐标系的坐标轴在B坐标系中的表示。旋转变换的公式如下:

2018122814580746.png

连续的旋转变换只要矩阵相乘即可。当旋转平移变换同时出现的时候,引入齐次坐标变换的概念;

2018122814580746.png

由上面的结论不难推出此变换过程,这个过程如果用一个矩阵表示,会简洁很多,齐次坐标变换矩阵也应运而生,上图的变换过程等效于以下表达:

2018122814580746.png

T矩阵就是该变换中的齐次坐标变换矩阵,齐次坐标变换矩阵T是一个四阶方阵,可以同时表示旋转变换和平移变换,齐次坐标变换矩阵公式表达如下:

2018122814580746.png

将上面推导过程的角标简化,举个例子:

若将向量a进行两次欧式变换,旋转和平移分别为R1,t1和R2,t2,分别得到:

b = R1*a + t1; c = R2*b + t2; c = R2*(R1*a + t1) + t2

2018122814580746.png

世界坐标系到相机坐标系:

世界坐标系到相机坐标系的变换中也不例外的存在旋转矩阵R和平移矩阵t,关系表示为:

2018122814580746.png

相机坐标系到图像物理坐标系:

  • 原理:相似三角形

2018122814580746.png

2018122814580746.png

  • 矩阵表示为:f为焦距
  • 2018122814580746.png
  • 图像物理坐标系到图像像素坐标系:
  • 原理:坐标偏移(dx、dy表示x和y方向上的一个像素分别占多少个长度单位,dx、dy可能为小数)
  • 2018122814580746.png
  • 2018122814580746.png
  • 齐次坐标表示:
  • 2018122814580746.png
  • 相机坐标系到图像像素坐标系的连续欧式变换:
  • 2018122814580746.png
  • 世界坐标系到图像像素坐标系:
  • 推导过程:
  • 2018122814580746.png
  • 2018122814580746.png
  • 结论:
  • 2018122814580746.png

2. 镜头畸变

1. 镜头畸变

由于制造精度以及组装工艺的偏差,透镜的成品往往会产生畸变,导致原始图像失真。镜头畸变分为径向畸变和切向畸变。

2018122814580746.png

2. 径向畸变

  • 原因 :由于透镜的形状产生的畸变称为径向畸变,透镜径向畸变后点位的偏移示意图:

2018122814580746.png

枕形畸变

2018122814580746.png

桶形畸变

2018122814580746.png

3. 切向畸变

  • 原因:切向畸变是由于透镜本身与相机传感器平面(成像平面)或图像平面不平行而产生的。(大多是由于透镜被粘贴到镜头模组上的安装偏差导致)

2018122814580746.png

4. 畸变矫正

方法:

  • 径向畸变和切向畸变模型中一共有5个畸变参数,在Opencv中他们被排列成一个5*1的矩阵,依次包含k1、k2、p1、p2、k3(这5个参数就是相机标定中需要确定的相机的5个畸变系数),经常被定义为Mat矩阵的形式
Mat distCoeffs = Mat(1.5, CV_32FC1, Scalar::all(0));
  • 求得这5个参数后,就可以校正由于镜头畸变引起的图像的变形失真。

2018122814580746.png

2018122814580746.png

3. 透视变换

1.定义

透视变换又称投影映射(Projective Mapping),是将一个图片从原有平面投影到一个新的视平面(Viewing Plane)的过程。

2. 目的

现实中的物体为直线的棱等在图片中可能是斜线,通过透视变换可以把这条斜线变换成直线。

3. 与仿射变换的区别

仿射变换是透视变换的一个特例,仿射变换(Affine Transformation 或 Affine Map)是指在几何中图像从一个向量空间进行一次线性变换和一次平移,变换到另一个向量空间的过程。

2018122814580746.png

4. 变换过程

  • 变换公式:

2018122814580746.png

下式中的X,Y是原始图片坐标(上式的x,y),对应得到变换后的图片坐标(X’;Y’;Z’)其中Z’=1:

2018122814580746.png

一般地,我们令a33=1,展开上面公式,得到一个点的情况:

2018122814580746.png

image.png个人学习笔记,仅学习交流,转载请注明出处!

相关文章
|
消息中间件 数据库
开发指南062-异步处理接口
后台有些接口耗时非常长,如果采用同步处理机制,前台等待时间过长,这时需要改异步操作
QGS
|
存储 NoSQL Java
手拉手Centos7安装配置Redis7
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
QGS
766 0
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
23869 59
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
传感器 机器人 测试技术
ROS相机内参标定详细步骤指南
本文是关于ROS相机内参标定的详细步骤指南,包括了标定的目的、原理、所需材料、具体操作流程以及标定结果的分析。文章以Ubuntu20.04和ROS1 Noetic为测试环境,适用于单目RGB相机的内参标定,使用ros-noetic-camera-calibration工具包进行操作,并提供了标定过程中的注意事项和建议。
1994 1
ROS相机内参标定详细步骤指南
|
机器学习/深度学习 自然语言处理 语音技术
《探秘卷积神经网络:权重共享与局部连接的神奇力量》
卷积神经网络(CNN)中的权重共享和局部连接是其核心特性。权重共享通过同一卷积核在不同位置使用相同权重,减少参数量并提高泛化能力;局部连接则使每个神经元仅与输入的局部区域相连,专注于提取局部特征。两者相辅相成,显著降低计算复杂度,增强对空间结构的感知,使CNN在图像识别等领域表现出色。
924 8
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
5006 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
机器学习/深度学习 编解码 算法
深度学习之边缘检测
边缘检测是计算机视觉中的一项基本任务,旨在识别图像中像素值变化显著的区域,即边缘。传统的边缘检测算法(如Sobel、Canny等)通过滤波器和梯度运算来检测边缘,而基于深度学习的方法则通过训练神经网络自动学习图像中的边缘特征,从而实现更高的检测精度和鲁棒性。
747 1
|
计算机视觉
OpenCV(十二):图像透视变换
OpenCV(十二):图像透视变换
959 0