相机标定与棋盘格标定

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-8

criteria = (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+=1
        cv2.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表示三维坐标中的标定在这里插入图片描述

发布了14 篇原创文章 · 获赞 0 · 访问量 2819

猜你喜欢

转载自blog.csdn.net/monetvan/article/details/105359231