目录

  • 一、相机模型
    • 1、相机与图像
    • 2、坐标系
    • 3、世界坐标系到摄像机坐标系
    • 4、摄像机坐标系到图像物理坐标系
    • 5、图像物理坐标系到图像像素坐标系
    • 6、摄像机坐标系到图像像素坐标系
    • 7、世界坐标系到图像像素坐标系
  • 二、 镜头畸变
    • 1、相机成像原理
    • 2、镜头畸变
      • 径向畸变:沿半径方向的畸变
      • 切向畸变:沿切线方向形成的畸变
    • 3、畸变矫正
  • 三、透视变换
    • 1、定义及算法流程
    • 2、示例代码

一、相机模型

1、相机与图像

  下图中如何从P到P’? 这是一个三维转二维的过程。

针孔相机模型存在四个坐标系:世界坐标系、摄像机坐标系、图像物理坐标系和图像像素坐
标系。
假设:
• 世界坐标系的坐标为Pw(Xw,Yw,Zw),
• 对应的摄像机坐标系坐标为Po(x,y,z),
• 对应的图像物理坐标系的坐标为P’(x’,y’),
• 对应的图像像素坐标系的坐标为p(u,v)。

2、坐标系

世界坐标系:是客观三维世界的绝对坐标系,也称客观坐标系。就是物体在真实世界中的坐标。世界坐标系是随着物体的大小和位置变化的,单位是长度单位。

相机坐标系:以相机的光心为坐标系的原点,以平行于图像的x和y方向为x轴和y轴, z轴和光轴平行, x,y, z互相垂直,单位是长度单位。

图像物理坐标系:以主光轴和图像平面交点为坐标原点, x’和y’方向如图所示,单位是长度单位。

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

相机成像:

3、世界坐标系到摄像机坐标系

这两个坐标系之间除了旋转矩阵R,还存在平移矩阵t。其关系可表示为:

R 、t 、0T都是矩阵
欧式变换:欧氏变换由两部分组成:旋转R 平移t


齐次坐标
  多次连续的旋转和平移的情况下。假设我们将向量a进行了两次欧氏变换,旋转和平移分别为R1, t1 和 R2, t2,分别得到:

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

这样下去公式会越来越长,我们可以用矩阵的形式进行表达:

4、摄像机坐标系到图像物理坐标系



相似三角形:

将Zc移到等式左边,并构建齐次坐标,然后将上述公式转为矩阵的形式:

5、图像物理坐标系到图像像素坐标系



dx和dy表示: x方向和y方向的一个像素分别占多少个(可能是小数) 长度单位。
齐次坐标下:

6、摄像机坐标系到图像像素坐标系

7、世界坐标系到图像像素坐标系


K表示相机的内参矩阵,设定好的;R、t表示相机的外参矩阵,随拍摄的图片而变化

  上述内容所讲的相机模型是指图像处理过程中计算需要用到的,而非真正的照相机在照相的过程,真正的照相机成像是光学原理进行成像的.

二、 镜头畸变

1、相机成像原理


2、镜头畸变


➢ 透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。
➢ 镜头的畸变分为径向畸变切向畸变两类。

r表示半径

径向畸变:沿半径方向的畸变

由透镜的形状引起的畸变称为径向畸变,透镜径向畸变后点位的偏移示意图如下所示

➢ 枕形畸变
➢ 桶形畸变

切向畸变:沿切线方向形成的畸变

  切向畸变是由于透镜本身与相机传感器平面(成像平面)或图像平面不平行而产生的。这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致,较少见,一般都是机器安装的,很少出问题。切向畸变示意图:

3、畸变矫正

• 径向畸变和切向畸变模型中一共有5个畸变参数,在Opencv中他们被排列成一个5*1的矩阵,依次包含k1、k2、 p1、 p2、 k3,经常被定义为Mat矩阵的形式,如Mat distCoeffs=Mat(1,5, CV_32FC1, Scalar::all(0));

• 这5个参数就是相机标定中需要确定的相机的5个畸变系数。

• 求得这5个参数后,就可以校正由于镜头畸变引起的图像的变形失真。这些参数在相机生产出来后就确定了,是可以得到的,在日常应用中一般都是已知的,相机标定中给定的。此外,也可通过矫正前的图像与矫正后的图像进行计算得到。


