(个人理解,若有错误,请不吝指出,谢谢!)

目录

前言:

一、三维空间到照片的映射原理

二、相机标定基于python的opencv

三、参考资料

前言:

摄像机为什么需要标定?

原因有二:

1.现代摄像机都是透镜摄像机,其会产生径向畸变,所以需要算法来矫正

2.制造工艺的误差会导致点对点映射的一些偏差

一、三维空间到照片的映射原理

P点为空间坐标,P'为二维图像上的点,我们使得P点为齐次坐标下的点则其坐标为[x,y,z,1],这样就形成了线性关系,P'=MP。M就称为投影矩阵,其中M中的参数皆为摄像机的内部参数值,为常数。

我们上述所用的坐标轴是o-jki,为了统一和方便描述空间点,引入了世界坐标系Ow-JwKwIw,K[I,0]即为上述M矩阵(3*4)为内部参数,此坐标系与原来的坐标系相比,是通过对其平移、旋转得到的,R和T则为旋转和平移向量,为外部参数。

有了变换关系,所以我们就可以求投影矩阵了。首先是相机的内部参数其自由度为5,旋转和平移6个自由度,一共11个未知数那么我们至少需要11个方程,则至少需要11对点。

上图,我们列出方程,把M矩阵拆为m1,m2,m3三个向量。

再将方程转化为已知矩阵和未知向量相乘的形式,由于选取的点多于11个,就造成了方程个数大于未知数的问题,会出现奇异值分解,所以会有迭代求解的过程。(具体求解目前还不太懂)

得到了M矩阵,我们现在就可以开始求内部和外部参数了。ρ为一个系数,由于经过M对应关系得到的点不是唯一的,在投影的那条线上均可,为了使其唯一对应则加入系数。

将M矩阵拆成A矩阵和b向量的样式,ρA=KR,通过点乘,叉乘,和取模等一些数学计算则可得到内参数。(俺对这些数学计算也一知半解)

同样的方法,外参数旋转向量与平移向量这些外参数,其公式及其推导如上图所示。

二、相机标定基于python的opencv

本次实验的内容是单平面棋盘格的摄像机标定方法,张正友相机标定法
本次实验使用的手机型号为:HUAWEI Mate 40E

所用棋盘如下:

拍摄照片:

代码如下:

import cv2
import numpy as np
import glob# 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001# criteria:迭代停止的模式选择,这是一个含有三个元素的元组型数。格式为(type,max_iter,epsilon)
# 其中,type又有两种选择:
# —–cv2.TERM_CRITERIA_EPS :精确度(误差)满足epsilon停止。
# —- cv2.TERM_CRITERIA_MAX_ITER:迭代次数超过max_iter停止。
# —-cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,两者合体,任意一个满足结束。criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)# 获取标定板角点的位置
# 黑白格相交的点我截的图是4*4的# 准备对象点,如(0,0,0),(1,0,0),(2,0,0)......,(6,5,0)
# objp = np.zeros((w*h,3), np.float32)objp = np.zeros((4 * 4, 3), np.float32)
# mgrid把列向量[0:cbraw]复制了cbcol列,把行向量[0:cbcol]复制了cbraw行。
# 转置后reshape
objp[:, :2] = np.mgrid[0:4, 0:4].T.reshape(-1, 2)  # 将世界坐标系建在标定板上,所有点的Z坐标全部为0,所以只需要赋值x和yobj_points = []  # 存储3D点
img_points = []  # 存储2D点images = glob.glob("data/*.jpg")
for fname in images:img = cv2.imread(fname)img = cv2.resize(img, None ,fx=0.1, fy=0.1, interpolation= cv2.INTER_CUBIC)#我的图片太大,我缩小了十倍gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow('gray', gray)size = gray.shape[::-1]print(size)# int cvFindChessboardCorners(const void * image, CvSize pattern_size, CvPoint2D32f * corners,# int * corner_count = NULL,# int flags = CV_CALIB_CB_ADAPTIVE_THRESH );# 参数说明# Image:输入的棋盘图,必须是8位的灰度或者彩色图像。# pattern_size:棋盘图中每行和每列角点的个数# Corners:检测到的角点# corner_count: 输出,角点的个数。如果不是NULL,函数将检测到的角点的个数存储于此变量。ret, corners = cv2.findChessboardCorners(gray, (4, 4), None)print(ret)# print(corners)if ret:#如果检测到角点obj_points.append(objp)#第二参数上面检测到角点的坐标# 第三个参数是计算亚像素角点时考虑的区域的大小,大小为NXN;N = (winSize * 2 + 1)。# 第四个参数作用类似于winSize,但是总是具有较小的范围,通常忽略(即Size(-1, -1))。corners2 = cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), criteria)  # 在原角点的基础上寻找亚像素角点#print(corners2)if [corners2]:img_points.append(corners2)else:img_points.append(corners)cv2.drawChessboardCorners(img, (4, 4), corners2, ret)  # OpenCV的绘制角点的函数cv2.imshow('img', img)cv2.waitKey(0)print(len(img_points))
cv2.destroyAllWindows()# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None)print("ret:", ret)#bool值
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 ) # 平移向量  # 外参数print("-----------------------------------------------------")for i in range(len(images)):img = cv2.imread(images[i])img = cv2.resize(img, None ,fx=0.1, fy=0.1, interpolation= cv2.INTER_CUBIC)h, w = img.shape[:2]newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))#显示更大范围的图片(正常重映射之后会删掉一部分图像)print (newcameramtx)#优化的相机内参# #也可以使用remap()进行标定# mapx,mapy = cv2.initUndistortRectifyMap(mtx,dist,None,newcameramtx,(w,h),5)# dst = cv2.remap(img,mapx,mapy,cv2.INTER_LINEAR)dst = cv2.undistort(img,mtx,dist,None,newcameramtx)x,y,w,h = roidst1 = dst[y:y+h,x:x+w]cv2.imwrite('calibration_data/{}.jpg'.format(i), dst1)print ("dst的大小为:", dst1.shape)

