我刚刚开始使用OpenCV并校准了两个摄像机。
Iam使用棋盘用python校准camare。我使用函数drawChessboardCorners
和calibrateCamera
。一切正常。
这些功能的documentation描述了如何使用这些功能。但是我一直想知道这些背后的魔力是什么。我想知道OpenCV中相机校准的数学背景。
棋chess的OpenCV detecting the corners怎么样?
这是如何用来校准相机的?
答案 0 :(得分:1)
请参阅Gary Bradski和Adrian Kaehler的“学习OpenCV” 。 关于相机校准的一章内容很大,并具有良好的针孔相机模型数学背景,各种失真以及减少失真的方法(通过校准)。
使用图像的2nd derivative来检测图像的角。
答案 1 :(得分:1)
为了了解实际的相机校准,让我们从形成图像的方式开始。
从根本上说,相机是一种将点从3D空间转换为2D空间(图像空间)的设备。在图像形成分析中,我们经常使用所谓的pinhole camera模型,其中图像是这样形成的:
更多图解,我们可以看到这样的图像形成:
,其中Y1是像平面,x3是从相机到物体的距离(我们将其称为深度z),x1是3D点P在X1轴上相对于光轴的位移。相机X3。 O是具有焦距f的相机,y1是图像中心与对应于点P的像素Q之间的距离。
最简单的投影模型被称为 orphography 。该模型只是删除3D点的深度坐标(并可能对其进行缩放)。因此,如果我们从3D世界中的P点开始
,我们可以将投影写为:
,其中s是实际比例因子,矩阵pi是投影矩阵。
此模型对于远摄镜头(长焦距)和浅物相对于它们到相机的距离近似。仅适用于远心镜头。 透视投影是我们使用的相机的更精确模型。为了获得直觉,如果3D对象距离相机更近,则图像平面中的对象看起来更大。从数学上讲,由于三角形相似,y1与x1成正比。比例因子为f / x3或f / z。暂时让f为1,这将导致以下投影函数:
如您所见,投影不再可以表示为矩阵乘法,因为它不再是线性变换。这不是理想的-矩阵乘法具有非常好的特性。因此,我们介绍了一种称为“均匀坐标”的技巧。对于每个点,我们添加另一个坐标(因此现在使用3个坐标表示2D点,而使用4个坐标表示3D点),并将第四个坐标归一化为1(考虑最后一个坐标的隐式除法)。 / p>
现在,我们的点P变为:
我们可以将透视投影矩阵写为:
,由于我们使用齐次坐标,最后一次除法是“隐式”发生的;代字号表示齐次坐标中的向量。
就在那里!那就是透视投影矩阵。请注意,这是不可逆的转换。
但是,相机不仅将3D点投影在2D图像平面上。投影之后,它们将转换为离散图像空间。这由称为 intrisinc相机矩阵 K的矩阵表示:
,其中fx和fy是x和y轴上的独立焦距(通常合理地假设是相等的),s是一个歪斜,说明图像轴不垂直于光轴(现代相机接近于0),而cx,cy代表图像的原点(通常是图像的中心)。
相机通常会给图像添加一些失真,并且它们具有不同的数学模型。
摄像机校准过程是指确定固有摄像机矩阵和失真模型的参数。
这可以通过以下粗略的过程来完成:
要查看实际的闭合形式方程,请看W. Burger(Burger,2016年)的一个很好的paper。
此字段的“圣经”是A. Zisserman撰写的《计算机视觉中的多视图几何》。