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中的字典容器
Apr 14 Python
python中的闭包用法实例详解
May 05 Python
基python实现多线程网页爬虫
Sep 06 Python
浅谈Python数据类型判断及列表脚本操作
Nov 04 Python
Python 基础之字符串string详解及实例
Apr 01 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
使用python的pandas库读取csv文件保存至mysql数据库
Aug 20 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
Oct 09 Python
python学习--使用QQ邮箱发送邮件代码实例
Apr 16 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
Apr 27 Python
python实现网站微信登录的示例代码
Sep 18 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
Jun 04 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开发者的10个技巧
2011/02/25 PHP
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
yii2 数据库读写分离配置示例
2017/02/10 PHP
PHP Ajax跨域问题解决方案代码实例
2020/08/01 PHP
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
2015/03/24 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
2015/08/07 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
Angular.js与node.js项目里用cookie校验账户登录详解
2017/02/22 Javascript
vue上传图片组件编写代码
2017/07/26 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
2020/11/05 Javascript
[03:58]2014DOTA2国际邀请赛 龙宝赛后解密DK获胜之道
2014/07/14 DOTA
Python版的文曲星猜数字游戏代码
2013/09/02 Python
pycharm 使用心得(二)设置字体大小
2014/06/05 Python
python实现的简单RPG游戏流程实例
2015/06/28 Python
Linux 下 Python 实现按任意键退出的实现方法
2016/09/25 Python
在Django同1个页面中的多表单处理详解
2017/01/25 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
Python实现注册、登录小程序功能
2018/09/21 Python
python实现多进程代码示例
2018/10/31 Python
python读取txt文件并取其某一列数据的示例
2019/02/19 Python
django的settings中设置中文支持的实现
2019/04/28 Python
详解mac python+selenium+Chrome 简单案例
2019/11/08 Python
使用Python实现Wake On Lan远程开机功能
2020/01/22 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
2020/02/07 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
初一家长会邀请函
2014/01/31 职场文书
加强作风建设工作总结
2014/10/23 职场文书
房地产工程部经理岗位职责
2015/04/09 职场文书
python入门学习关于for else的特殊特性讲解
2021/11/20 Python