Python opencv相机标定实现原理及步骤详解


Posted in Python onApril 09, 2020

相机标定相机标定的目的

获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像。

相机标定的输入

标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标(一般情况下假定图像位于Z=0平面上)。

相机标定的输出

摄像机的内参、外参系数。

拍摄的物体都处于三维世界坐标系中,而相机拍摄时镜头看到的是三维相机坐标系,成像时三维相机坐标系向二维图像坐标系转换。不同的镜头成像时的转换矩阵不同,同时可能引入失真,标定的作用是近似地估算出转换矩阵和失真系数。为了估算,需要知道若干点的三维世界坐标系中的坐标和二维图像坐标系中的坐标,也就是拍摄棋盘的意义。

相机成像

相机的成像原理:小孔成像

Python opencv相机标定实现原理及步骤详解

相机的内参相机的外参

在实际由于设计工艺问题、相机安装环境或物体摆放位置等影响,会照成成像与实际图像不一样的现象。

由于设计工艺照成的影响是无法改变的事实,所以这将是相机的内参;

由环境或安装方式照成的影响是可以改变的,这就是相机的外参。

张正友标定相机原理

1.求得相机内参数:

用于标定的棋盘格是特制的,其角点坐标已知。标定棋盘格是三维场景中的一个平面∏,棋盘格在成像平面为π(知道了∏与π的对应点坐标之后,可求解两个平面1对应的单应矩阵H)。

根据相机成像模型,P为标定的棋盘坐标,p为其像素点坐标。则Python opencv相机标定实现原理及步骤详解,通过对应的点坐标求解H后,可用于求K,R,T。

2.设棋盘格所在平面为世界坐标系上XOY平面,则棋盘格上任一角点P世界坐标系为(X,Y,0)。

Python opencv相机标定实现原理及步骤详解

3、内参约束条件

Python opencv相机标定实现原理及步骤详解

Python opencv相机标定实现原理及步骤详解

Python opencv相机标定实现原理及步骤详解

Python opencv相机标定实现原理及步骤详解

实验步骤打印棋盘图片(网上找一张)

Python opencv相机标定实现原理及步骤详解

将打印出的纸固定放到一个平面上,使用同一相机从不同的位置,不同的角度,拍摄标定板的多张照片(我拍了15张)手机型号是华为mate9

Python opencv相机标定实现原理及步骤详解

提取标定板的世界坐标

标定板的大小是标定板在水平和竖直方向上内角点的个数。内角点指的是,标定板上不挨着边界的角点。

我打印的是6x9的标定板。

Python opencv相机标定实现原理及步骤详解

标定相机

Python opencv相机标定实现原理及步骤详解

Python opencv相机标定实现原理及步骤详解

Python opencv相机标定实现原理及步骤详解

mtx -->内参数矩阵

dist --> 畸变系数

rvecs --> 旋转向量

tvecs --> 平移向量

我们可以通过反投影误差来评估结果的好坏,越接近0,说明结果越理想。

通过之前计算的内参数矩阵、畸变系数、旋转矩阵和平移向量,使用cv2.projectPoints()计算三维点到二维图像的投影,然后计算反投影得到的点与图像上检测到的点的误差,最后计算一个对于所有标定图像的平均误差即反投影误差

我的棋盘打印出来有些不平整,可能是打印的纸张没有放正,导致有些地方翘着,效果不是很好,误差值有些大了,把纸张贴平整应该会好很多。而且我可能拍照的角度变化不是太大,可以试着把拍照的角度更加差异些,结果会更明显。

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((6 * 9, 3), np.float32)
objp[:, :2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2) # 将世界坐标系建在标定板上,所有点的Z坐标全部为0,所以只需要赋值x和y
obj_points = [] # 存储3D点
img_points = [] # 存储2D点
images = glob.glob("E:/test_pic/qipan/*.jpg")
for fname in images:
  img = cv2.imread(fname)
  cv2.imshow('img',img)
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  size = gray.shape[::-1]
  ret, corners = cv2.findChessboardCorners(gray, (6, 9), None)
  print(ret)
  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, (8, 6), corners, ret) # 记住,OpenCV的绘制函数一般无返回值
    cv2.imshow('img', img)
    cv2.waitKey(2000)
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:\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("-----------------------------------------------------")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的批量远程管理和部署工具Fabric用法实例
Jan 23 Python
python中的错误处理
Apr 10 Python
巧用python和libnmapd,提取Nmap扫描结果
Aug 23 Python
django批量导入xml数据
Oct 16 Python
python实战教程之自动扫雷
Jul 13 Python
Python面向对象之反射/自省机制实例分析
Aug 24 Python
windows下搭建python scrapy爬虫框架步骤
Dec 23 Python
python判断一个对象是否可迭代的例子
Jul 22 Python
详解Python并发编程之创建多线程的几种方法
Aug 23 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
Apr 24 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
python动态规划算法实例详解
Nov 22 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 #Python
利用python绘制数据曲线图的实现
Apr 09 #Python
利用python生成照片墙的示例代码
Apr 09 #Python
Python 改变数组类型为uint8的实现
Apr 09 #Python
pandas 强制类型转换 df.astype实例
Apr 09 #Python
python 给图像添加透明度(alpha通道)
Apr 09 #Python
Python日志logging模块功能与用法详解
Apr 09 #Python
You might like
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
php对数组排序的简单实例
2013/12/25 PHP
PHP面相对象中的重载与重写
2017/02/13 PHP
thinkPHP5框架分页样式类完整示例
2018/09/01 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
JavaScript 解析Json字符串的性能比较分析代码
2009/12/16 Javascript
为jQuery增加join方法的实现代码
2010/11/28 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
一个jquery实现的不错的多行文字图片滚动效果
2014/09/28 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
2015/03/03 Javascript
由ReactJS的Hello world说开来
2015/07/02 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
js如何编写简单的ajax方法库
2017/08/02 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
JS 封装父页面子页面交互接口的实例代码
2019/06/25 Javascript
js实现网页版贪吃蛇游戏
2020/02/22 Javascript
如何利用Node.js与JSON搭建简单的动态服务器
2020/06/16 Javascript
如何构建一个Vue插件并生成npm包
2020/10/26 Javascript
Python isinstance判断对象类型
2008/09/06 Python
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
Python后台开发Django会话控制的实现
2019/04/15 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
在Django中自定义filter并在template中的使用详解
2020/05/19 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
2020/07/09 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
一套Delphi的笔试题二
2013/05/11 面试题
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
人事经理岗位职责范本
2014/08/04 职场文书
新农村建设汇报材料
2014/08/15 职场文书
计划生育汇报材料
2014/12/26 职场文书
2015年幼儿园后勤工作总结
2015/04/25 职场文书
费城故事观后感
2015/06/10 职场文书