文章目录

  • 相机标定是什么
  • 为什么要相机标定
  • 相机标定方法
  • 实验过程
    • 准备标定图片
    • 对每一张图片提取角点信息
    • 相机标定
    • 去畸变
    • 反误差投影
    • 源码
  • 总结

相机标定是什么

在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。


为什么要相机标定

进行相机标定的目的:求出相机的内、外参数,以及畸变参数。

无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。


相机标定方法

相机的标定主要有两种: 传统的摄像头标定方法和摄像头自标定方法, 典型
的有:(1)Tsai(传统的标定方法);(2)张正友(介于传统和自标定之间) 。1999
年,微软研究院的张正友提出了基于移动平面模板的相机标定方法。 此方法是介
于传统标定方法和自标定方法之间的一种方法, 传统标定方法虽然精度高设备有
较高的要求, 其操作过程也比较繁琐, 自标定方法的精度不高, 张正友标定算法
克服了这两者的缺点同时又兼备二者的优点, 因此对办公、 家庭的场合使用的桌
面视觉系统 (DVS)很适合。张正友标定方法由于简单、效果好而得到广泛使用。

张正友标定方法的主要思想是:

利用一个棋盘格标定板,在得到一张标定板的图像之后,可以利用相应的图像检测算法得到每一个角点的像素坐标(u,v)。张正友标定法将世界坐标系固定于棋盘格上,则棋盘格上任一点的物理坐标 W=0,由于标定板的世界坐标系是人为事先定义好的,标定板上每一个格子的大小是已知的,我们可以计算得到每一个角点在世界坐标系下的物理坐标(U,V,W=0)。我们将利用这些信息:每一个角点的像素坐标(u,v)、每一个角点在世界坐标系下的物理坐标(U,V,W=0),来进行相机的标定,获得相机的内外参矩阵、畸变参数。

详见:相机标定之张正友标定法数学原理详解

坐标关系图如下:

  • 世界坐标系
    世界坐标系(world coordinate)(xw,yw,zw),也称为测量坐标系,是一个三维直角坐标系,以其为基准可以描述相机和待测物体的空间位置。世界坐标系的位置可以根据实际情况自由确定。世界坐标系的最小单位为mm。

  • 图像坐标系
    图像坐标系(image coordinate)(x,y),是像平面上的二维直角坐标系。图像坐标系的原点为镜头光轴与像平面的交点(也称主点,principal point),它的x轴与相机坐标系的xc轴平行,它的y轴与相机坐标系的yc轴平行。图像坐标系的最小单位为mm。

  • 相机坐标系
    相机坐标系(camera coordinate)(xc,yc,zc),也是一个三维直角坐标系,原点位于镜头光心处,xc、yc轴分别与像面的两边平行,zc轴为镜头光轴,与像平面垂直。相机坐标系的最小单位为mm。

  • 张正友标定法的标定步骤
    1、打印一张模板并贴在一个平面上;
    2、从不同角度拍摄若干张模板图像;
    3、检测出图像中的特征点;
    4、求出摄像机的外参数(单应性矩阵)和内参数(最大似然估计) ;
    5、求出畸变系数;
    6、优化求精


实验过程

准备标定图片

标定图片需要使用标定板在不同位置、不同角度、不同姿态下拍摄。标定板需要是黑白相间的矩形构成的棋盘图。
本实验准备的图像为7×5的黑白格棋盘图,6×4个内点


对每一张图片提取角点信息

使用findChessboardCorners函数提取角点,这里的角点专指的是标定板上的内角点,这些角点与标定板的边缘不接触。FindChessboardCorners是opencv的一个函数,可以用来寻找棋盘图的内角点位置。该函数的功能是判断图像内是否包含完整的棋盘图,如果能够检测完全,就把他们的角点坐标按顺序(逐行,从左到右)记录下来,并返回非0数,否则返回0。角点检测不完全时,可能画不出图像,或者画出红色角点;正确的图像后面有参考。

提取角点可视化如下:
①m1.jpg

②m2.jpg

③m3.jpg

④m4.jpg

⑤m5.jpg

