目录

一、物理模型

1.引入库

2.透视投影模型

3.主点偏移

4.图像传感器特性

5.径向畸变

6.相机外参

二、模型求解

1.内参和单应矩阵关系

三、matlab求相机参数

1、应用程序中找到Camera Calibration​编辑

2、添加标定板拍摄图片(按Ctrl可一次添加多张)

​编辑

3、输入棋盘格每格的尺寸大小

4、显示已检测出的棋盘格,点击Calibration,开始标定。

​编辑5、得到标定结果(平均误差小于0.5即可认为结果可靠,这里得到的结果是0.49)

6.标定结果

​编辑

四、python代码标定

标定结果:


一、物理模型

1.引入库

相机为什么需要标定呢?任何理论物理模型都是在特定假设上对真实事物的近似,然而在实际应用中存在误差,普通相机的成像模型也不例外(透视投影)。实际中,普通相机成像误差的主要来源有两部分,第一是sensor制造产生的误差,比如sensor成像单元不是正方形,sensor歪斜;第二是镜头制造和安装产生的误差,镜头一般存在非线性的径向畸变;镜头与相机sensor安装不平行,还会产生切向畸变。

2.透视投影模型

普通相机的成像模型一采用小孔成像,初中的物理知识告诉我们,就是那个蜡烛成像实验,物体经小孔后,在成像平面成倒立的像。为了更好的进行理论阐述,一般默认采用虚拟成像平面(virtual image plane)进行分析。Matlab官方有张很形象的图片:

图1 小孔成像模型

将小孔成像模型简化成几何表达的形式:

图2 小孔成像几何示意图

在理想情况下,根据简单的相似三角形几何知识,可以推出3D目标点在相机坐标系下的坐标与图像像素坐标之间的关系, 如公式1-1:

f是焦距,X、Y、Z是3D点在相机坐标系坐标,u,v是图像坐标;
上述公式写成齐次坐标为:

λ为尺度因子,同一条投影线上的点都满足上述关系,只是λ不同而已;在不换sensor情况下,想增大物体分辨率,其实只要把相机靠近一点就行。

3.主点偏移

主点是光轴和相机成像平面的交点,1.2节考虑的是理想成像情况,图像坐标系和相机坐标系原点重合,因此不存在坐标系偏移。但是在实际情况中,图像坐标系往往在图片的左上角,光轴过图像中心,因此图像坐标系和相机坐标系不重合。两个坐标系之间存在一个平移运动(如图):

图3 主点偏移示意图

考虑主点偏移后,图像坐标和3D在相机坐标系坐标的关系为:

主点偏移后,透视投影模型的的齐次坐标表达为:

4.图像传感器特性

图像传感器像原尺寸在制造过程可能不是正方形,同时可能存在歪斜(skewed),因此需要考虑这些影响因素,传感器歪斜和不是正方形主要对相机x和y方向的焦距产生影响,数学表达见公式:

图4 image sensor

在不考虑畸变的情况下,考虑主点偏移、图像传感器的特性,3D目标点成像数学模型用公式(1-5)可完全表达。这就是相机内部参数对成像的影响,因此K称为内参矩阵,相机内参标定主要是标定相机的焦距、主点、歪斜等内部参数.

5.径向畸变

透过镜头边缘的光线很容易产生径向畸变,光线离镜头中心越远,畸变越大。

图5 镜头径向畸变示意(从左到右:无畸变,桶形畸变,枕形畸变)

6.相机外参

相机往往装在机械臂末端,移动小车前方,车辆四周,当我们需要知道成像平面内的物体在机器人或者车辆坐标系下的位置时,需要进行一个坐标转换,称为外参(Extrinsic parameters),它与相机制造、镜头畸变没有任何关系,只与相机在世界坐标系内的安装位置和角度有关。从纯数学的角度来说,刚体运动和坐标变换总是可以分解为一个旋转运动和一个平移运动。

图6 相机坐标系和世界坐标系的关系

因此世界坐标系下的点P与图像坐标的关系可以表达为:

相机标定就是标定内参和外参,通过一种理论数学模型和优化的手段来近似实际的物理成像关系。

二、模型求解

1.内参和单应矩阵关系

空间中的3D点投影到图像上的关系为:

其中,图像齐次坐标ⅲ=[v,v,1,3D点齐次坐标M=[Y,Y,Z,s为尺度因子,A为相机内参矩阼,[R切为外参矩阵。
一般我们都会用标定板来标定,所有的特征点都在一个平面上,不失一般性,可以假设这个平面的空间Z坐标为0,将外参R矩阵写成列向量的形式为:

因为Z=0,可以去掉r3列向量,化简为:

因此,空间3D点和图像坐标之间通过一个单应矩阵H(homography)联系在一起,单应矩阵如下:

由于向量r1与r2正交且长度都为1,因此可以得出以下关系:

2.闭环求解

V是只由单应矩阵决定的已知量,求解上述线性方程,就可以得到向量b,矩阵B。向量b包含6个未知量,V是2n x 6矩阵,n代表单应矩阵个数(或者图像张数),所以至少需要采集三张不同位置或者角度的图像,才能求解上述方程。实际中,为了降低误差,会采集15-20张图像。

相机内参A和B矩阵的关系(根据公式2-8),推出如下:

三、matlab求相机参数

1、应用程序中找到Camera Calibration

2、添加标定板拍摄图片(按Ctrl可一次添加多张)

3、输入棋盘格每格的尺寸大小

4、显示已检测出的棋盘格,点击Calibration,开始标定。


5、得到标定结果(平均误差小于0.5即可认为结果可靠,这里得到的结果是0.49)

6.标定结果

四、python代码标定

代码如下:

import cv2
import numpy as np
import glob# 找棋盘格角点
# 阈值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
#棋盘格模板规格
w = 11  #内角点个数,内角点是和其他格子连着的点
h = 8# 世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
objp = np.zeros((w*h,3), np.float32)
objp[:,:2] = np.mgrid[0:w,0:h].T.reshape(-1,2)
# 储存棋盘格角点的世界坐标和图像坐标对
objpoints = [] # 在世界坐标系中的三维点
imgpoints = [] # 在图像平面的二维点images = glob.glob('./camera/01.jpg') # 标定所用图像
for fname in images:img = cv2.imread(fname)gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 找到棋盘格角点# 棋盘图像(8位灰度或彩色图像)  棋盘尺寸  存放角点的位置ret, corners = cv2.findChessboardCorners(gray, (w,h),None)# 如果找到足够点对,将其存储起来if ret == True:# 角点精确检测# 输入图像 角点初始坐标 搜索窗口为2*winsize+1 死区 求角点的迭代终止条件cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)objpoints.append(objp)imgpoints.append(corners)# 将角点在图像上显示cv2.drawChessboardCorners(img, (w,h), corners, ret)cv2.imshow('findCorners',img)cv2.waitKey(1000)
cv2.destroyAllWindows()
#标定、去畸变
# 输入:世界坐标系里的位置 像素坐标 图像的像素尺寸大小 3*3矩阵,相机内参数矩阵 畸变矩阵
# 输出:标定结果 相机的内参数矩阵 畸变系数 旋转矩阵 平移向量
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# mtx:内参数矩阵
# dist:畸变系数
# rvecs:旋转向量 (外参数)
# tvecs :平移向量 (外参数)
print (("ret:"),ret)
print (("mtx:\n"),mtx)        # 内参数矩阵
print (("dist:\n"),dist)      # 畸变系数   distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
print (("rvecs:\n"),rvecs)    # 旋转向量  # 外参数
print (("tvecs:\n"),tvecs)    # 平移向量  # 外参数
# 去畸变
img2 = cv2.imread('camera/01.jpg')
h,w = img2.shape[:2]
# 我们已经得到了相机内参和畸变系数,在将图像去畸变之前,
# 我们还可以使用cv.getOptimalNewCameraMatrix()优化内参数和畸变系数,
# 通过设定自由自由比例因子alpha。当alpha设为0的时候,
# 将会返回一个剪裁过的将去畸变后不想要的像素去掉的内参数和畸变系数;
# 当alpha设为1的时候,将会返回一个包含额外黑色像素点的内参数和畸变系数,并返回一个ROI用于将其剪裁掉
newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),0,(w,h)) # 自由比例参数dst = cv2.undistort(img2, mtx, dist, None, newcameramtx)
# 根据前面ROI区域裁剪图片
x,y,w,h = roi
dst = dst[y:y+h, x:x+w]
cv2.imwrite('calibresult01.jpg',dst)# 反投影误差
# 通过反投影误差,我们可以来评估结果的好坏。越接近0,说明结果越理想。
# 通过之前计算的内参数矩阵、畸变系数、旋转矩阵和平移向量,使用cv2.projectPoints()计算三维点到二维图像的投影,
# 然后计算反投影得到的点与图像上检测到的点的误差,最后计算一个对于所有标定图像的平均误差,这个值就是反投影误差。
total_error = 0
for i in range(len(objpoints)):imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)error = cv2.norm(imgpoints[i],imgpoints2, cv2.NORM_L2)/len(imgpoints2)total_error += error
print (("total error: "), total_error/len(objpoints))

