文章目录

  • 1.相机标定
    • 1.1 相机标定介绍
    • 1.2 相机标定的意义
    • 1.3 相机标定方法
    • 1.4 相机标定的用途
  • 2.相机参数
    • 2.1 内参
    • 2.2 外参
    • 2.3 畸变参数
  • 3.棋盘格标定
    • 3.1 图片集
    • 3.2 harris角点检测
    • 3.3 代码实现
    • 3.4 实验结果
  • 4.实验总结

1.相机标定

1.1 相机标定介绍

相机标定指建立相机图像像素位置与场景点位置之间的关系,根据相机成像模型,由特征点在图像中坐标与世界坐标的对应关系,求解相机模型的参数。相机需要标定的模型参数包括内部参数和外部参数。
针孔相机成像原理其实就是利用投影将真实的三维世界坐标转换到二维的相机坐标上去,其模型示意图如下图所示:

从图中我们可以看出,在世界坐标中的一条直线上的点在相机上只呈现出了一个点,其中发生了非常大的变化,同时也损失和很多重要的信息,这正是我们3D重建、目标检测与识别领域的重点和难点。实际中,镜头并非理想的透视成像,带有不同程度的畸变。理论上镜头的畸变包括径向畸变和切向畸变,切向畸变影响较小,通常只考虑径向畸变。
径向畸变:径向畸变主要由镜头径向曲率产生(光线在远离透镜中心的地方比靠近中心的地方更加弯曲)。导致真实成像点向内或向外偏离理想成像点。其中畸变像点相对于理想像点沿径向向外偏移,远离中心的,称为枕形畸变;径向畸点相对于理想点沿径向向中心靠拢,称为桶状畸变。

1.2 相机标定的意义

在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数(内参、外参、畸变参数)的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。
畸变(distortion)是对直线投影(rectilinear projection)的一种偏移。简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。畸变简单来说就是一条直线投影到图片上不能保持为一条直线了,这是一种光学畸变(optical aberration),可能由于摄像机镜头的原因。

1.3 相机标定方法

1、传统相机标定
最简单的相机标定为线性标定,即不考虑相机的畸变而只考虑空间坐标转换。
每个坐标点有X,Y两个变量,可列两个方程,相机内参有5个未知数,外参平移和旋转各3个,共有11个变量,因此至少需要6个特征点来求解。
2、非线性标定
当镜头畸变明显时必须考虑畸变,一般较为便宜的网络摄像头畸变特别大,而价格较贵的工业摄像头则畸变很小,因为其中已经嵌入了许多消除畸变的程序。这时线性模型转化为非线性模型,需要通过非线性标定方法求解。有最速下降法,遗传算法,高斯牛顿法和神经网络算法等。
3、张正友标定
“张正友标定”又称“张氏标定”,是指张正友教授于1998年提出的单平面棋盘格的摄像机标定方法。张氏标定法已经作为工具箱或封装好的函数被广泛应用。张氏标定的原文为“A Flexible New Technique forCamera Calibration”。此文中所提到的方法,为相机标定提供了很大便利,并且具有很高的精度。从此标定可以不需要特殊的标定物,只需要一张打印出来的棋盘格。

1.4 相机标定的用途

  1. 相机在出厂之前都需要进行相机标定,用软件的方法校正生成的图像,避免拍摄出的图像产生桶形和枕形畸变;
  2. 根据相机成像的几何模型,将世界坐标系中的3D物体映射到2D成像平面上;
  3. 求解多个相机对之间的映射关系。

2.相机参数

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

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

2.1 内参

为什么叫内参呢,这个是因为这些参数是只有相机来决定的,不会因为外界环境而改变。
相机内部参数/内方位元素: 焦距、像主点坐标、畸变参数
相机的内参是:1/dx、1/dy、r、u0、v0、f
opencv中的内参是4个,分别为fx、fy、u0、v0。其实opencv中的fx也就是F*Sx,其中F是焦距上面的f,Sx是像素/每毫米也就是上面的1/dx。
dx和dy表示x方向和y方向的一个像素分别占多少个单位,是反映现实中的图像物理坐标关系与像素坐标系转换的关键(我理解的是可以反映像元密度)。
u0,v0代表图像的中心像素坐标和图像原点像素坐标之间相差的横向和纵向像素数。