如以上系列对比图所示,均成功检测出6*4=24个角点

结果显示,在棋盘格内部无遮挡无干扰的情况下,拍照角度改变对角点检测结果影响不大


相机标定

由控制台打印输出标定结果、相机的内参数矩阵、畸变系数、旋转矩阵、平移向量:

ret、mtx、dist、rvecs、tvecs分别为标定结果、相机的内参数矩阵、畸变系数、旋转矩阵、平移向量


去畸变

我们已经得到了相机内参和畸变系数,在将图像去畸变之前,我们还可以使用cv.getOptimalNewCameraMatrix()优化内参数和畸变系数,通过设定自由自由比例因子alpha。当alpha设为0的时候,将会返回一个剪裁过的将去畸变后不想要的像素去掉的内参数和畸变系数;当alpha设为1的时候,将会返回一个包含额外黑色像素点的内参数和畸变系数,并返回一个ROI用于将其剪裁掉


反误差投影

通过反投影误差,我们可以来评估结果的好坏。越接近0,说明结果越理想。通过之前计算的内参数矩阵、畸变系数、旋转矩阵和平移向量,使用cv2.projectPoints()计算三维点到二维图像的投影,然后计算反投影得到的点与图像上检测到的点的误差,最后计算一个对于所有标定图像的平均误差,这个值就是反投影误差。

通过计算得到反投影误差为:
total error = 0.15747956749563666


源码

import cv2
import numpy as np
import glob# 找棋盘格角点
# 阈值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
#棋盘格模板规格
w = 6   #内角点个数,内角点是和其他格子连着的点
h = 4# 世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
objp = np.zeros((w*h,3), np.float32)
objp[:,:2] = np.mgrid[0:w,0:h].T.reshape(-1,2)
# 储存棋盘格角点的世界坐标和图像坐标对
objpoints = [] # 在世界坐标系中的三维点
imgpoints = [] # 在图像平面的二维点images = glob.glob('picture/*.jpg')
for fname in images:img = cv2.imread(fname)gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)ret, corners = cv2.findChessboardCorners(gray, (w,h),None)if ret == True:cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)objpoints.append(objp)imgpoints.append(corners)cv2.drawChessboardCorners(img, (w,h), corners, ret)cv2.imshow('findCorners',img)cv2.waitKey(1000)
cv2.destroyAllWindows()
#标定、去畸变
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# mtx:内参数矩阵
# dist:畸变系数
# rvecs:旋转向量 (外参数)
# tvecs :平移向量 (外参数)
print (("ret:"),ret)
print (("mtx:\n"),mtx)
print (("dist:\n"),dist)
print (("rvecs:\n"),rvecs)
print (("tvecs:\n"),tvecs)
# 去畸变
img2 = cv2.imread('picture/m2.jpg')
h,w = img2.shape[:2]
newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),0,(w,h))
dst = cv2.undistort(img2, mtx, dist, None, newcameramtx)
x,y,w,h = roi
dst = dst[y:y+h, x:x+w]
cv2.imwrite('calibresult.jpg',dst)# 反投影误差
total_error = 0
for i in range(len(objpoints)):imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)error = cv2.norm(imgpoints[i],imgpoints2, cv2.NORM_L2)/len(imgpoints2)total_error += error
print (("total error: "), total_error/len(objpoints))

总结

实验结果表明张正友的方法有很好的精度。

