00:53
喂喂喂,可以听到吗?
02:17
喂,好的,稍等一下啊,我这边稍微调试一下,马上开始。好的,那我们开始了,嗯,大家好,我是沈一君,现在是上海交通大学的一名在读博士生,我现在主要研究方向是复杂曲面的精密测量,呃,目前还是在做接触式测量的测量规划和数据后处理,因为之前搞过一段时间的光学测量,所以也是受这个3D视觉工坊负责人的邀请,来做这一次相机标定的分享。
03:08
嗯,首先我想今天先明确一下这一次分享的受众,呃,可能对于一些还没有接触过这个相机,就是视觉测量,然后或者是另外另外一些对于视,对于视觉行业已经比较有自己的。认识,然后也是资深的从业者的话,今天的分享可能会在你们看来可能会稍显简单一点,然后呃,所以我今天的分享还是主要针对于。即将进入视觉测量行业,然后可能你看过一些博客对于相机标,对于相机标定的介绍,然后自己也跑过一些opencv或者MATLAB的标定的历程。但是你对里边的细节如果还是不是非常清楚的话,那么今天的分享可能会让你对相机标定有一个比较清晰的认识。
04:09
呃。这这边这边这边有朋友说直播断开了吗?呃。我这边再问一下,就是现在这个直播间的情况,大家听的还可以吗?如果可以的话,在弹幕里面打个一好吗?嗯,好,我看到大部分人还是嗯直直播应该是没有什么问题,然后呃,如果是卡的话,有可能是我这边家里的网不是非常好吧,嗯,如果卡顿严重的话,再反馈一下好吧。
05:06
然后我们今天的分享主要会从以下五个方面来进行。首先先简单介绍一下相机模型吧,呃,我们从呃相机的成像来说,我们需要研究四个坐标系之间的关系,分别是世界坐标系,相机坐标系,图像坐标系和像素坐标系,这个命名可能会就是在不同的参考资料里面可能会不太一样,然后我这边先来讲一下这几个坐标系,我们还是看图来说好吧。就是对于一个三维世界中的一个物体来说,它自己的坐标系应该是在这个世界坐标系下面,也就是这个。这个三维坐标,三维的视界坐标系下面,然后我用一个相机想要去拍摄这个物体的话,首先我需要把这个视界坐标系下的物体转换到我的相极坐标系下,然后相机坐标系它的一个。
06:08
这个这个这个怎么说呢,建立的一个原则就是说它的Z轴是和我相机的这个光轴是重合的。另外两个轴的话,就是我们从肉眼上来看是看不到的,但是你知道就是Z轴是和光轴是重合的,那么我世界坐标系下的点就可以通过一个刚体变换,把它给变换到这个相机坐标系下面。然后相机坐标系,接下来相机我们知道我们这边讲的还是一个小孔成像的一个模型。所以对于。嗯,我这边打开一个一个笔啊。大家可以来看这张图,就是对于一个相机来说,我们这边拍摄到的一个物体就是在这个地方,我们已经就是这个地方,我们已经在相机的坐标系下面,那么相机坐标系下面的这一个P点。
07:04
呃,在相机坐标系下,它的Z轴坐标是这个Z,那么它在这个图像坐标系下,也就是说它在它的这个成像平面上。我们知道根据小孔成像的原理,它会成像在C等于焦距的这一个平面上,那么它就会被投投射到这个平面上,这个平面的呃特点就是这个C等于焦距F。那么。当它成像在成在这个平面上之后,它其实现在就是经过这两步变换,现在世界坐标器下的一个点已经变换到这个图像平面上了。那么这个时候,呃。就是已经到图像平面上之后,我们要最后成像,我们得到的是一张,呃,比如说的照片,这个坐标系它又不太一样,这个坐标系,因为我们知道这个图像坐标系它应该是这样的,就是它。
08:00
因为刚刚我们说了嘛,它那个非轴是和相机的光轴是重合的,所以它应该会是在这个位置。但是我们平时看到的一张照片的话,我们说那个像素点,比如说第一个像素,那它应该是从这个左上角开始数的,所以我们最后又引入了一个叫像素坐标系下的一个坐标,我们把这个像素坐标系定在这个。图像的一个左上角。然后根据这几点的话,我们就可以来看一下刚刚四个坐标系之间的一个变换。呃,第一个坐标系就是世界坐标系到相机坐标系,它之间是一个直接进行一个刚体变换,这个就比较清楚了,一个由一个旋转矩阵和一个平移矩阵,唯一确定了一个刚体变换,可以把世界坐标系下的点转换到相机坐标系下。然后这边是相机坐标系下的点,需要转换到图像坐标系下,也就是刚刚说的,大家还记得刚刚那个小孔成像的那个模型吗?
09:05
就是这个地方是Z,就是在相机坐标系下的Z值,然后这个地方是F,就是成像在一个等C等于焦距位置上的一个平面上,那么这个地方我们可以通过。相似三角形的原理,然后把这个地方的XYZ重新计算出来,这个Z就是已经把它确定到这个平面上,所以说我的XY根据相似三角形的原理,可以通过这两个公式直接算出来这个,其实它X和Y已经是在这个图像上。这个XY,假如说这个点就已经变到这个图像上,这个点的坐标是X和Y,但是我们现在在一个图像上,我们。我们用的单位不是和世界坐标系一样的毫米,我们应该是以像素为单位的,所以这个X和Y这个点虽然是XY,但是它在像素的,就是从属像素的。
10:07
个数上面肯定不是说它是DX的像素,DY的像素,那么最后我们还要把它进行一个变换,也就是说从图像坐标系再变换到一个像素坐标系。我们可以看一下。这个地方图像坐标系下的就是刚刚的图像坐标系是在这个地方,这个X和这个Y。也然后这个地方是我们刚刚比如说有一个点叫X和Y,然后。我们图像坐标系的原点在这个图像上的坐标值,假如说是叫它U0和V0。那么那么这1.xy是不是应该是,假如说我现现在我的像素坐标系是建立在这个位置U和V,那么这个XY这一个点在像素坐标系下的坐标是不是就应该是用这种表示的方法呢?然后这边我们的FX和FY,也就是每个毫米对应多少个像素,也就是说假如说这个地方。
11:06
这个地方一共长度是X,它对应的像素应该是X乘以XFX,然后再加上这一点的这个主点坐标,嗯,叫CX和CY,那么我们就可以得到这一个点在像素坐标系下的坐标。然后经过上面这个几部的变换。从世界坐标系乘以一个矩阵,再再乘以一个矩阵,再乘以,经过三次矩阵的连乘,我们就把这一个世界坐标系下的一个三维的点,最后变成了一个像素坐标系下一个二维的一个像素,这个就是我们常说的相机模型,也就是小孔成像的一个模型。那么现在还有一个就是相机,我们知道它是存在畸变的。比如说鱼眼镜头,它的机电就会比较严重,那么我们可以看到正常的物体,我们是就是。
12:05
如果一个物体是横平竖直的,它在相机里边,由于畸变的存在,它可能会产生一些弯曲,就是有这两种弯曲的情况,然后现在这种比较常用的畸变模型,我们也是只考虑了。镜像极点和切向级别。然后镜像畸变的话,它其实是以一个多项镜像畸变,它其实是一多项式的表示来把它给写出来的,比如说大家看这个K对应的是这个R的二次方,这个R指的是假如说我这个是一个图像啊,图像中间是00点,那么我的这个我现在有一个点叫XY,那么这个R就是指这个点离。我的图像中心的一个距离,这个就是二,我这边写了。然后我们可以看到它是一个多项式,其实你还可以继续往下写,加上K3R的六次方,还可以写K4R的八次方,然后还可以继续往后面写,但是我们知道就是这个是别人论文里面论证读,就是你这个东西再往后面写,后面的这个K几乎就等于就是影响已经不大了,甚至说你如果再继续去加这个基变。
13:17
参数的话,可能反而导致它的效果不好,所以说也是为什么大家比较常用的看到我们,呃,就是做实验啊什么的,常用的一般都是用两个或者是用三个,就是到K3一般就结束了,很少会看到继续往下写,K4 K5 K6这样继续写的,就虽然它是一个多项式,但是我们一般就是认为到R的六次方已经可以足够去逼近这一个基变模型了,没有必要再去增加。这是一个,然后我们可以看到它这边有一个。上面写整形畸变和一个筒形畸变,相当于一个是往外凸,一个往里面凹,呃,我想问一下大家,就是假如说我这个地方K1 K2 K3,假如说我都是正的或者都是负的,大家知不知道就是我的K,假如说我的K大于零。
14:11
K大于零的情况,它应该是产生的整形畸变还是产生同形畸变?嗯,我问一下大家这个。我不知道大家对这个有没有概念,虽然这个可能不是对就对标定这个事情不是很重要,但是我想大家理解这个即便产生的。就是原理或者怎么样,大家如果知道的话,可以弹幕里边互动一下。就是假如说我现在这个不考虑这个P的影响,我现在只写一个,假如说这个K1K2K三都是大于零的情况下,那么不知道它应大家知道是整形畸变还是桶形畸变。嗯,那我我这边讲一下这个东西可以怎么来进行一个判断。
15:05
假如说我这边有一张图,我们我们考虑这个畸变,我们就我们就考,我们就考虑两个点啊,就是假如说我这个地方是一个中心点,我们考虑上面这一条线,然后考虑这两个关键点,这个点和这个点。嗯。我们可以看到这两个点。我们可以看到这这两个点离中心点的距离这个短,这个这个是这一点是近的,这一点是远的,那么对于K大于零的这个情况来说,是不是近的这一个点就是大家可以看啊这个。这这个是畸变产生的基变量,这个基变量是等和我,因为我这边说了K是大于零的,那么这个基变量应该是和我这一个像素点到我的图像中心的距离是成正比的,就是这个和这个R是成正比的。
16:03
那么我们可以看到这一这个点它离图像中心的距离是比较近的。那么它经过我的。这个畸变的情况,它应该伸长,比如说我假如说我这个点变到上面这边了,会伸长一点,但是伸长应该是比较短,然后这一,然后对于这个点来说,它受到我的畸变的影响应该是会是比较大的,因为我这个本身这一条的距离会比较长,那么它应该会往这边伸长,伸伸到大概这个位置。就是大家可以看出来,就是它这个畸变是和我的。这个点离图像的距离是有关系的,所以所以这个地方最后产生的效果应该是我的一个这样的一个直线,应该是中间这个点往上偏离的距离比较短,周围的两个点比往上偏离的距离比较长,应该是呈一个这样的一个形状。所以应该是这个。
17:03
我不知道,我不知道这个有大家有看懂吗?就是我的产生的基变量是和我这一个图像上的这个点到图像中心的一个距离是成正比的,就是当当假如说我K大于零的这个情况的话。啊,这个这个只是让大家了解一下,这个就是基变参数最后是怎么影响这个图的,但是对于我们后面的这个标定是没有什么影响,所以我们就继续啊,应该是就如如果是K大于零,应该是这种应该是这种情况。然后我们接下来说一下我们的相机标定到底要标定什么,然后因为我们刚刚前面已经在相机模型上面讲过,就是从世界坐标系到图像坐标系是经过三次矩阵的连成,那么这个矩阵里面的参数其实就是我们需要标定的东西。
18:05
这两个就是我们这这几个是图像的一个,这个是主点坐标,这个是每一个。每一个毫米对应多少像,对应多少个像素,也就是我们刚刚前面已经讲过的,就是图像坐标系到像素坐标系的一个变换的一个参数啊,这个就是我们刚刚说的极点参数,然后对于外传的话,就是因为我们知道相机。标定需要拍摄很多照片,每一张照片需要改变一次相机的姿态,那么每一次姿态其实就对应了一一组外参,这个R和T分别代表的就是一个旋转矩阵和一个平移矩阵。啊,这个这个大家应该清楚啊,就是刚体变换一个。对于一个刚体变换来说,它可以表示成一个三乘三的一个旋转矩阵,然后这边是一个三乘一的平移矩阵,然后这个地方,这个地方是零,这个地方是一,这个是表示一个刚体变换从一个。
19:05
呃,笛卡尔坐标系变换到,另外变换到假如说是一个这样的一个笛卡尔坐标系下。就是这样的一个变化,我们称之为刚体变化,它可以以这种方式表示啊。那我们来想一想,就是我们现在要做这个标定,我们要标定刚刚上面说的这么多参数,我们可以怎么去标定呢?我不知道大家会不会有这种比较直观的想法,就是我们建立这样的一个目标函数。假如说我现在。三维空间,假如说有一个这样的一个物体。这样的一个物体是在三维空间下面,那么我最后拍摄到我的照片上,应该它会呈现一个假如说,假如说呈现的是这样的一个东西。这个是。
20:01
这个是我的2D图像。刚刚这个是一个3D的图形,那么拍摄到上面之后,我们应该会有一个一一对应的关系,假如说我这这个点,这个角点就对应的是这个角点。然后这这个交点对应的就是这个交点。那我现在就有一个比较直观的一个想法,那我可不可以这样,就是我的输,假如说我的输入点是。这个M,这个M是我的三维点。我的三维点经过我的刚刚前面一系列的相机模型之后,就是这个假如说这个表示我的通过我刚刚三个矩阵连成的操作,把它变到了一个二维空间,我们把它假如说我们把它这个过程称之为一个投影。就是从三维到二维的一个过程,我们讲假如说称之为投影,那么我三维上的点投影到二维上的点,假如说我这个点投影出来的结果是这几个。
21:04
然后我的二维图像,也就是我相机已经拍摄到的照片,我也可以通过角点提取的方法去找到这三个小点的位置,这三个小点的位置假如说是这个。前面的小M就是不带上面的这个箭头的,那么我只要是不是可以有这么一种比较直观简单粗暴的一个想法,我们去优化所有的这些参数,直到我投影出来的点和我二维上检测到的角点重合。或者说在最小二乘的意义下,它最小是不是就可以了?就是从一个直观的理解来说,这么一种方法应该是,就是如果是做最优化的朋友的话,应该觉得这种方法是最直观的。就是通,通过相机模型,我就应该有这么一个优化函数,可以让它最小。但是为什么没有呢?为什么这么简单的一个方法大家不用了,为什么还要?
22:03
呃,我看到群里有人说这个MIG是什么意思?IJ,这个应该是指假如说我有N幅照片,然后M的话,应该指的是每一张照片上有M个角点,应该是这个意思啊。就是一共是有N乘以M个,就是相当于输入嘛,输入然后。现在的问题就是这么简单粗暴的一个。目标函数为什么大家不用,为什么?张正友还要再提出他的一个标题方案。其实就是。就是我们要优化的这个变量太多,如果我没有一个比较好的一个初始值的话,最后这个方法很容易陷入一个局部最优的一个情况。因为我们可以知道,假如说我完全什么都不知道,我拍摄了,假如说拍摄20张照片。那么我需要标定多,我需要就是求解多少个参数呢?
23:02
呃,内参,内参就是我假如说FX fy exy就是四个,然后假如说加上我的机变参数是是是四个,但是我现在有一个问题啊,我这个R和T每一张照片它都有一组R和T,而且我这个东西没有初始值的话,就比较讨厌了,那我R和T就是每一张照片R有三个未知量,T有三个未知量。那么我假如说20张照片的话,就应该是这个R和T一共要乘以20。就我已经有这么多未知量要去,而且它每加一张照片,这个R和T的未知量都会在增加。所以说我们如果很简单粗暴的只是说用这么一个公式,然后我所有的输入,假如说比如说我设置初始值,这个FX和FYCXCY都设置,都设置的是零,然后我的R用。什么单位矩阵T,我也输入000去优化的话,虽然我自己没试过,但是我觉得应该是。
24:04
不可能能优化出来一个比较好的结果的。所以说。那么我们现在就提到了张振友这一篇零九年的。呃,这一篇论文他提出的不是零九年就是零零年,我下面我这个每一页如果引用到了别人的论文的话,我都会在页面下方把我引用到的论文的这个,呃,这个这个引用的格式给写在下面,大家如果对于某一页上面讲的东西有疑问的话,可以直接参考我下面的一个参考文献。这个是直接对应的,我每一页上面假如说引用他们内容的话,都会写的。然后张振友这篇文章,他做出的最大的贡献就是说他通过数值解法。解出了一个比较准确的一个初始值,使得后面做最优化的方法会有一个非常好的一个初始值,所以最后的结果是比较准的,所以大家要明确张振友这个方法他的贡献到底是什么,他不是说他提出一个这样的目标函数,这个没有什么,他最大的贡献是在于它通过这些东西解出了一个非常好的一个数值解,这个解可以用作初始值,用作后面的。
25:19
最优化。那我们来简单回顾一下张振友的这个标的。嗯,首先我先说一下,今天我们这个分享里面,我不会带大家去详细的去推导张胜友这个论文里面的公式,因为我也是觉得,嗯,怎么说呢,应用是主要的,然后如果你要深入了解的话,你可以后续再去,呃,怎么说呢,去仔细去阅读他的论文,或者怎么样也好,就是对于他的公式,我们今天不做非常详细的推导。好吧,我们先看一下张震友标的,他这个论文里边。第一句不是第一句啊,就是我这边截出来第一句也是一个非常重点的,我这边打了一个红框,他说我们假设我们的平面是处于一个Z等于零的一个平面。
26:06
在世界坐标系下面,这个是一个非常重要的一个事情,就是我们刚刚提到的,我是一个物体在世界坐标系下的坐标,它应该是三维的XYZ,但是张振友这篇文章,他提出一个他的这个方法建立的。假设依据是什么呢?就是我要标定的这个物体,就标定板啊,这个标靶,它必须处于这个C等于零这个这个平面,因为我知道你其实这个视觉坐标系是你自己随意设置的,你想设哪里都可以,那么我假如说这边有一块标定板,我可以比如说我这边是一个,呃。大家常用的就是棋盘格嘛,那我假如说这边有一个棋盘格,那我假如说我这个世界坐标系就定在这个棋盘格的这一个角落上,然后我其他的这些角点都可以根据我的设计参数直接获得,但是我们要明确的是,他这边说了Z等于零,就是它必须把它放在。
27:04
不是说必须是Z等于零的这个位置,而是说我的所有的点必须在一个平面上,这个很关键,因为我经常看到有很多人做那个相机标定。就是呃,假如说我们假设他做相机标定是为了得到一个比较准确的,就是精确的值,不是坐着玩啊,他拿一块那种泡沫塑料板,上面粘一个纸打印出来那种纸去做标顶,这就有一个问题,你的泡沫塑料板假如说是一个这种我夸张了,就假如说是一个比较弯的,或者说你的纸粘在上面有一些凹凸不平,那最后的结果这个误差就就在第一步就已经引入了这个误差。就是你假如说我这个版上面,我本身我的这个。点应该是这几个点是我要用来做相机标定的一个角点,假如这个每格之间的距离是20。结果你的。
28:03
结果嗯,结果你这个板给它做弯了,把它做成了这个样子,然后这两个点,然后最后它默认你是都在一个C等于零的平面上,那么你的点就相当于直接默认直接投影到了一个平面上,那它之间的距离可能就不是20了,可能最后就变成了啊十几十18这个样子,那么这个误差就已经引入了,所以大家要记得,假如说你要用张真有这个标定法去计算一个初值的话。首先你先把这个标定板给它做平了,就是你要保证你的标靶是在一个平面上,然后我们下面可以看它为什么就需要在一个平面上,因为它这个第一步就是提到了,因为我只有C等于零了,它通过这个公式才可以把它变换成下面这一个公式。就是我们的第二个公式,可以看到它把Z,因为Z等于零,所以R3对于最后的计算不起作用,所以它可以把R3这一列给它去除掉。
29:01
那么我们把R3这一列去除掉之后,它其实就变成了一个它的矩阵,其实前面相乘的矩阵变成这样,我们把这个矩阵称之为H,就是这边我们说到这是一个叫单应性矩阵的一个概念,它表示的是一个平面和另外一个平面之间的一个映射关系。这个A指的是我的相机的,就是相机所有的内参数的那些矩阵。嗯,这个H作为一个单应性矩阵,假如说我现在有两个平面。嗯,我这边稍等一下。嗯,没事。假如说我现在有这两个平面上面各有一些。点,然后这两个平面。它们之间存在着一一对应的关系,这个然后这个点对应这个点,然后这个点对应这个点,这个点对应这个点,那么它一一对应的关系可以用一个矩阵表示,我们称它称之为单应性矩阵,假如说你知道了这两个平面上所有点的对应关系,你是可以把这个单一性矩阵给直接求解出来的啊这边我没有把这一段给贴出来,这一段是作为张振友这一篇文章,在附录A里面是介绍了如何用两个平面之间的这个对应点去把这个单应性矩阵给求出来。
30:28
大家如果感兴趣的话,可以再去看那个论文里面具体的一些公式的推导啊,这边我不会去讲这么细节的东西,大家只要知道这个H是可以通过两个平面求出来的,那么也就是说我现在这个A乘以就是内参乘以。内参乘以外参的这一个矩阵我们已经获得了,就是这个H是已知量。那么现在问题就是怎么通过这个已知量把里面的内参和外参分别给求出来,下面也就是张振友这篇文章,它的里面的一些数学公式,一些比较用的比较巧妙的一些推导在这里面。
31:07
呃,我我大家简单看一下,我不详细去讲,但大家可以简,我带着大家简单过一下这些公式。呃,我现在把这个单应性矩阵H已经求出来了,它等于这个东西,然后我们可以看到,因为。因为这个地方它,呃,这边是用到我刚刚说的一个刚体变换的一个矩阵,就是这个RT。离这么一个刚体变化的矩阵,对于刚体变化矩阵,这个R是一个三乘三的一个旋转矩阵,嗯,如果对旋转矩阵有了解的同学的话,应该知道旋转矩阵是一个正交矩阵,也就是说它的每一列和每一行每一列它。这个向这个列向量它是正交的,并且它的。列向量的模长是等于一的,那么我现在它这种写法就可以知道,我们可以写出两个公式,第一个是R1垂直于R。
32:06
第二个是R的模。等于R2的模。啊,我这这写的稍微有点潦草,因为这鼠标实在是不太好用。然后通过这两个公式,我们可以写出两个方程。我们把A。把A的E给它乘到这边来。把这个A的逆乘过来,然后可以看到第一个公式,第一个公式是什么呢?R一点乘R等于零。中间有一步就是有一步把它展开了,大家直接看一下就行,这个就是R1乘点乘R等于零,第二个就是。R一点乘R1 R一点乘R1就是模的平方嘛,R一点乘R1等于R点乘R,就这两个公式是这个意思。然后为什么要做这两步公式呢?其实就是把这个,因为我们这边是把内参和外参都合在这一块了。
33:05
他这个方法就相当于我把这个外滩给它先剥离出去,我现在先只求内参。就相当于把这两个问题给它分解开来。然后因为我对于一个相机的话,它的内参永远是不变的,它的外滩是每一张照片都会有一个外滩,所以先求内参这个这个思路是没有问题,然后接下来就是一些呃公式的推导,它令B等于这么一个A的逆的转置乘以A的逆,就是你不要问我为什么他想出来用这个这么一种方法,我我不去研究它的这个具体的公式推导,然后经过反正经过它的这么这么多一个公式推导之后,最后它得出了一个这这么一个方程,就是它新假设了有一个变量这个B,这个B,嗯,我从上面这一页看一下,这个B是这个大矩阵里边的几个元素,这个矩阵因为是一个呃对称矩阵,所以它九个元素里面只有六个量是需要确定的。
34:06
然后这六个量其实唯一的就是唯一由相机内参给确定出来,大家可以看这个矩阵里面的每一项其实都是相机内参的变量,所以说这个大家可以这么理解,就是简单理解就是这个B就是相机内参的未知量。虽然不是直接就是未知量,就是它未知量的一些就是组合啊什么的。就是嗯,大家知道这个B是一个要求解的未知量就行了。然后我们可以看到这边这个V,这个V是前面V的里面的所有的元素都是这个单一性矩阵里面的这个值,所以说这个V我们知道刚刚已经说了,已知。所以说我这个V也是一致的。这个V也是一致的,那么现在问题就是解方程了,怎么解这个方程,或者说有多少个这样的方程?我们可以看到,对于一张照片,我们应该会有一个这样的方程,这个V是一个六维的,大家看一下这个V一共是六维,那么对于一张照片来说,就会有一个这样的。
35:16
V乘以B等于零的这么一个方程,这个方程现在是一个二乘六的一个方程。二乘六的一个方程,想把这个六个未知量解出来是不可能解出来的,所以至少那么至少需要多少张照片呢?就是张志友这篇文章里面,就是大家平时大家说相机标定要拍多少,要在不同的位置拍照片,那大家从这个方程其实就能看出来,我们最少最少相机标定需要多少组照片,可以把这个B给它完完全唯一确定下来,它一个照片可以提供一个相当于它这个矩阵是一个二乘六的一个矩阵,那么。
36:01
大家可想而知,显然至少要三张照片嘛,就是把这个东西可以把它组成一个。组成一个方阵。至少是三张照片啊,才能把这个B唯一确定下来,当然假如说你的照片数量越多的话,最后这一个方程就变成了一个冗余方程,这个这样的方程的话,抗造生的能力就更强。所以说至少是三张照片,但是我觉得大家如果自己做标签的话,应该不会有人只拍三张照片就把。相极去表肯定是要多拍几张照片,就是从理论上来说的话,至少是三张照片,那么这个方程它的求解,它的解其实这边已经说了,就是。V的转置乘以VV的转置乘以V是一个方阵,V的转置乘以V对应于这个矩阵最小特征值的特征向量就是这个B的解,这是一个,呃,这是一个定理,就是对于一个冗余方程来说。
37:02
V的转置乘以V,它的最小的特征值对应的特征向量是,这个B的解。那么。对于张振友的这篇文章,到这边我们其实就已经把这个B给求解出来了,B求解出来的结果其实也就是所有人类参数的这么一个矩阵求解出来,至于怎么从这个矩阵里边把每一个内参的量给提取出来,这个张振友他的论文里边附录B里面写的非常清楚,所以这个这个具体的怎么提取,这一点大家也可以,如果感兴趣的话,也可以去看他的论文,当然如果大家只是使用比如说open CV里面的标定函数的话,对于这些比较细节的东西还是不用搞得太清楚,我是这么觉得。然后我们可以看到张振友的标定方法,在刚刚这一步得到了一个初值之后,他还是使用了这么一个。
38:01
最小二乘的一个目标函数,然后去把这些值再优化一下,为什么要再做这一步呢?因为这篇论文里面提到了刚刚这一步得到的这些初始值,包括A,包括这个R,这个T,它的初始值它是在一个代数意义下面的一个最优值,也就是我们刚刚说的解这个冗余方程解出来的最优值,这个最优值并不代表它的比较好的一个物理含义,它的物理含义还是需要我们刚刚。前面说到的就是我的一个三维点投影到一个三维点,把它投影到二维的一个图像上。然后和我二维本身拍摄出来的这个照片上面的角点进行一个求差,它的一个差值,这个才是真正具有物理含义的一个量,我们把这个量进行一个最优化,那么它最后得到的这个优化出来的结果,内参和外参就是一个比较好的结果,它是具有物理意义上的最优解,刚刚那个只是刚刚前面这个解出来的,这个东西只能说是一个从代数意义上的最优解。
39:11
然后到这边为止,我们已经标定好了相机的内参,它的外参,那么如果加上了机电的话,其实也只是在这个地方加上一个畸变因子,就是我的三维上的点投影到二维上,我不只不是直接投影出来,而是投影完了之后再加上这个畸变参数。把它变成一个新的点,然后再和我二维检测到的角点进行一个对比。然后。优化目标其实就是加上了一些畸变参数,最后变成了这么一个东西。嗯。好,然后到此为止的话,张正友标定这么一个过程就结束了,我去稍微总结一下吧,张志友这个标点,张志友标点其实他不是说提出了一个非常好的优化目标,而是说他提出了一个非常好的一个算术解,这个算术解可以直接把原始的输入的三维点和二维点计算出一个。
40:17
大概的,但是又比较好的一个初值,这个初值用于后面的最优化会就是提高它的鲁棒性。好,那大家稍稍稍事休息啊,我喝口水,然后我们继续啊。好了,刚刚大家刚刚我们是讲了张振友标定,他就是从他2000年发的那一篇经典文献,然后来分析张振友标定的这一个方法,但是我们可以知道他当时那个方法也是比较老的,现在大家有很多改进,然后接下来我们也会来讲一下,现在对于张振友标定这一个,就传统这个方法到底有哪些可以改进的点。
41:14
嗯,首先第一点张振友我先明确一点啊,就是张振友的这个方法,没有说他要非得用棋盘格,或者是用圆环,就是我们平时大家做。平时大家做这个相机标定的时候,应该首先会有一个标吧。这个标靶的话,呃,常用的是棋盘格,因为opencv里面它的那个历程就是用棋盘格的,但是其实我们还有一种就是圆或者是圆环。就是我这个标吧,它里面是这种一个个圆。他其实标靶的样子不一样,它其实最后提供的信息其实就是这么一个个点圆的话就是圆心。然后棋盘格的话,就是,也就是他的脚点做成这些图案,只是为了我图像处理的时候检测脚点的方便,然后去做的这些图案,所以说首先明确一点,没有说张振友的方法说你非得要用棋盘格,或者你非得要用圆环,这是没有的,他提供的只是一种方法,他输入也只是你输入三维的点和二维的点,至于你这个点是用哪一种。
42:20
这个样子给他做出来就是检测出来的,这个倒没有关系。然后我们可以接下来来分析一下,那么现在有这种圆和期盘格到底哪一种更好一点呢?下面我列了一篇参考文献,在这篇参考文献里边详细做了每一种这个图案的一个。标定的一个精度,这个都是他用仿真数据给跑出来,大家可以看到圆的圆的检测,圆的标定的精度。这个标准差是比。正方形要小的。为什么圆的标定精度比正方形的要好一点呢?它其实它内在的因素是在于它特征检测,就是圆它的特征检测的精度和鲁棒性是比正方形要好的,就是正方形它检测其实是边缘检测嘛,就是直线的话,它它最后检测的是两个直线的边缘交于一点,然后把。
43:24
然后把这一点作为我的这个角点提取出来,然后圆的话,我是把圆的。周围的这一个边缘。检测出来之后进行一个拟合,拟合出来它的圆心,或者说现在还有一些不需要用拟合,它是用一些梯度的方法去做的,这个大家具体的可以去看一下,现在的这个图像处理里面关于怎么去提取圆的中心这一块就是先给大家说一个结论,就是说圆它的一个检测精度,它的精度和鲁方性是要比正方性好的,然后在这一篇论文里边也说到了。
44:02
嗯,就是说圆的。标定的,标定出来的结果比方的要好很多。那么接下来就有一个问题,就是那我到底是用棋盘格好还是用圆环好呢?就是我这边想说的是,他们各有利弊,就大家把这个利和弊搞清楚之后,才能知道你到底选用哪个更好一点。首先我先说一下圆的优势在于它的检测精度高,也就是说它的圆对于它中心点提取的精度更高,它的中心点提取精度更高,也就代表了它最后标定出来的结果会更好,因为你正方形的话,你在这个地方提取,假如说你这个地方提取有偏差,那么这一点,这里面的这些误差,这些噪声最后是会反映到到你的那个标定的结果里面去的,所以说我这边说,如果能用圆的话,尽可能的用圆,因为圆的检测精度更高一点。
45:01
但是原存在一个问题。语言存在一个叫偏心误差的东西,我这边想给大家介绍一下什么是偏心误差。假如说我现在有两条直线。这是两条直线,我这边有一个,假如我有一个点光源。然后这假这个不是叫点光源,就是假如说这是个相机,它进行一个成像,那么我可以看到,我假如说我这个成像,我这边画几条线,把这个我把这两条直线投影到我的相机平面上。嗯嗯,哎呀,这个这个画的有点丑啊。我稍微擦一下。就是我我这边可能画的,因为我这个用的是鼠标,所以可能画的不是很好,其实我想说明第一个问题,就是假如说我这两条直线是空间中的直线,它们是相交的,然后经过相机的成像呈在图像上之后,它还是应该是两根直线,这个没问题,我假如说咱们先不考虑畸变因素啊,就是假如说只是透视投影的一个关系的话,因为它是一个透视的投影。
46:09
所以两条直线经过透视投影,最后它还是成两条直线。那么。这两条直线在空间中的交点。他,他的投影。它最后还是这两条投影直线的交点,这边可能比较绕,我再说一遍,就是空间中两条直线的交点。它的投影是投影直线的交点。我不知道大家这这一点就是理解没有啊,理解的话在弹幕里面打个一好吧。就是说这个。相交直线的交点,它的投影是投影直线的交点。这一点很重要,就是对于直线啊,大家我看到大家反馈了。
47:03
呃,所以说这一点很重要,就是说用直线的话,你不管在哪个哪个角度去拍摄,它一定是成立这一个关系的,所以说直线就没有存在所谓的这个偏心误差的一个关系。那么我现在来考虑语言,大家来看一下这个问题啊。假如说这是一个圆,就是我从侧面,我是从侧面去看的这一个圆。然后这个圆的圆心在这个位置。我的相机的光心在这个位置,我进把这个圆进行一个投影。这个圆的投影是下面这一段。那么,我的这个圆的中心会被投影到哪里呢?大概会被投影到这个位置。那么现在我有一个问题。
48:00
这个现在就大家应该知道。这个圆经过我的。透视投影的话,它应该会变成一个椭圆,这个没有问题吧,就是你只要不是正着去拍一个圆,它一定是一个椭圆。所以我的圆的圆心应该会被投影到这个位置,就是根据它这个透视投影的关系,然后我现在应该也知道现在这个。这个东西是。这一块,这一块现在是一个椭圆的测试图,那么现在就有一个问题,我现在投影出来这个圆心是这个椭圆的中心吗?也就是说我的这一条和这一条它是一样一样的吗?一样长的它正好投影在中间吗?大家可以从这个几何的角度,可能我这个图画的不明显,大家自己拿一张,拿拿张纸,拿着笔画一下应该就知道了,这个点应该不会在正中间的,就是它一定是偏离正中间的。这也就是说明一个问题。我的圆的中心的投影不等于投影出来椭圆的中心。
49:06
大家可以理解一下这句话。我再说一次,就是。圆的中心的投影不等于投影椭圆的中心。所以这样就会存在一个问题。因为我们是不可能知道。我们标定板经过相机拍摄之后,它的中心究竟投影在哪里了?我们要检测的时候,一定是我们有一个圆圆的一个标定板的照片,它上面肯定是一个个椭圆。那么我这些椭圆,我们一一般采取的方式是直接把这个椭圆的中心给它找出来,把这个中心作为我的输入的,就是类似于棋盘格的角点,就是输入的二维点来用来标点,那这样的话就引入了这么一个比较大的一个误差,我们叫它偏心误差,因为这一个点并不是我们需要的点,它是偏离我们需要的这个圆的投影的中心的。
50:03
那么就是这个问题导致了它的误差。然后这个问题现在有什么解决方法呢?在我上面前面一页讲的这篇论文里边。
我来说两句