2.2 外参

相机外部参数/外方位元素: 旋转、平移
相机的外参是6个,三个轴的旋转参数分别是(w、δ、θ),把每个轴的33旋转矩阵进行组合(矩阵之间相乘),得到集合三个轴旋转信息的R,其大小还是33;T的三个轴的平移参数(Tx、Ty、Tz)。R、T组合成3*4的矩阵,其是转换到标定纸坐标的关键。

2.3 畸变参数

畸变一般可以分为:径向畸变、切向畸变
径向畸变来自于透镜形状。
切向畸变来自于整个摄像机的组装过程。
畸变还有其他类型的畸变,但是没有径向畸变、切向畸变显著,所以忽略不计。

畸变参数是:k1,k2,k3径向畸变,p1,p2是切向畸变系数。径向畸变发生在相机坐标系转像物理坐标系的过程中。
切向畸变:产生的原因是透镜不完全平行于图像。

3.棋盘格标定

优点:

  1. 只需一个平面
  2. 标定过程中无需知道棋盘格的方位
  3. 大量开源代码

3.1 图片集

准备了下面10张棋盘格图片,手机型号为vivo 9X

3.2 harris角点检测








3.3 代码实现

import cv2
import numpy as np
import glob
#coding=utf-8criteria = (cv2.TERM_CRITERIA_MAX_ITER | cv2.TERM_CRITERIA_EPS, 30, 0.001)objp = np.zeros((6 * 6, 3), np.float32)
objp[:, :2] = np.mgrid[0:6, 0:6].T.reshape(-1, 2)obj_points = []
img_points = []images = glob.glob(r"F:\Pictures\one\*.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, (6, 6), None)#print(corners)if ret:obj_points.append(objp)corners2 = cv2.cornerSubPix(gray, corners, (6, 6), (-1, -1), criteria)#print(corners2)if [corners2]:img_points.append(corners2)else:img_points.append(corners)cv2.drawChessboardCorners(img, (6, 6), corners, ret)i+=1cv2.imwrite('conimg'+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:\n", mtx)
print("dist:\n", dist)
print("rvecs:\n", rvecs)
print("tvecs:\n", 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(r'F:\Pictures\one\1.jpg', dst1)
print ("dst:", dst1.shape)

3.4 实验结果


在该实验结果中,mtx为相机内参数,dist为畸变参数。所有图像投影坐标和亚像素角点坐标之间的总体的平均误差大概为0.27,误差较小,标定结果还可以。

在该实验结果中,rvecs为旋转向量 ,tvecs为平移向量,二者都是外参数。

4.实验总结

棋盘格的标定步骤大概可归纳为:
1、取材:打印一张棋盘格,把它贴在一个平面上,作为标定物,通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片。
2、从照片中提取棋盘格角点。
3、估算理想无畸变的情况下,五个内参和五个畸变参数。
4、应用最小二乘法估算实际存在径向畸变下的畸变系数。
5、极大似然法,优化估计,提升估计精度。

遇到的问题:

解决方法:
将15行zoros(6 * 6,1)改为(6 * 6,3),3表示三维坐标中的标定

相机标定与棋盘格标定相关推荐

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

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

  2. matlab棋盘格标定角点,相机标定(Camera calibration)Matlab——棋盘格标定原理,流程...

    计算机视觉----相机标定 相机标定概念:图像测量过程以及计算器视觉中,为确定空间物体某点的三维几何关系位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,模型的参数就是相机的参数.求解 ...

  3. 基于python的opencv相机标定(采用黑白棋盘格标定板)

    基于python的相机标定(采用黑白棋盘格图片) 系列文章目录 [第一章 基于python的相机标定(采用黑白棋盘格图片)](https://blog.csdn.net/HWHXXX/article/ ...

  4. 制作OpenCV相机标定板棋盘格图像

    一,OpenCV 相机标定中棋盘格图像要点 1,棋盘格的内部交点个数boardSize:水平方向(board_width, -w=4)和垂直方向(board_height, -h=5) 个人建议:棋盘 ...

  5. 计算机视觉——棋盘格标定法获取相机内参外参

    计算机视觉--棋盘格标定法获取相机内参外参 一.原理 相机标定目的 相机标定的输入 相机标定的输出 相机标定策略 相机拍摄图像变换过程 相机内参 相机外参 二.环境 三.数据集 四.运行结果与分析 角 ...

  6. 【OpenCV】OpenCV-Python实现相机标定+利用棋盘格相对位姿估计

    写在前面: 这次要实现的功能:实时检测棋盘格相对于摄像头的距离以及位姿.为此主要步骤可分为以下三个步骤:标定图片的拍摄.相机的标定.以及棋盘格位姿的实时解算. 目录 1. 标定图片的拍摄 2. 相机的 ...

  7. 利用opencv棋盘格标定法对鱼眼图像校正分析

    利用opencv棋盘格标定法对鱼眼图像校正分析 一.开发环境 PC端.vs2013+opencv3.0.摄像头为淘宝购置的鱼眼摄像头外设+iphone6 二.镜头标定 1.  输入畸变的棋盘格图以及棋 ...

  8. opencv c++实现棋盘格标定

    程序流程 准备好一系列用来相机标定的图片: 对每张图片提取角点信息: 由于角点信息不够精确,进一步提取亚像素角点信息: 在图片中画出提取出的角点: 相机标定: 对标定结果评价,计算误差: 使用标定结果 ...

  9. D435i相机标定(不同标定方法总结)

    一.张正友标定法用Matlab实现相机标定 棋盘格规格:390 :12X9 角点数:11X8 方格尺寸:20mm 二.kalibr标定 2.1安装应用包 2.1.1 Ceres-Solver安装 gi ...

最新文章

  1. spring cloud微服务分布式云架构--hystrix的使用
  2. VC中TXT文件的存取
  3. 升级office SP3一定要小心!
  4. C++ 双向链表的建立与遍历
  5. 从Windows 2012标准版升级到数据中心版
  6. mysql-ubuntu卸载安装mysql
  7. 你会用while(1)还是for(;;)写循环代码?
  8. java被放弃了_为什么学Java那么容易放弃?
  9. [转载] 微服务安全和治理
  10. 原创 | 一文了解那些和Spring Bean有关的那些注解!
  11. Apache NIO 框架 Mina 使用中出现 too many open files 有关...
  12. Kafka : FileNotFoundException索引文件丢失 xxx.index (No such file or directory)
  13. ElasticSearch学习(二):ElasticSearch下载与运行
  14. 双二极管(BAT54S)在电路中起什么作用? 钳位和保护
  15. String的getBytes()方法
  16. 一文了解大厂的DDD领域驱动设计
  17. 人工智能如何影响5G网络标准?
  18. 杨氏双缝干涉实验与薛定谔的猫
  19. 使用python计算三角形面积
  20. 快改密码!Struts2漏洞引爆网站“泄密门”

热门文章

  1. Mac 此账户尚未用于app store_App Store调整频繁!游戏App下架数量再次增加! | 8月推广报告...
  2. 如何统一设置或者修改Excel表格中图表样式
  3. 离谱的bug564v*/92ray
  4. 基于Python统计红楼梦中人物信息
  5. word 添加批注 标题向右移动 解决方法
  6. 别人学到失眠,而你看书就犯困?这样提神让你赶走疲惫!
  7. 达摩院 | DAMO-YOLO:兼顾速度与精度的新目标检测框架
  8. Redmine3.3.3 搭建与不完全填坑指南
  9. The Preliminary Contest for ICPC Asia Shanghai 2019 BDL
  10. 2022-2028年全球与中国军用浮桥行业深度分析