计算机视觉——相机参数标定

1、相机标定法原理

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

一般来说,标定的过程分为两个部分:

第一步:从世界坐标系转换为相机坐标系,这一步是三维点到三维点的转换,包括 R,t (相机外参)等参数;

第二步:从相机坐标系转为图像坐标系,这一步是三维点到二维点的转换,包括 K(相机内参)等参数;

针孔相机成像原理其实就是利用投影将真实的三维世界坐标转换到二维的相机坐标上去,其模型示意图如下图所示:

从图中我们可以看出,在世界坐标中的一条直线上的点在相机上只呈现出了一个点,其中发生了非常大的变化,同时也损失和很多重要的信息,这正是我们3D重建、目标检测与识别领域的重点和难点。

2、相机标定的意义

  • 在机器视觉领域,相机的标定是一个关键的环节,它决定了机器视觉系统能否有效的定位,能否有效的计算目标物。
  • 相机的标定基本上可以分为两种:

第一种是相机的自标定;是相机拍摄周围物体,通过数字图像处理的方法和相关的几何计算得到相机参数,但是这种方法标定的结果误差较大,不适合于高精度应用场合。

第二种是依赖于标定参照物的标定方法。是通过标定参照物,由相机成像,并通过数字图像处理的方法,以及后期的空间算术运算计算相机的内参和外参。这种方法标定的精度高,适用于对精度要求高的应用场合。

3、实验要求

1.制作棋盘格(每个格子的大小可测量);
2.根据棋盘格,采集10-20张图片,提取角点;
3.解算出内外参数,内参截图放在博客中,外部参数最好能可视化。

4、实验内容

4.1 数据集

  • 该数据集是通过将8*8棋盘格投影到电脑屏幕上,然后用VIVO手机拍摄的20张图片 ,格子大小为1.8cm*1.8cm。

4.2 代码实现

# 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和y

obj_points = [] # 存储3D点
img_points = [] # 存储2D点

images = glob.glob("C:/Users/Administrator/Desktop/棋盘格/IMG_20200407_163457/*.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+=1
cv2.imwrite(‘C:/Users/Administrator/Desktop/棋盘格/IMG_20200407_163457/‘+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)

4、实验结果

4.1 内参矩阵mtx

4.2 畸变系数dist

4.3 旋转向量rvecs

4.4 平移向量tvecs

4.5 相机内置参数矩阵

5、分析与总结

  • 由于拍摄角度的不同,所以每一张图片的外参也不相同。
  • 反投影误差可以反映结果的好坏,反投影误差越接近0,就说明结果越好。
  • 内参矩阵只关心相机坐标和图像坐标之间的关系,与相机的绝对尺寸无关。投影面的位置与其尺寸相关。

原文地址:https://www.cnblogs.com/twzh123456/p/12655348.html

时间: 2024-10-14 07:21:20

计算机视觉——相机参数标定的相关文章

OSG中相机参数的更改

[cpp] view plain copy #pragma comment(lib, "osg.lib") #pragma comment(lib, "osgDB.lib") #pragma comment(lib, "osgViewer.lib") #include  "osgViewer/Viewer" #include  "osgDB/ReadFile" #include  "osg/Nod

相机参数详解

invert  :倒置,翻转 曝光值=快门+光圈: 曝光值每增加1将改变一挡曝光,也就是将曝光量减半,比如将曝光时间或光圈面积减半.这一点可能会引起迷惑.之所以是减少而不是增加,是因为曝光值反映的是相机拍摄参数的设置,而非底片的照度(这一点将在下一段中提到).曝光值的增加对应于更快的快门速度和更大的f值.因此,明亮的环境或是较高的感光度(一般称作ISO)应当对应于较大的曝光值. 曝光量: 快门: 增益(感光度):http://baike.baidu.com/link?url=87oKDOqYC8

Matlab2015 双目相机自动标定

一.      标定步骤 1.      调出标定工具箱 在命令行输入stereoCameraCalibrator,出现如下界面: 2.      勾选相应的选项 然后将上面的“Skew”.“Tangential Distortion”以及“3 Coefficients”等选项选上,将“2 Coefficients”选项去掉,如下: 3.      载入图像 然后点击添加图像,出现如下界面: Camera1代表左摄像头,Camera2代表右摄像头,分别选择存放着左右图像的文件夹,需要特别注意的是

osg设置相机参数,包括初始位置

严重注意!!!以下设置必须在viewer.realize();之后,否则不起作用!!!! 设置相机的位置,可以通过CameraManipulator(一般是osgGA::TrackballManipulator)设置, 可以使用setTransformation设置 设置相机的其他参数,ViewMatrix,ProjectionMatrix,Viewport osg::Camera* c=viewer.getCamera(); c.setViewMatrix.... c.setProjectio

【WebGL入门3】相机参数及光照模型

透视相机:PerspectiveCamera( fov, aspect, near, far ) 1.视角fov:这个最难理解,我的理解是,眼睛睁开的角度,即,视角的大小,如果设置为0,相当你闭上眼睛了,所以什么也看不到,如果为180,那么可以认为你的视界很广阔,但是在180度的时候,往往物体很小,因为他在你的整个可视区域中的比例变小了. 2.近平面near:这个呢,表示你近处的裁面的距离.补充一下,也可以认为是眼睛距离近处的距离,假设为10米远,请不要设置为负值,Three.js就傻了,不知道

线阵相机参数计算,选择合适的相机与镜头

1.精度=物宽/像素,此公式用来选相机. 如要求精度为0.3mm/pixel,物体宽1200mm,那么像素就是4K,所以选择4K相机. 2.物体最大移速=精度×最大行频,此公式用来计算相机是否满足移动速度. 0.3mm/pixel×26000Hz=7617mm/s,即物体移速低于457m/min即可,所以选的4K相机没有问题. 3.物距=焦距×精度/像元尺寸,此公式用来选择镜头或计算物距. 像元尺寸要查产品手册,如5×5um2 ,那像元尺寸就是5×10-3 mm. 所以,物距=焦距×0.3/0.

项目总结(3.DIBR技术项目总结(1.TOF相机及标定相关))

1.定义: http://blog.csdn.net/lavendarwang/article/details/20729595

ORB-SLAM2 运行 —— ROS + Android 手机摄像头

转载请注明出处,谢谢 原创作者:Mingrui 原创链接:https://www.cnblogs.com/MingruiYu/p/12404730.html 本文要点: ROS 配置安装 解决 sudo rosdep init 报错 Website may be down. ORB-SLAM2 ROS 配置安装 解决报错 DSO missing from command line Android 手机摄像头与 PC 进行基于 ROS 的通信 手机摄像头标定 采集标定图像 OpenCV sampl

相机标定:Matlab标定工具箱使用要点

1.单目标定 1.核心步骤 (1)获得标定数据:<Images_names>, <Read images>, <Extract grid corners> 1)输入数据:源图像序列(必选).棋盘格数量(可选).棋盘格尺寸(必选) 2)读入图像:输入图像基名和图像扩展名 3)提取角点:对每幅图像依次执行,若对提取的角点不满意则输入可能畸变参数(值在-1~1之间)后重新提取直到满意为止 (2)执行初次标定:<Calibration>, <Save>,