相机标定:确定空间物体的三维坐标相关推荐

  1. 【计算机视觉】相机标定原理(像素点与三维坐标点的转换)

    一.相机标定概述 相机标定目的 计算机视觉的任务之一:从相机获取的图像信息出发计算三维空间中物体的几何信息,并由此重建和识别物体. 相机标定内容 空间物体表面某点的三维几何位置与其在图像中对应点之间的 ...

  2. 计算机视觉-相机标定(Camera Calibration)

    1.相机标定基本原理 1.1 简介 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立摄像机成像的几何模型,这些几何模型参数就是摄像机参数 ...

  3. 基于高速相机的近地落点三维坐标测试方法

    高速相机可以捕捉到高帧率的图像序列,这使得它们非常适合用于捕获快速运动的物体,如近地落点.要使用高速相机进行近地落点的三维坐标测试,你可以采用立体视觉技术.立体视觉技术的基本原理是使用两台或多台相机从 ...

  4. 利用双目摄像头来进行空间点的三维坐标定位

    一.三维重建概述 三维重建主要是研究如何从得到的匹配点中计算出相机的投影矩阵(如果是外部标定的话,就是求出相机的外部参数)以及如何计算出匹配点的三维坐标. 目前研究的进展与之还相差较远.研究人员为了能 ...

  5. AVM环视:一.相机标定及原理

    文章目录 前言 为何进行相机标定? 相机标定本质 坐标系 一.针孔模型 前言 环视AVM的第一步即对鱼眼相机进行标定,得到相机的内参.畸变系数.本文主要介绍了相机标定及其原理.相机标定本质上为坐标系之 ...

  6. 张正友相机标定程序实现

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/hongbin_xu/article/details/78988450 前言 在前面的博客中( 三维重 ...

  7. 单、双目相机标定及其校正相关函数整理

    本文主要是对opencv单双目摄像头标定及其校正过程中用到的相关函数进行搜集整理,便于对另一片博客中的代码的理解.建议大家去opencv的官网检索原始函数定义,虽然是英文但是不妨碍使用. 1.Term ...

  8. Halcon例程(基于多个标定图的单目相机标定)详解—— Camera_calibration_multi_image.hdev

    一.前言 在我的工业相机专栏里已经将相机标定涉及到的理论部分讲解完毕,为什么要标定以及标定要求出什么参数呢,用一个Halcon 例程来帮助理解. 这个例程是比较经典的标定程序,基本将标定过程讲的比较清 ...

  9. 基于OpenCV的立体相机标定StereoCalibration与目标三维坐标定位

    说明:以下涉及到的一些公式以及图片来自于Learning OpenCV. 做了快2个月的立体相机标定,遇到了一些问题,也有了一些体会,在这里记下来. 1.在做立体相机标定的时候,标定板的规范与否直接影 ...

最新文章

  1. 24点游戏c语言链表做法,C语言实现24点程序(示例代码)
  2. springboot整合freemarker(转)
  3. HTML5与CSS3实战指南读书笔记之一些可能会有用的东西
  4. 数据库入门浅析:ASP.NET与MySQL连接
  5. 一直认为in,exists 不走索引,被同事鄙视了……
  6. Ubuntu 16.04: 开启wifi设置 How To Enable WiFi In Ubuntu 16.04
  7. Python浅谈gevent实现协程
  8. MAC中JAVA安装和环境变量设置,java 11
  9. 达梦数据库dm8使用心得
  10. 解决 Exception: ROM is missing for pong, see https://github.com/openai/atari-py#roms for instructions
  11. 一个关于意念(脑电波)的想法
  12. 这年头Windows电脑还需要杀毒软件吗?
  13. 文件名变乱码. 不知道怎么找回呢
  14. oul可以用作c语言常量吗,2016春北交《C语言程序设计(专) 》在线作业二
  15. 自动驾驶行业观察之2023上海车展-----车企发展趋势(1)
  16. es教程——地图搜索
  17. 为什么在SPD(浪涌保护器)的前端要安装后备保护器(SCB)
  18. el-input maxlength 无效
  19. 【深度学习】【ECCV2018】CornerNet及代码解读
  20. oracle面试 sql语句,oracle面试sql

热门文章

  1. Lucene 入门教程
  2. 甘特图:制定项目计划的三个要点
  3. 会员营销需要知道的6个关键
  4. 张小龙发布2018微信全新计划(内附演讲全文)
  5. Android自定义拍照实现
  6. 中资股领跌,21000再度失守
  7. 2018计算机软考分类,软考考试类别资格介绍
  8. VC GDI+ 窗口截图内存BMP转JPG,压缩、JPG再转IStream流,IStream流再转 BYTE
  9. 电影院选座问题----go
  10. 关于海康ipc的几个参数