python计算机视觉- 相机模型与参数标定
文章目录
- 相机投影模型
- 针孔相机模型
- 像主点偏移
- 内参矩阵
- 畸变现象
- 畸变矫正
- 外参矩阵
- 两类参数
- 相机标定
- 线性回归 (最小二乘)
- 非线性优化
- 标定过程
- 实验过程
- MATLAB进行标定
相机投影模型
针孔相机模型
针孔照相机模型是计算机视觉中广泛使用的照相机模型。该照相机从一个小孔采集射到暗箱内部的光线,在针孔照相机模型中,在光线投影到图像平面之前,从唯一一个点经过,即照相机中心C。如下图所示:
据x=fXZx=\frac{fX}{Z}x=ZfX以及y=fYZy=\frac{fY}{Z}y=ZfY可推出:
像主点偏移
内参矩阵
畸变现象
- 图像径向畸变
透镜质量原因
光线在远离透镜中心的地方比靠近中心的地方更加弯曲 - 桶状畸变
- 枕形畸变
畸变矫正
外参矩阵
两类参数
- 相机内部参数/内方位元素: 焦距、像主点坐标、畸
变参数 - 相机外部参数/外方位元素: 旋转、平移
相机标定
- 同步标定内部参数和外部参数,一般包括两种策
略:
- 光学标定: 利用已知的几何信息(如定长棋盘格)实
现参数求解。 - 自标定: 在静态场景中利用 structure from
motion估算参数。
线性回归 (最小二乘)
- 优点:
所有的相机参数集中在一个矩阵中,便于求解
通过矩阵可以直接描述世界坐标中的三维点,到二维图像平面中点的映射关系。 - 缺点:
无法直接得知具体的内参数和外参数
求解出的11个未知量,比待标定参数(9个)更多。带来了参数不独立/相关的问题
对噪声/误差敏感
高精度的标定板难以制作
非线性优化
用概率的视角去看最小二乘问题
• 特征点投影方程:
• 给定{(ui,vi)},标定参数矩阵 M 的似然函数为:
• 给定{(ui,vi)},标定参数矩阵 M 似然函数的对数为:
相应求解策略: 牛顿方法、高斯-牛顿方法、Levenberg-Marquardt算法等
标定过程
- 打印一张棋盘格A4纸张(黑白间距已知),并贴在一个平板上
- 针对棋盘格拍摄若干张图片(一般10-20张)
- 在图片中检测特征点(Harris角点)
- 根据角点位置信息及图像中的坐标,求解Homographic矩阵
- 利用解析解估算方法计算出5个内部参数,以及6个外部参数
- 根据极大似然估计策略,设计优化目标并实现参数的refinement
相机标定优点:
• 仅需要平面标定板,拍摄若干张图片
• 标定板中的模式十分灵活,可以是棋盘格,也可以是其他几何结构已知的图形
• 实验结果表明具有很好的标定精度
• 具有很强的灵活性
实验过程
具体代码:
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('./camerapic/*.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.imwrite('corner.jpg',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('./camerapic/12.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('cameraresult.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))
在上述代码中,要根据实际棋盘格大小对w,h进行修改。
角点检测结果:
重投影误差:
内参矩阵:
畸变系数:
外部参数:
- 旋转向量:
rvecs:(array([[-0.53751538],[-0.27349341],[-1.50241459]]), array([[-0.5302993 ],[ 0.33237322],[ 1.48401626]]), array([[0.08588183],[0.36752958],[1.56637276]]), array([[-0.29483233],[-0.13898612],[ 1.65743176]]), array([[-0.15481409],[-0.23173761],[ 1.58424361]]), array([[-0.38077198],[-0.23630795],[-1.61963336]]), array([[-0.06514084],[-0.4745765 ],[-1.6579657 ]]), array([[-0.5965594 ],[-0.12665278],[-0.04111309]]), array([[-1.04189225],[-0.20493687],[-0.0993469 ]]), array([[-0.65034096],[ 0.52544057],[ 1.5196254 ]]), array([[-0.59853968],[ 0.44154684],[ 1.43108717]]), array([[-0.50919899],[ 0.27562852],[ 1.48795902]]), array([[-0.50340326],[ 0.23135469],[ 1.49072473]]), array([[-0.81105537],[-0.51656905],[-1.38415545]]), array([[-0.55954844],[-0.36797778],[-1.44723869]]), array([[-0.23832677],[-0.10963373],[-1.54632327]]), array([[ 0.1900795 ],[-0.91458788],[-2.99245331]]))
- 平移向量:
tvecs:(array([[-3.78627999],[ 4.10406551],[16.17246088]]), array([[ 2.73704475],[-4.85252413],[21.55524262]]), array([[ 3.75185182],[-4.19235299],[17.0177269 ]]), array([[ 4.42589014],[-2.62115354],[20.53702283]]), array([[ 4.40443606],[-4.07921583],[20.53349159]]), array([[-4.88768598],[ 4.99617116],[19.13016927]]), array([[-5.95585207],[ 4.87125293],[15.35060197]]), array([[-9.57964448],[ 0.07111093],[24.23082017]]), array([[-9.45676579],[ 4.81349824],[21.23485356]]), array([[ 4.91589789],[-6.65930971],[21.02923743]]), array([[ 3.09430201],[-5.78925973],[20.92347233]]), array([[ 2.70764752],[-6.49958949],[20.39641733]]), array([[ 2.4584561 ],[-5.0849619 ],[20.91293371]]), array([[-2.73430696],[ 3.46792206],[14.36343795]]), array([[-3.80156349],[ 1.99915271],[15.60973349]]), array([[-4.39262479],[ 2.84919034],[18.16028186]]), array([[ 2.12616603],[ 8.30914049],[15.52773437]]))
反投影误差:
畸变矫正:
原图:
校正后的图:
MATLAB进行标定
python计算机视觉- 相机模型与参数标定相关推荐
- 计算机视觉:相机模型与参数标定
目录 一.针孔照相机模型 1.像主点偏移 2.内参矩阵 3.畸变现象 4.畸变校正 二.照相机标定 1.标定原理 2.实验流程 三.代码实现(python+opencv) 1.数据准备 2.代码实现 ...
- 计算机视觉学习6_棋盘格_相机模型与参数标定
文章目录 为什么要进行相机参数标定 相机内参矩阵原理 相机标定方法--Recap: 相机标定 张正友标定法 相机模型 计算单应性矩阵H 计算内参数矩阵 计算外部参数 实验(matlab实现) 为什么要 ...
- Python计算机视觉——照相机模型与增强现实
Python计算机视觉--照相机模型与增强现实 文章目录 Python计算机视觉--照相机模型与增强现实 1 针孔照相机模型 1.1 照相机矩阵 1.2 三维点的投影 1.3 照相机矩阵的分解 1.4 ...
- 机器视觉——单目相机模型(坐标标定以及去畸变)
单目相机模型: 针孔相机模型的映射关系: 化为矩阵形式: 其中,中间的矩阵被称为相机的内参矩阵K.通常认为,相机的内参在出厂之后是固定的,不会在使用过程中发生变化.有点相机生产厂商会告诉你相机的内参, ...
- 摄影测量与计算机视觉--相机模型与成像几何
前言 总体而言,摄影测量与计算机视觉在相机模型和成像几何上有许多的共通之处,尤其是在CCD/CMOS普及之后两者的差别逐渐变小.然而由于摄影测量发源于胶片相机时代并且摄影测量通常是俯视拍摄(即利用航空 ...
- 计算机视觉----相机标定模型
简介 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.相机标定简介 二.张友正黑白棋盘标定 1.思想 2.原理 3.模型求解 三.实验内容及过程 3.1 实验要求 ...
- Python计算机视觉之相机标定
目录 一.介绍 1.1 概念 1.2 目的 1.3 意义 二.图像畸变 2.1 概念 2.2 常见问题 2.3 常见类型 2.4 影响因素 三.方法 3.1 传统相机标定法 3.2 相机自标定法 3. ...
- 相机模型(内参数,外参数)
相机成像的过程实际是将真实的三维空间中的三维点映射到成像平面(二维空间)过程,可以简单的使用小孔成像模型来描述该过程,以了解成像过程中三维空间到二位图像空间的变换过程. 本文包含两部分内容,首先介绍小 ...
- 计算机视觉——相机标定
一.相机标定简介 相机标定指建立相机图像像素位置与场景点位置之间的关系,根据相机成像模型,由特征点在图像中坐标与世界坐标的对应关系,求解相机模型的参数.相机需要标定的模型参数包括内部参数和外部参数. ...
最新文章
- ActiveMQ组件使用方法
- golang中的os包
- NodeJs Express 4.x 入门
- 初识Mysql(part10)--我需要知道的5种聚集函数
- 访存优化_Hibernate事实:多级访存
- java 绘图球的移动_求助在JFrame上绘制移动的小球
- CSS 分组 和 嵌套 选择器
- asp.net 2.0中加密web.config
- POJ 2479 Maximum sum
- Windows上 IE10 最快,Mac上Chrome 19最快
- Linux epoll模型详解及源码分析
- 使用信号量机制解决家庭吃水果问题。
- ignite配置文件编写
- 数据库表文档生成工具screw (螺丝钉)
- plsql能连mysql吗_明星就连拍结婚证件照,也能玩儿出花吗?
- 人机交互_学习总结(理论部分)
- 类似蒲公英的APP打包发布平台
- 百度地图 - 添加区划覆盖物 - 循环打点
- win7和ubuntu实现相互复制粘贴文件
- 【收集】巴厘岛自助游攻略