一文带你搞懂相机内参外参(Intrinsics & Extrinsics)

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

摘要:本文介绍了相机的内参和外参以及推导过程,由三个部分组成:第一部分,相机内参;第二部分,相机外参;第三部分,总结。

1 相机内参

cac8c2894a2a535bf2bee4ceaaa080b6.png

在左图中,我们把相机看作是针孔,现实世界中的点P经过相机的光心O,投影到物理成像平面上,变为点P'。

在右图中,对这个模型进行了一个简化,将其看作是一个相似三角形。

下面我们来对这个模型进行建模。

设O-X-Y-Z为相机坐标系,习惯上我们把z轴指向相机前方,x向右,y向下。O为摄像机的光心,也是针孔模型中的针孔。

设真实世界点中的P的坐标为,成像的点P'的坐标为, 物理成像平面和光心的距离为f(即为焦距)。

根据右图中的三角形相似关系,有:

3b470b8ef46c4435c2fc225054c0b190.png

其中,有负号是因为坐标轴方向,也就表示了成的像是倒立的。

为了表示起来更方便,我们把成像平面从相机的后面对称到前面去,如下图所示。这样,负号就没有了。

1bfee0e38e4a613d6b9c0dd636be67c0.png

在对称后,有:

4054340b59d6523c0fa4d461220b1efe.png

整理解出P'的坐标:

7ad722beb90547ffffac38026d134679.png

上面两个式子就描述了P点与它所成像的坐标关系,可以看到,X对应的X'与焦距f有关,与距离Z有关。

映射到成像平面上还不够,我们还需要将这个像给放到像素坐标系内。

我们设在物理成像平面上固定着像素平面O-U-V。

设P'在像素平面坐标系上的坐标是。

像素坐标系通常定义方式是:原点o'位于图像的左上角,u轴向右与x轴平行,v轴向下与y轴平行。

我们设像素坐标在u轴上缩放倍,在v轴上缩放了倍。同时,原点平移了Cx,Cy。

因此可以得到P'与像素坐标的关系:

952a944ad45124df48510a500c361231.png

代入P与P'的关系式可得:

7f90ddead440aa35badc40cdb76aa76f.png

其中,我们用,替换了f 和f 。,的单位是像素。

用齐次坐标,把上式写出矩阵的形式:

e44e7a8eb0bd9fb3fbb96c46520b1541.png

也可以把Z写到等式左边去,就变成了:

8c2e1d1fb91924a603b95bd6a2ee89b7.png

上式中,K即为相机的内参矩阵(Intrinsics)。通常来说,相机的内参在出厂之后就是固定的了。

2 相机外参

在上面的推导中,我们用的是P在相机坐标系的坐标(也就是以相机为O点),所以我们应该先将世界坐标系中的给变换到相机坐标系中的P。

相机的位姿由旋转矩阵R和平移向量t来描述,因此:

d1616bb35aee248e89adc4d648612d90.png

再代入之前的内参的式子,得到:

ca9e8f7a22615e0e03e523cf284b1fdd.png

后面一个等号蕴含了一个齐次坐标到非齐次坐标的转换。

其中,R,t为相机的外参(Extrinsics)。

3 总结

本文介绍了:

  1. 从相机坐标系转换到像素坐标系中,相机内参的作用

  2. 从世界坐标系转换到相机坐标系中,相机外参的作用

相机内参是这样的一个矩阵:

046359d2235dd2de7a8faae26b22af2c.png

里面的参数一般都是相机出厂就定下来的,可以通过相机标定的方式人为计算出来。

相机外参是旋转矩阵R和平移向量t构成,一般来说写成:

9c6bcac252aab8afa8a2e9f30f1936ce.png

这个矩阵决定了相机的位姿。

参考文献:

[1] 视觉slam十四讲,高翔