摄像中广角的原理类似将正常的图像变为畸变,使画面的内容变多。

三、透视变换

1、定义及算法流程

  透视变换是**将图片投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。**我们常说的仿射变换是透视变换的一个特例。

  透视变换的目的就是把现实中为直线的物体,在图片上可能呈现为斜线,通过透视变换转换成直线的变换。

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

  通用的变换公式为:这里的原始图片是带有畸变的,即x,y表示的图片

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

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

源点四个顶点坐标分别为A:(x0,y0),(x1,y1),(x2,y2),(x3,y3)
目标点四个顶点坐标分别为B: (X’0,Y’0),(X’1,Y’1),(X’2,Y’2),(X’3,Y’3)

将这八个点代入方程,并将其转换为矩阵相乘的格式:

上图中,点的坐标都是已知的,未知的只有warpMatrix中的元素的值,可通过解方程得到这些元素的值。

2、示例代码

根据上述算法过程实现代码:

import numpy as npdef WarpPerspectiveMatrix(src, dst):assert src.shape[0] == dst.shape[0] and src.shape[0] >= 4nums = src.shape[0]A = np.zeros((2*nums, 8)) # A*warpMatrix=BB = np.zeros((2*nums, 1))for i in range(0, nums):A_i = src[i,:]B_i = dst[i,:]A[2*i, :] = [A_i[0], A_i[1], 1, 0, 0, 0,-A_i[0]*B_i[0], -A_i[1]*B_i[0]]B[2*i] = B_i[0]A[2*i+1, :] = [0, 0, 0, A_i[0], A_i[1], 1,-A_i[0]*B_i[1], -A_i[1]*B_i[1]]B[2*i+1] = B_i[1]A = np.mat(A)#用A.I求出A的逆矩阵,然后与B相乘,求出warpMatrixwarpMatrix = A.I * B #求出a_11, a_12, a_13, a_21, a_22, a_23, a_31, a_32#之后为结果的后处理warpMatrix = np.array(warpMatrix).T[0]warpMatrix = np.insert(warpMatrix, warpMatrix.shape[0], values=1.0, axis=0) #插入a_33 = 1warpMatrix = warpMatrix.reshape((3, 3))return warpMatrixif __name__ == '__main__':print('warpMatrix')src = [[10.0, 457.0], [395.0, 291.0], [624.0, 291.0], [1000.0, 457.0]]src = np.array(src)dst = [[46.0, 920.0], [46.0, 100.0], [600.0, 100.0], [600.0, 920.0]]dst = np.array(dst)warpMatrix = WarpPerspectiveMatrix(src, dst)print(warpMatrix)

调用opencv库实现:

import cv2
import numpy as npimg = cv2.imread('photo1.jpg')result3 = img.copy()'''
注意这里src和dst的输入并不是图像,而是图像对应的顶点坐标。
'''
src = np.float32([[207, 151], [517, 285], [17, 601], [343, 731]])
dst = np.float32([[0, 0], [337, 0], [0, 488], [337, 488]])
print(img.shape)
# 生成透视变换矩阵;进行透视变换
m = cv2.getPerspectiveTransform(src, dst)
print("warpMatrix:")
print(m)
result = cv2.warpPerspective(result3, m, (337, 488))
cv2.imshow("src", img)
cv2.imshow("result", result)
cv2.waitKey(0)

注:本文章参考了百度百科、他人技术博客、八斗学院课件资料、计算机视觉书籍等综合整理而来,如有侵权,联系删除!水平有限,欢迎各位指导交流!

