python实现张正友棋盘格标定法
文章目录
- 1.原理
- 1.1相机的内参数
- 1.2张氏标定法
- 1.3切向畸变与径向畸变
- 2.环境与代码
- 2.1棋盘环境
- 2.2图片选取
- 2.3代码
- 3.实验结果与分析
- 3.1角点检测结果
- 3.2内参结果截图
- 3.3外参结果截图
- 3.4小结
- 4.遇到的问题及解决方法
1.原理
**
1.1相机的内参数
**
设P=(X,Y,Z)为场景中的一点,在针孔相机模型中,其要经过以下几个变换,最终变为二维图像上的像点p=(μ,ν):
将P从世界坐标系通过刚体变换(旋转和平移)变换到相机坐标系,这个变换过程使用的是相机间的相对位姿,也就是相机的外参数。
从相机坐标系,通过透视投影变换到相机的成像平面上的像点p=(x,y)。
将像点p从成像坐标系,通过缩放和平移变换到像素坐标系上点p=(μ,ν)。
相机将场景中的三维点变换为图像中的二维点,也就是各个坐标系变换的组合,可将上面的变换过程整理为矩阵相乘的形式:
将矩阵K称为相机的内参数,
其中,α,β表示图像上单位距离上像素的个数,则fx=αf,fy=βf将相机的焦距f变换为在x,y方向上像素度量表示。
另外,为了不失一般性,可以在相机的内参矩阵上添加一个扭曲参数γ,该参数用来表示像素坐标系两个坐标轴的扭曲。则内参数K变为
最后可以得到相机的各个内参数:
1.2张氏标定法
1.准备标定图片
2.对每一张标定图片,提取角点信息
3.对每一张标定图片,进一步提取亚像素角点信息
4.在棋盘标定图上绘制找到的内角点(非必须,仅为了显示)
5.相机标定
6.对标定结果进行评价
7.查看标定效果——利用标定结果对棋盘图进行矫正
1.3切向畸变与径向畸变
径向畸变:这是由于透镜先天条件原因(透镜形状),成像仪中心(光学中心)的畸变为0,随着向边缘移动,畸变越厉害。这里有3个参数,k1,k2,k3其中k3是可选参数。
切向畸变:这是摄像机安装过程造成的,如当透镜不完全平行于图像平面的时候产生的。
如何消除径向畸变呢?
在小孔模型中,一条指向在成像平面上的像仍然是直线。但是在实际拍摄的过程中,由于透镜的存在,往往将一条直线投影成了曲线,越靠近图像的边缘,这种现象越明显。透镜往往是中心对称的,使得这种不规则的畸变通常是径向对称的。主要有两大类:桶形畸变和枕形畸变。如下图
2.环境与代码
2.1棋盘环境
运行环境:pyhton2.7、pycharm编译器
测试条件:手机拍照(图像16张)、手机型号华为P30
2.2图片选取
1.制作标定使用标定板。
2.可以将其打印下来固定到一张平板上就是标定使用的标定板,也可以投放到平板上选一个光线较暗不会有倒影的环境进行对平板进行拍摄。 使用同一相机从不同的位置,不同的角度,不同的姿态,拍摄标定板的多张照片(10-20张,这里选用了12张)
2.3代码
# coding=utf-8
import cv2
import numpy as np
import glob# 设置寻找亚像素角点的参数,采用的停止准则是最大循环次数30和最大误差容限0.001
criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)# 获取标定板角点的位置
objp = np.zeros((7 * 7, 3), np.float32)
objp[:, :2] = np.mgrid[0:7, 0:7].T.reshape(-1, 2) # 将世界坐标系建在标定板上,所有点的Z坐标全部为0,所以只需要赋值x和yobj_points = [] # 存储3D点
img_points = [] # 存储2D点images = glob.glob("C:\Python\Pictrue\qipan/*.jpg")
i=0
for fname in images:img = cv2.imread(fname)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)size = gray.shape[::-1]ret, corners = cv2.findChessboardCorners(gray, (7, 7), None)#print(corners)if ret:obj_points.append(objp)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, (7, 7), corners, ret) # 记住,OpenCV的绘制函数一般无返回值i+=1cv2.imwrite('qipan'+str(i)+'.jpg', img)cv2.waitKey(1500)print(len(img_points))
cv2.destroyAllWindows()# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, size, None, None)print("ret:", ret)
print("mtx:", mtx) # 内参数矩阵
print("dist:", dist) # 畸变系数 distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
print("rvecs:", rvecs) # 旋转向量 # 外参数
print("tvecs:", tvecs ) # 平移向量 # 外参数print("-----------------------------------------------------")img = cv2.imread(images[2])
h, w = img.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),1,(w,h))#显示更大范围的图片(正常重映射之后会删掉一部分图像)
print (newcameramtx)
print("------------------使用undistort函数-------------------")
dst = cv2.undistort(img,mtx,dist,None,newcameramtx)
x,y,w,h = roi
dst1 = dst[y:y+h,x:x+w]
cv2.imwrite('calibresult3.jpg', dst1)
print ("方法一:dst的大小为:", dst1.shape)
3.实验结果与分析
3.1角点检测结果
3.2内参结果截图
由结果可得华为P30后置摄像头的参数矩阵为:
3.3外参结果截图
3.3.1旋转向量
3.3.2平移向量
3.4小结
3.4.1
一般情况下,需要把打印的棋盘纸张平整的放在板子上,拍出来的照片和显示图像及物理点和世界点存在的误差才会很理想,所以我选择将图片在平板中显示,找一个光线较暗不会造成拍摄反光的地方对平板中的图片进行拍摄,就可以有力的减小误差。
3.4.2
通过反投影误差,我们可以来评估结果的好坏,越接近0,说明结果越理想。通过之前计算的内参数矩阵、畸变系数、旋转矩阵和平移向量,使用cv2.projectPoints()计算三维点到二维图像的投影,然后计算反投影得到的点与图像上检测到的点的误差,最后计算一个对于所有标定图像的平均误差即反投影误差。我的反投影误差求出来是0.1282,属于比较小的误差,由此可见手机拍照性能较优。
3.4.3
选取其中的一张图尝试进行(图片如下),在校准前右下角有一定的畸变,而校准后的图片得到了明显的改善。
4.遇到的问题及解决方法
4.1cv2.error3334
在修改了棋盘格为横纵格大小一致后不再报错
python实现张正友棋盘格标定法相关推荐
- 【计算机视觉】张正友棋盘格标定法
目录 前言 环境 (一)实验原理/步骤 1.计算单应性矩阵H 2.计算内参数矩阵 3.计算外参数矩阵 4.最大似然估计 (二)实验代码 (三)实验结果分析 (四)实验总结 前言 "张正友标定 ...
- 计算机视觉——张正友棋盘格标定法
文章目录 环境 前言 一.实验原理 1.相机标定 2.张正友标定法 3.步骤 二.实验过程 1.实验步骤 2.结果展示 3.分析 三.问题和总结 环境 win10,64位,python2.7,编译器: ...
- python棋盘格_python实现张正友棋盘格标定法
文章目录1.原理1.1相机的内参数1.2张氏标定法1.3切向畸变与径向畸变2.环境与代码2.1棋盘环境2.2图片选取2.3代码3.实验结果与分析3.1角点检测结果3.2内参结果截图3.3外参结果截图3 ...
- 相机标定——张正友棋盘格标定法
目录 为什么需要相机标定? 相机标定可以做什么? 相机标定后可以得到什么? 什么情况下需要借助相机标定的方法? 相机标定的原理 实现相机标定的方法 为什么需要相机标定? 一个是由于每个镜头的在生产和组 ...
- 深入理解张正友相机标定法:数学理论详细推导
最近在项目中需要在激光雷达(Lidar)和相机(Camera)之间进行标定,即需要标定出相机内参和外参,使用的标定方法是张正友标定法,这里给出其数学理论推导过程. 论文原文:<A Flexibl ...
- [毕设系列] 一、张正友相机标定
张正友相机标定 预备知识 0.1 刚体.仿射.线性.旋转变换 0.2 什么是标定? 0.3 为什么要进行标定? 0.4 什么是畸变? 一.张正友标定法 1.1 简介 1.2 流程 1.3 畸变公式 二 ...
- 基于亚像素的图像测量仪标定算法(满视场棋盘格,张正友标定法)
图像测量仪对测量的精度极高,能达到0.001毫米,所有的图像边缘分割和摄像头标定,都在亚像素级水平上进行.目前我们能做到1/100个像素的提取.图像测量仪的关键部分在于亚像素分割.亚像素分割算法各种各 ...
- 工业相机标定(张正友标定法)
目录 相机标定的概念 a. 相机标定的定义 b. 相机标定的目的 相机标定的过程 a. 标定板选择 b. 标定板摆放及拍摄 c. 标定板角点提取 张正友标定法 a. 反解相机矩阵 b.反解畸变系数 使 ...
- 张正友标定法:A Flexible New Technique for Camera Calibration
张正友标定法:A Flexible New Technique for Camera Calibration Abstract MOTIVATIONS BASIC EQUATIONS Notation ...
最新文章
- .gitignore文件如何编写?
- 链表节点合并排序:数组和单链表
- Java客户端访问HBase集群解决方案(优化)
- 数字后端——物理单元介绍
- 从零开始学习jQuery (九) jQuery工具函数 【转】
- .net2.0 orm_Java 8:深入研究速度3.0.1“森林”流ORM
- [scikit-learn 机器学习] 7. 朴素贝叶斯
- 原生JS操作DOM对象
- 飞鱼crm接口,有没获取用户信息的接口和获取客户跟进信息的接口?是不是需要申请接口,等客服反馈。文档接口都看完了,没发现需要的接口信息!
- paypal如何支付欧元_paypal欧元付款的问题
- 实战演习(四)——网络流量系统分析简介
- 2018蚂蚁金服Java开发实习生一面面经
- welearn考试切屏会有显示吗_welearn随行课堂班级测试答案
- 移动APP云测试平台测评分析
- xp系统dns服务器异常请稍后再试,xp系统网页“无法解析服务器的dns地址”的详细办法...
- 1556 Color the ball
- Vue开发环境搭建和vue-cli脚手架
- java连接MQTT服务器(Springboot整合MQTT)
- 【渝粤教育】国家开放大学2018年春季 7067-21T (1)康复护理学 参考试题
- PHP+Mysql如何实现数据库增删改查