标定结果:

[0.00000000e+00 2.86802995e+03 1.35419981e+03]
 [0.00000000e+00 0.00000000e+00 1.00000000e+00]]
dist:
 [[ 1.54130915e-03 -2.99222555e-02  3.69680166e-04 -2.93886525e-04
   4.06423631e-01]]
rvecs:
 (array([[-0.12592551],
       [-0.03422657],
       [ 0.03250296]]), array([[-0.10876915],
       [-0.49338794],
       [-2.45467187]]), array([[-0.54473033],
       [ 0.19837985],
       [ 2.40103069]]), array([[-0.26610585],
       [ 0.30957221],
       [ 0.26237148]]), array([[-0.62768131],
       [ 0.52836951],
       [ 1.60555811]]), array([[-0.24387772],
       [ 0.48426986],
       [ 0.94096359]]), array([[-0.54301368],
       [ 0.22243723],
       [ 0.56651674]]), array([[-0.29992896],
       [ 0.16366412],
       [ 0.28594309]]), array([[ 0.56868496],
       [-0.23488729],
       [-3.03128871]]), array([[-0.24993186],
       [ 0.62126965],
       [ 3.03176551]]), array([[-0.27464255],
       [-0.55132814],
       [-2.47564527]]), array([[-0.15638079],
       [-0.42207242],
       [-2.76375565]]), array([[-0.01682992],
       [-0.54842287],
       [-2.94770157]]), array([[-0.15743943],
       [ 0.46689365],
       [ 2.89389881]]))
tvecs:
 (array([[-5.12251476],
       [-3.27783059],
       [17.91535082]]), array([[ 1.31090942],
       [ 3.31490161],
       [15.4529997 ]]), array([[ 6.72771045],
       [-0.9946229 ],
       [19.56335925]]), array([[-4.34219433],
       [-4.77675568],
       [18.31733919]]), array([[ 4.71916853],
       [-4.13479103],
       [21.43256996]]), array([[-1.05529691],
       [-7.81252553],
       [19.11737562]]), array([[-2.26722051],
       [-6.76506725],
       [17.69569288]]), array([[-4.86272097],
       [-4.92013636],
       [17.45036303]]), array([[ 2.86703186],
       [ 2.769005  ],
       [17.66527934]]), array([[ 5.75862975],
       [ 2.29084879],
       [17.55446603]]), array([[ 0.81859215],
       [ 3.21322267],
       [13.4873495 ]]), array([[ 0.40703317],
       [ 2.7759653 ],
       [15.68718693]]), array([[ 3.5362033 ],
       [ 2.52649518],
       [17.05451119]]), array([[ 3.7301075 ],
       [ 0.02897521],
       [17.41424535]]))

Process finished with exit code 1

