文章目录

  • 一、针孔相机模型
  • 二、相机标定
  • 线性回归
  • 非线性优化
  • 标定过程
  • 三、实验过程

一、针孔相机模型



像主点偏移:

畸变现象:
图像径向畸变
– 透镜质量原因
– 光线在远离透镜中心的地方比靠近中心的地方更加弯曲




两个相机参数:

标定应用:三维重建与定位

二、相机标定

• 同步标定内部参数和外部参数,一般包括两种策略s:

  1. 光学标定: 利用已知的几何信息(如定长棋盘格)实现参数求解。
  2. 自标定: 在静态场景中利用 structure from motion估算参数。

线性回归


通过空间中已知坐标的(特征)点(Xi,Y i,Zi),以及它们在图像中的对应坐标 (ui,vi),直接估算 11 个待求解的内部和外部参数

•优点:
–所有的相机参数集中在一个矩阵中,便于求解
–通过矩阵可以直接描述世界坐标中的三维点,到二维图像平面中点的映射关系。
•缺点:
–无法直接得知具体的内参数和外参数
–求解出的11个未知量,比待标定参数(9个)更多。带来了参数不独立/相关的问题
–对噪声/误差敏感
–高精度的标定板难以制作

非线性优化

• 特征点投影方程:



相应求解策略: 牛顿方法、高斯-牛顿方法、Levenberg-Marquardt算法等

标定过程

  1. 打印一张棋盘格A4纸张(黑白间距已知),并贴在一个平板上
  2. 针对棋盘格拍摄若干张图片(一般10-20张)
  3. 在图片中检测特征点(Harris角点)
  4. 根据角点位置信息及图像中的坐标,求解Homographic矩阵
  5. 利用解析解估算方法计算出5个内部参数,以及6个外部参数
  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))

使用MATLAB工具箱进行标定

计算机视觉-实验四(相机模型与参数标定)相关推荐

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

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

  2. python计算机视觉- 相机模型与参数标定

    文章目录 相机投影模型 针孔相机模型 像主点偏移 内参矩阵 畸变现象 畸变矫正 外参矩阵 两类参数 相机标定 线性回归 (最小二乘) 非线性优化 标定过程 实验过程 MATLAB进行标定 相机投影模型 ...

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

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

  4. 机器视觉——单目相机模型(坐标标定以及去畸变)

    单目相机模型: 针孔相机模型的映射关系: 化为矩阵形式: 其中,中间的矩阵被称为相机的内参矩阵K.通常认为,相机的内参在出厂之后是固定的,不会在使用过程中发生变化.有点相机生产厂商会告诉你相机的内参, ...

  5. 计算机视觉——实验四-全景图像拼接

    一.创建全景图 同一位置(即图像的照相机位置相同)拍摄的两幅或者多幅图像是单应性相关的.         我们经常使用该约束将很多图像缝补起来,拼成一个大的图像来创建全景图. 1.图像拼接整体流程 根 ...

  6. 相机模型(内参数,外参数)

    相机成像的过程实际是将真实的三维空间中的三维点映射到成像平面(二维空间)过程,可以简单的使用小孔成像模型来描述该过程,以了解成像过程中三维空间到二位图像空间的变换过程. 本文包含两部分内容,首先介绍小 ...

  7. 相机模型-鱼眼模型/鱼眼镜头标定基本原理及实现(2)

    问题: 1 广角/超广角与鱼眼摄像机,角度界限 2 畸变模型中radtan畸变模型与鱼眼畸变模型在小于150范围是否都时能适用.   (同数据,拟合模型不同,,参数结果不同,不欠拟合和过拟合就可) 3 ...

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

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

  9. 传统图像处理之相机模型

    博主简介 博主是一名大二学生,主攻人工智能研究.感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c++,Python,爬虫等方面知识的分享. 如果有需要的小伙伴可以关注博主,博主会继续更新 ...

  10. 广州大学计算机视觉实验一:图像处理入门

    相关资料 广州大学计算机视觉实验一:图像处理入门 广州大学计算机视觉实验二:摄像机几何 广州大学计算机视觉实验三:图像滤波 广州大学计算机视觉实验四:图像分割 广州大学计算机视觉实验五:简易数字识别 ...

最新文章

  1. MATLAB_no.3:关于车牌的.
  2. php5.3.8添加eaccelerator扩展 加速php代码执行效率
  3. 如何检测图像中的条纹_图像增强模块在检测中的应用实例
  4. skimage.io.imread(), Image.open() 以及 cv2.imread()的区别
  5. Linux shell编程:状态变量
  6. ArcGIS License启动无响应
  7. plan explorer mysql_plan explorer支持oracle吗
  8. PHP笔记-打印99乘法表例子
  9. 构建之法----软件工程简介
  10. reload maven project' has encountered a proble 问题
  11. arm linux驱动 知乎_Linux初级驱动-字符设备驱动-点亮LED
  12. C++设计模式之Singleton模式(单例模式)
  13. gpt2 代码自动补全_如果您认为GPT-3使编码器过时,则您可能不编写代码
  14. Android选项卡TabHost功能和用法
  15. 计算机网络基础知识点总结
  16. 软件测试之如何介绍自己的项目
  17. 如何配置一台电脑。(一次解决电脑基础知识和如何选择合适电脑)
  18. 机器学习入门实战加州房价预测
  19. networkx igraph相互转换+效率比较
  20. MATLAB中图像邻域处理

热门文章

  1. 2020 年 4 月使用 Aria2 加速下载百度网盘文件
  2. linux注册浏览器协议,在Linux系统上安装Beaker浏览器的方法
  3. mysql菜单表设计_多级联动菜单的数据库表如何设计?
  4. exe文件更换图标方法
  5. 哪款投影仪做家庭影院效果好?家用投影仪哪个好
  6. Chrome 中的自动播放策略如何设置自动播放
  7. 【prometheus+alertmanager告警管理】
  8. shell脚本的错误检测总结
  9. Java内存泄漏检测工具 JRockit Memory Leak Detector
  10. 软件测试时如何检测内存,如何进行内存检测?内存检测的功能使用方法介绍