计算机视觉之相机模型相关推荐

  1. 计算机视觉基础 相机模型

    文章目录 相机模型 世界坐标系到摄像机坐标系 摄像机坐标系到图像物理坐标系 图像物理坐标系到图像像素坐标系 摄像机坐标系到图像像素坐标系 世界坐标系到图像像素坐标系 相机成像原理 镜头畸变 透视变换 ...

  2. 【计算机视觉】相机模型立体视觉

    文章目录 1. 相机模型 1.1 相机模型的四个坐标系 1.2 坐标系关系图 1.3 坐标系之间的转换 1.3.1 世界坐标系到摄像机坐标系 1.3.2 摄像机坐标系到图像物理坐标系 1.3.3 图像 ...

  3. 计算机视觉:相机模型与参数标定

    目录 一.针孔照相机模型 1.像主点偏移 2.内参矩阵 3.畸变现象 4.畸变校正 二.照相机标定 1.标定原理 2.实验流程 三.代码实现(python+opencv) 1.数据准备 2.代码实现 ...

  4. 摄影测量与计算机视觉--相机模型与成像几何

    前言 总体而言,摄影测量与计算机视觉在相机模型和成像几何上有许多的共通之处,尤其是在CCD/CMOS普及之后两者的差别逐渐变小.然而由于摄影测量发源于胶片相机时代并且摄影测量通常是俯视拍摄(即利用航空 ...

  5. 【相机标定与三维重建原理及实现】学习笔记1——相机模型数学推导详解

    目录 前言 一.小孔成像模型 二.坐标系的变换 1.世界坐标系到相机坐标系的变换(刚体变换)[xw^→xc^\boldsymbol {\hat{x_{w}}}\rightarrow \boldsymb ...

  6. 一文尽览 | 计算机视觉中的鱼眼相机模型及环视感知任务汇总!

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心技术交流群 后台回复[ECCV2022]获取ECCV2022所有自动驾驶方向论文! 论文 ...

  7. 计算机视觉学习6_棋盘格_相机模型与参数标定

    文章目录 为什么要进行相机参数标定 相机内参矩阵原理 相机标定方法--Recap: 相机标定 张正友标定法 相机模型 计算单应性矩阵H 计算内参数矩阵 计算外部参数 实验(matlab实现) 为什么要 ...

  8. 基于图像的三维模型重建——相机模型与对极几何

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:梦寐mayshine https://zhuanlan.zhihu.com/p/12968108 ...

  9. 计算机视觉(相机标定)-1.1-针孔摄像机透镜

    计算机视觉(相机标定)-1.1-针孔摄像机&透镜 学习前言 一.针孔摄像机  1.基本想法  2.实现原理  3.针孔摄像机模型(重点) 二.透镜  1.为什么需要透镜  2.加入透镜后的模型 ...

最新文章

  1. java 使用正则表达式从网页上提取网站标题
  2. mysql 本地备份_MYSQL数据库自动本地/异地双备份/MYSQL增量备份
  3. (转载)[FFmpeg]使用ffmpeg从各种视频文件中直接截取视频图片
  4. C语言程序设计 练习题参考答案 第七章 (2) 指针与数组 main函数形参
  5. python大作业外星人入侵_【python3小白上路系列】外星人入侵——开始
  6. day21 面向对象之继承和组合
  7. 匿名内部类 java 1614965228
  8. Linux开启服务器问题(李蕾问题)
  9. 详解ADSL接入方式的异同比较
  10. Angular2 指令
  11. 力扣-868 二进制间距
  12. relocation R_X86_64_PC32 against symbol lua_newstate can not be used when making a shared object
  13. openwrt 需要高级浏览器_树莓派 + OpenWrt 实现 BT 下载机
  14. java设计模式(创建型)之生成器模式
  15. DynamipsGUI小凡模拟器VPCS的DHCP功能
  16. 创意字体设计,创意思路哪里找
  17. 232接口针脚定义_工业RS232接口总线原理与应用方案
  18. 基于北京二手房价数据的探索性数据分析和房价评估——数据的可视化分析
  19. TCL/Tk基础学习(二)
  20. ip_forward 权限不够

热门文章

  1. css实现第二行超出显示省略号
  2. python到底是什么东西,python到底是什么语言
  3. 什么是页缓存(Page Cache)(转载)
  4. ValueError: unsupported format character ‘j‘ (0x6a) at index 4
  5. js中动态修改frame的src属性,frame自己刷新。。。
  6. CentOS7内置Realtek网卡驱动r8169降级r8168
  7. 优雅编程之这样处理系统,你就“正常”了
  8. matlab中imfinfo函数的作用
  9. java防止溢出mod1000000007
  10. POST和GET区别 -- 面试重点之一