【计算机视觉】相机标定相关推荐

  1. 计算机视觉----相机标定模型

    简介 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.相机标定简介 二.张友正黑白棋盘标定 1.思想 2.原理 3.模型求解 三.实验内容及过程 3.1 实验要求 ...

  2. 计算机视觉——相机标定

    一.相机标定简介 相机标定指建立相机图像像素位置与场景点位置之间的关系,根据相机成像模型,由特征点在图像中坐标与世界坐标的对应关系,求解相机模型的参数.相机需要标定的模型参数包括内部参数和外部参数. ...

  3. 计算机视觉-相机标定(Camera Calibration)

    1.相机标定基本原理 1.1 简介 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立摄像机成像的几何模型,这些几何模型参数就是摄像机参数 ...

  4. 计算机视觉—— 相机标定

    目录 简介 一.相机模型 1.坐标系 2.坐标系变化 3.相机畸变模型 二.相机标定原理 三.张正友黑白棋盘格标定 2.1.算法思想 2.2.求解内参和外参的积 2.3.求解内参矩阵 2.4.求解外参 ...

  5. 计算机视觉——相机标定之张正友标定法

    这里写目录标题 一.相机标定 1.相机标定原理 2.相机标定步骤 3.数据集其他注意事项 二.相机标定实验 1.数据集 2.代码实现 3.实验结果 4.代码解读 一.相机标定 1.相机标定原理 2.相 ...

  6. matlab棋盘格标定角点,相机标定(Camera calibration)Matlab——棋盘格标定原理,流程...

    计算机视觉----相机标定 相机标定概念:图像测量过程以及计算器视觉中,为确定空间物体某点的三维几何关系位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,模型的参数就是相机的参数.求解 ...

  7. 【三维重建】相机标定:张正友标定法

    系列文章目录 本系列开始于2022.12.25,开始记录三维重建项目课题研究时的学习笔记,其中主要分为以下几部分组成: 一.相机成像及坐标系之间的转换关系 二.相机标定:张正友标定法 三.特征检测与匹 ...

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

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

  9. 计算机视觉——python3实现张正友棋盘相机标定图像

    照相机标定 前言:相机标定是我们相机拍摄的物体都处于三维世界坐标系中,而相机拍摄成像时把三维相机坐标系向二维图像坐标系转换.不同镜头成像时的转换矩阵不同可能引入失真,标定的作用是近似地估算出转换矩阵和 ...

  10. 【计算机视觉】相机标定原理(像素点与三维坐标点的转换)

    一.相机标定概述 相机标定目的 计算机视觉的任务之一:从相机获取的图像信息出发计算三维空间中物体的几何信息,并由此重建和识别物体. 相机标定内容 空间物体表面某点的三维几何位置与其在图像中对应点之间的 ...

最新文章

  1. 难忘的一天——装操作系统(四)
  2. 院士论坛 | 郭毅可院士:人工智能的热望与冷思考
  3. oracle创建表+注释
  4. (0093)iOS开发自己账号跑真机报错:conflicting provisioning
  5. struct timeval结构体
  6. Python面向对象:反射(hasattr和getattr和setattr和delattr)
  7. Python列表排序 reverse、sort、sorted 操作方法详解
  8. 使用JMeter对异步HTTP / REST服务进行压力/负载测试
  9. MySQL排序ORDER BY与分页LIMIT,SQL,减少数据表的网络传输量,完整详细可收藏
  10. Python 08 面向对象
  11. 微软引入linux内核,微软内部已在讨论Linux内核中加入exFAT的可能性
  12. 面试官:Redis中的缓冲区了解吗
  13. leetcode 67 Add Binary
  14. 语言 ota_小米手表第五次OTA升级:百款新表盘 增加运动语音、振动提醒
  15. 数据结构之内部排序一
  16. 转:Delphi中destroy, free, freeAndNil, release用法和区别
  17. linux中python如何调用matlab的数据_如何在Python中创建Gif动图?(动图数据可视化基础教学)
  18. 病毒木马入侵招数大曝光
  19. 八数码 || 九宫重排(A*搜索代码)
  20. TASK1_高等数学

热门文章

  1. idea中自动生成model实体类
  2. where后面使用别名
  3. NOSQL MongoDB首席架构师唐建法:20core处理27万混合读写操作实现,并分享企业实现案例...
  4. [读书笔记] CSS权威指南1: 选择器
  5. 黑莓开发之环境的搭建
  6. 位深度、色深的区别以及图片大小的计算
  7. 迅捷PDF转PPT转换器使用教程
  8. FBI都无法破解的iOS设备也会失陷?App store 超千个APP被爆漏洞
  9. pageoffice 在线编辑 word 文档,保存之后返回自定义的值,并把值传到父页面
  10. Mac OS X 映射网络驱动器