[2] Step1:模型 16个相机参数(内参、外参、畸变参数)

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Python中,可以使用OpenCV库来获取图片的相机外参信息。具体步骤如下: 1. 导入所需的库:首先,需要导入OpenCV库以及NumPy库,用于图像处理和矩阵运算。 2. 加载图片:使用`cv2.imread()`函数加载待处理的图片。 3. 初始化相机矩阵:相机矩阵是相机内参信息,包括焦距、主点等。可以根据相机的型号进行查找或者根据实际情况进行估计。 4. 使用SIFT或SURF等特征提取算法:通过调用相应的特征提取算法,如SIFT或SURF,可以从图像中提取出特征点及其描述子。 5. 在待匹配的图片中寻找特征点:使用`feature.detectAndCompute()`函数可以在待匹配的图片中找到相应的特征点及其描述子。 6. 使用特征匹配算法:将待匹配图片中的特征点和描述子与参考图片中的特征点和描述子进行匹配。可以使用`cv2.BFMatcher()`函数来创建一个Brute Force Matcher。 7. 获取匹配结果:根据匹配算法的结果,筛选出符合要求的匹配对。 8. 通过三角化算法计算相机外参信息:使用OpenCV的`cv2.triangulatePoints()`函数可以根据特征点的对应关系来计算相机外参信息。 9. 输出外参信息:根据需要,可以将相机外参信息以可读的形式进行输出,例如相机的旋转矩阵、平移向量等。 以上是一种常见的获取图片的相机外参信息的方法,具体实现还取决于具体的应用需求和图片的特点。 ### 回答2: 通过图片得到相机外参信息需要通过计算机视觉中的相机标定技术来实现。具体步骤如下: 首先,需要进行相机标定。相机标定是通过采集一组已知世界坐标的特征点对应的图像坐标来确定相机内参和畸变参数。可以使用OpenCV库提供的函数进行相机标定,如cv2.calibrateCamera()。 其次,通过相机标定得到的内参和畸变参数,可以使用函数cv2.solvePnP()来计算外参(旋转矩阵和平移向量)。此函数需要提供已知的特征点在世界坐标系中的坐标和对应的图像坐标,根据这些点的对应关系计算得到外参。 然后,可以根据求解得到的旋转矩阵和平移向量,进一步计算出相机的位置和姿态信息。在实际应用中,一般会通过框架如OpenGL或三维模型处理库来进行透视投影,将三维世界中的点投影到图像上。 最后,根据投影后的点和对应的图像坐标,使用非线性优化算法(如Levenberg-Marquardt算法)对外参进行优化,使得投影点与实际图像点之间的重投影误差最小。这一步可以使用函数cv2.solvePnP()中的参数flags设置为cv2.SOLVEPNP_ITERATIVE来实现。 总之,通过相机标定和计算机视觉算法,可以从图片中获取相机外参信息,进而实现3D视觉应用,包括物体位姿估计、增强现实等。 ### 回答3: 在Python中,我们可以使用OpenCV库来获取图像的相机外参信息。下面是一种常见的方法: 1. 导入所需的库: ```python import cv2 import numpy as np ``` 2. 加载图片: ```python image = cv2.imread("image.jpg") ``` 3. 定义相机内参矩阵: ```python intrinsics = np.array([[focal_length, 0, image_width/2], [0, focal_length, image_height/2], [0, 0, 1]]) ``` 其中,focal_length为相机的焦距,image_width和image_height分别为图像的宽度和高度。 4. 使用OpenCV的棋盘格标定方法来检测角点并计算相机外参信息: ```python pattern_size = (rows, columns) # 棋盘格的行数和列数 found, corners = cv2.findChessboardCorners(image, pattern_size, None) if found: cv2.cornerSubPix(image, corners, (11, 11), (-1, -1), criteria) # 优化角点的准确性 ret, rotation_vector, translation_vector = cv2.solvePnP(object_points, corners, intrinsics, None) ``` 其中,object_points为棋盘格角点在真实世界坐标系中的坐标,criteria为优化角点的迭代停止条件。 5. 输出外参信息: ```python rotation_matrix, _ = cv2.Rodrigues(rotation_vector) print("Rotation Matrix:\n", rotation_matrix) print("Translation Vector:\n", translation_vector) ``` 外参信息包括旋转矩阵(Rotation Matrix)和平移向量(Translation Vector)。 通过以上步骤,我们可以使用Python通过图片得到相机外参信息。注意,在实际应用中,需要保证拍摄的图像中有足够的角点,且角点检测精确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值