张正友标定法公式推导

相机标定

第一章 相机内参、畸变标定和位姿估计



前言

最近使用平面配准和立体配准进行深度图和彩色图的双目匹配,重温一遍张正友标定法,记录公式推导要点。

在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数(内参、外参、畸变参数)的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。

畸变(distortion)是对直线投影(rectilinear projection)的一种偏移。简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。畸变简单来说就是一条直线投影到图片上不能保持为一条直线了,这是一种光学畸变(optical aberration),一般的相机存在桶形畸变和枕形畸变两种情况,可直观的对应到正方形变形为圆环形(线段凸起)或枕头形(线段凹陷)。


一、相机内参模型

常用的镜头标定采用的是针孔相机模型,以下均按照针孔相机模型展开。

1.相机坐标系转换

在视觉测量中,需要进行的一个重要预备工作是定义四个坐标系的意义,即 摄像机坐标系 、 图像物理坐标系、图像像素坐标系 和 世界坐标系(参考坐标系) 。

从像素坐标系P(u,v) 到 世界坐标系Pw(Xw,Yw,Yw)

图中可看出,由相机坐标系到图像坐标系是由三维转换至二维,丢失了z方向的信息,下图中Zc可理解为z方向深度。

 图中R&T是旋转与平移矩阵,在机器人导论中,RT合并为T即4×4矩阵,该R&T也是刚性变换中相机外参的表示形式。

部分公式符号定义如下:

其中,α,βα,β表示图像上单位距离上像素的个数,则fx=αf,fy=βf 将相机的焦距f变换为在x,y方向上像素度量表示。

另外,为了不失一般性,可以在相机的内参矩阵上添加一个扭曲参数γ,该参数用来表示像素坐标系两个坐标轴的扭曲。

备注:对于大多数标准相机来说,可将扭曲参数γ设为0

2.畸变参数

        目前最常用的是径向畸变和切向畸变,除此之外,还有Calib.io 的高精度 B 样条相机模型等。

径向畸变

使像点产生径向位置的偏差称为径向畸变。这也是相机中最常见的一种畸变——因为光线通过透镜一定会产生折射。径向畸变又可以具体分为正向(枕形)畸变和负向(桶形)畸变。

切向畸变

切向畸变是由透镜与成像平面位置不平行所导致的,这也会使得光线穿过透镜投影到成像平面时的位置发生变化。

切向畸变可以看成坐标点沿着切线方向发生了变化,也就是水平夹角发生了变化。切向畸变可以用两个参数p1 和 p2 来表示。

对于制造误差较大的相机,还有薄棱镜模型等畸变模型对成像误差进行拟合。

3.误差分析

        标定算法求解用最小二乘法构建超定方程,通过迭代计算使重投影误差最小的方法优化得到内参和畸变参数,在优化过程中容易陷入局部最优,目前普遍的做法是对标定图像进行筛选,有如下思路:

避免单个朝向的图像过多,

剔除拍摄条件较差,容易出现标定板坐标提取错误的图像,

剔除重投影误差过大的图像

提高图像质量:优化打光和拍摄角度,是图像亮度较好,避免出现过曝和过暗

        对于部分标定场景依然存在标定参数偏离真实值的情况,此时可以考虑减少标定过程中的优化参数,比如仅优化K1K2P1P2,或忽略切向畸变进行求解。具体方式取决于相机的畸变特性,比如相机为广角镜头,图像的径向畸变较大的情况下,忽略K1K2K3进行求解会存在较大误差。

二、使用步骤

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

部分内容引用自:

最详细、最完整的相机标定讲解_卍卐没想到的博客-CSDN博客_相机标定

[图像]摄像机标定(2) 张正友标定推导详解_祥知道的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
九点标定矩阵算是计算机视觉中常用的相机标定之一,可以用于获取相机的内参矩阵和畸变参数。下面是用C#实现九点标定矩阵算的基本步骤: 1. 定义像素坐标和三维世界坐标的数组: ``` double[,] imagePoints = new double[9, 2]; double[,] objectPoints = new double[9, 3]; ``` 2. 初始化像素坐标和三维世界坐标的数组: ``` // 像素坐标 imagePoints[0, 0] = 143; imagePoints[0, 1] = 142; imagePoints[1, 0] = 232; imagePoints[1, 1] = 137; imagePoints[2, 0] = 321; imagePoints[2, 1] = 135; imagePoints[3, 0] = 405; imagePoints[3, 1] = 133; imagePoints[4, 0] = 488; imagePoints[4, 1] = 131; imagePoints[5, 0] = 571; imagePoints[5, 1] = 129; imagePoints[6, 0] = 651; imagePoints[6, 1] = 127; imagePoints[7, 0] = 732; imagePoints[7, 1] = 125; imagePoints[8, 0] = 817; imagePoints[8, 1] = 123; // 三维世界坐标 objectPoints[0, 0] = 0; objectPoints[0, 1] = 0; objectPoints[0, 2] = 0; objectPoints[1, 0] = 20; objectPoints[1, 1] = 0; objectPoints[1, 2] = 0; objectPoints[2, 0] = 40; objectPoints[2, 1] = 0; objectPoints[2, 2] = 0; objectPoints[3, 0] = 60; objectPoints[3, 1] = 0; objectPoints[3, 2] = 0; objectPoints[4, 0] = 80; objectPoints[4, 1] = 0; objectPoints[4, 2] = 0; objectPoints[5, 0] = 100; objectPoints[5, 1] = 0; objectPoints[5, 2] = 0; objectPoints[6, 0] = 120; objectPoints[6, 1] = 0; objectPoints[6, 2] = 0; objectPoints[7, 0] = 140; objectPoints[7, 1] = 0; objectPoints[7, 2] = 0; objectPoints[8, 0] = 160; objectPoints[8, 1] = 0; objectPoints[8, 2] = 0; ``` 3. 调用OpenCV库的`Cv2.CalibrateCamera()`方计算相机内参矩阵和畸变参数: ``` Mat cameraMatrix = new Mat(); Mat distCoeffs = new Mat(); Mat[] rvecs; Mat[] tvecs; Cv2.CalibrateCamera(new Mat[] { new Mat(objectPoints), new Mat(imagePoints) }, new Mat(new Size(800, 600), MatType.CV_8UC1), new Mat(new Size(800, 600), MatType.CV_8UC1), cameraMatrix, distCoeffs, out rvecs, out tvecs); ``` 4. 输出相机内参矩阵和畸变参数: ``` Console.WriteLine("Camera matrix: \n" + cameraMatrix); Console.WriteLine("Distortion coefficients: \n" + distCoeffs); ``` 注意:需要引入`using OpenCvSharp;`命名空间才能使用OpenCV库。 以上是用C#实现九点标定矩阵算的基本步骤,具体实现可能因项目要求而有所不同。需要注意的是,九点标定矩阵算需要保证三维世界坐标的点在同一平面上,且相机拍摄时需要保持相机和三维世界坐标系的相对位置关系不变。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值