得到的内参数矩阵为:

三、参考资料

1.Python计算机视觉编程 - 第五章 多视图几何 -张正友相机标定法_柴达夫47的博客-CSDN博客

2.OpenCV学习笔记(二十一)——相机的标定_行歌er的博客-CSDN博客_cv2.undistort

3.计算机视觉之三维重建篇(精简版) 北京邮电大学 鲁鹏_哔哩哔哩_bilibili

4.老师的ppt

笔记:三维重建大作业1-相机标定相关推荐

  1. 结构光三维重建Projector-Camera Calibration投影仪相机标定

    结构光三维重建-Projector-Camera Calibration投影仪相机标定 目录 结构光三维重建-Projector-Camera Calibration投影仪相机标定 1.结构光相机标定 ...

  2. 三维重建学习(2):相机标定基础

    前言 在相机标定过程中,我们会碰到一些概念,比如:摄像机模型.世界坐标系.图像坐标系等等.为便于理解推导,所以又整理了相关的笔记,介绍的都是些比较基础的概念,也比较容易. 相机模型 针孔相机模型 注: ...

  3. 结构光三维重建之单目相机标定

    学习目标: 提示:这里可以添加学习目标 MATLAB实现相机标定 学习内容: 提示:这里可以添加要学的内容 学习产出: 1.1.1 相机标定的概念 相机标定的原理:找到合适的相机内外参数和畸变系数来使 ...

  4. 中秋福利!三维重建/SLAM/点云/相机标定/深度估计/缺陷检测课程

    人工智能渗入到越来越多领域,以计算机视觉为主的相关应用更是呈现爆发性增长,国内外资本对AI视觉兴趣只增不减,自动驾驶.工业视觉.AR/VR.测量测绘.移动机器人等领域涌现了大量独角兽公司,呈现了以3D ...

  5. 三维重建学习(3):张正友相机标定推导

    前言 前面的几篇博客中介绍了有关相机标定的基础知识(三维重建学习(1):基础知识:旋转矩阵与旋转向量.三维重建学习(2):相机标定基础).这次介绍一个十分经典的单目相机标定方法--张正友标定,并给出数 ...

  6. 【2022年第一期 CANN训练营进阶班应用课】第一次大作业

    前情提要 按照官方B站视频介绍,接收镜像,并创建云服务器:如果不想看视频,可以参照其他开发者的教程配置环境,推荐教程[CANN训练营进阶班应用课笔记]大作业1实战趟坑记录. ssh登录服务器,可以用M ...

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

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

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

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

  9. 北邮鲁鹏老师三维重建课程之相机标定

    在看北邮鲁鹏老师的三维重建的课程过程中,去官网找到有三个作业.现将三个作业里面的第一个作业相机标定完成.总体来说,可以分为三个部分,即图像坐标点和世界坐标点的获取:映射矩阵的生成,相机内外参的求解三个 ...

最新文章

  1. html中#include file的使用方法
  2. 三年 Git 使用心得 常见问题整理
  3. python画双折线图-Python Pandas 时间序列双轴折线图
  4. git pull request工作模式
  5. 【Android】解析Json数据
  6. CG-CTF-Web-GBK Injection
  7. html左侧黑色梯形状线条,html – 使用纯css左,下,左边的线条绘制动画
  8. C#遍历文件夹下所有文件
  9. SqlDependency不起作用
  10. opencv 指定分辨率_更改OpenCV视频文件的分辨率
  11. iTextSharp 列表
  12. 【职业规划】该如何选择职业方向?性能?自动化?测开?学习选择python、java?
  13. Jboss部署Springboot项目
  14. 矩阵Kronecker(克罗内克)积
  15. 加盐密码哈希:如何正确使用 (转)
  16. 小布助手,身入大千世界
  17. Win11麦克风测试在哪里?Win11测试麦克风的方法
  18. 3D人脸精准数据获取设备--(转载)
  19. 曹工2020年终总结--当我在说下一篇的时候,我在说什么(一个7年程序员的2020之旅,已上岸腾讯,欢迎找我内推)
  20. java并发编程实战wwj--------------------第二阶段------------Balking------------------29-30

热门文章

  1. 163邮箱苹果设置不成功_怎么样才能让自己服务器发出的邮件不被 Gmail、Hotmail、163、QQ 等邮箱放入垃圾箱...
  2. seo优化时网站_选择关键词的方法
  3. 利用pytesser识别简单图形验证码
  4. 【UI设计】移动设备的界面设计尺寸
  5. 基于伽马变换自适应修正的全景首尾融合算法
  6. 漏洞复现:通过CVE-2022-30190上线CS
  7. android 模拟器黑屏 Cordova多平台方案
  8. 使用nodejs(ipp和html-pdf-node)实现连接打印机后端静默打印html文件
  9. Android处理二维码扫码枪数据
  10. Android studio gradle编译失败问题汇总