参考资料:
立体视觉中的对极几何——如何更好更快地寻找对应点
对极几何(Epipolar Geometry)是计算机视觉和计算机图形学中的一个重要概念,用于处理多视图几何问题,如立体视觉、结构光和双目视觉等。它描述了两个不同视点(摄像机或传感器)拍摄的同一场景中的特征点之间的几何关系。
对极几何的关键概念包括以下几个方面:
对极线(Epipolar Lines):对极线是两个视点之间的直线,它们与每个视点中的特征点相对应。具体来说,对于一对视点,每个视点中的特征点都会在另一个视点中形成一条对极线。这是对极几何的核心概念之一。
本质矩阵和基本矩阵(Essential Matrix and Fundamental Matrix):这些矩阵描述了两个视点之间的关系,包括了对极几何的所有信息。本质矩阵通常用于立体视觉问题,而基本矩阵则用于双目视觉和多视图几何问题。这些矩阵可以用于计算两个视点之间的相对运动和特征点的对应关系。
极点(Epipole):极点是一个特殊的点,它与两个视点之间的基本矩阵相关。极点表示了在一个视点中看到的另一个视点的位置。
对极约束(Epipolar Constraint):对极约束是指特征点在两个视点中的对应关系必须满足的数学关系。它表明了特征点的对极线必须通过另一个视点中的对应点。
对极几何的应用包括:
立体视觉:通过对极几何,可以确定两个相机之间的相对位置和姿态,从而实现三维场景的重建和深度估计。
双目视觉:用于双目摄像头的视差计算和立体匹配。
多视图重建:用于从多个视点的图像中还原三维场景的几何和拓扑结构。
运动估计:用于跟踪目标物体在多个视点之间的运动。
对极几何是计算机视觉中的基础概念,对于理解多视图系统和解决相关问题非常重要。它为从多个视点观察场景提供了强大的工具,以便于定位、测量和理解三维世界。
本质矩阵(Essential Matrix)是在计算机视觉中用于处理双目视觉和立体视觉问题的重要数学工具。它描述了两个相机或视点之间的几何关系,包括它们的相对姿态和尺度。本质矩阵用于将图像上的特征点从一个相机的坐标系映射到另一个相机的坐标系,从而使得双目视觉和立体视觉中的匹配和深度估计问题得以解决。
本质矩阵的表示如下:
E = [t]xR
其中:
本质矩阵的求解通常涉及到以下步骤:
特征点匹配:首先,在两个视点的图像中检测和匹配特征点,这些特征点在两个图像中表示同一场景中的相同点。
相机标定:进行相机的标定,以获得相机的内参矩阵,包括焦距和主点等参数。这些参数用于将像素坐标转化为归一化相机坐标。
本质矩阵估计:通过已知的特征点匹配,可以估计本质矩阵。最常见的方法是使用八点法(Eight-Point Algorithm)。这个算法需要至少8对特征点的匹配,但通常会使用更多以提高准确性。
本质矩阵分解:获得本质矩阵后,可以对其进行分解,以获得相机的相对姿态(旋转矩阵 R 和平移矢量 t)。这通常涉及到奇异值分解(Singular Value Decomposition,SVD)等技术。
尺度恢复:由于本质矩阵无法确定相机之间的尺度关系,通常需要额外的信息或约束来恢复尺度。例如,通过三角测量或使用运动估计信息可以恢复尺度。
总结来说,本质矩阵的求解是通过特征点匹配、相机标定、估计和分解本质矩阵等步骤完成的。一旦获得了本质矩阵,就可以用于解决双目视觉和立体视觉中的多种问题,包括深度估计、三维重建和物体姿态估计等。
单应矩阵(Homography Matrix),也称为单应性变换矩阵,是计算机视觉中的一种重要数学工具,用于描述平面到平面的投影变换。单应矩阵通常用于处理视觉任务,如图像拼接(image stitching)、相机校准(camera calibration)、虚拟现实(virtual reality)以及平面物体的姿态估计等。单应矩阵表示了两个平面之间的映射关系。
在二维空间中,一个单应矩阵 H 是一个 3x3 的矩阵,表示平面上的点 P(x, y, 1)到另一个平面上的点 P’(x’, y’, 1)之间的映射关系:
[x'] [h11 h12 h13] [x]
[y'] = H * [h21 h22 h23] * [y]
[1 ] [h31 h32 h33] [1]
其中,H 是单应矩阵,(x, y, 1) 是原始平面上的点,(x’, y’, 1) 是映射到目标平面上的点。
单应矩阵的求解通常涉及以下两个情况:
已知对应点的情况:如果已知原始平面上的点和目标平面上的对应点,可以使用最小二乘法等方法来估计单应矩阵 H。这个问题通常被称为单应矩阵估计。
通过相机标定的情况:在相机标定过程中,也可以估计单应矩阵。相机标定通常涉及将真实世界中的三维点映射到图像平面上,这需要使用单应矩阵来描述相机的投影。
对于已知对应点的情况,单应矩阵可以通过以下步骤估计:
收集对应点:获取原始平面和目标平面上的一组对应点。
构建方程组:使用这些对应点构建线性方程组,其中每个对应点会生成两个方程。
求解方程组:通过最小二乘法或奇异值分解(SVD)等数值方法,求解方程组,以得到单应矩阵 H。
需要注意的是,单应矩阵 H 的求解通常需要至少4对对应点。如果有更多的对应点,可以提高估计的准确性。
一旦估计得到单应矩阵 H,就可以使用它来进行平面到平面的投影变换,从而实现各种计算机视觉任务,如图像拼接、姿态估计、虚拟现实等。
三角测量是一种在计算机视觉、测量学和地理信息系统中常用的技术,用于确定相机或传感器与物体之间的距离或位置信息。这种技术基于三角形的几何原理,通过测量一些已知长度和角度来计算未知距离或位置。
三角测量的基本原理如下:
三角形几何:假设有一个直角三角形,其中一个角是直角,另外两个角分别是已知的角度。我们可以测量这两个已知角度的值,以及与这些角度相关的一边的长度。
三角形相似性:根据三角形的相似性原理,如果两个三角形的一个角相等,并且它们的对应边成比例,那么这两个三角形是相似的。在三角测量中,我们通常使用相似三角形的性质来计算未知距离或位置。
角度和边的测量:为了进行三角测量,我们需要测量至少一个已知角度和一个已知长度。这可以通过测量传感器或相机到目标物体的角度(如视差角)以及已知的基线长度来实现。
三角测量计算:一旦测量了必要的角度和长度,我们可以使用三角形的相似性原理来计算未知的距离或位置。这通常涉及到使用正弦、余弦或其他三角函数来解决三角形的边和角之间的关系。
应用领域:
需要注意的是,三角测量通常要求准确测量已知的角度和长度,以获得准确的距离或位置估计。任何测量误差都可能导致较大的误差,因此在实际应用中需要谨慎处理测量和计算过程。
本质矩阵(Essential Matrix)是一个3x3的矩阵,它有9个元素。然而,本质矩阵具有特定的约束条件,因此它的自由度实际上不是9,而是5。这是因为本质矩阵中的元素受到以下约束的限制:
矩阵的秩为2:本质矩阵的秩必须等于2,这意味着矩阵的元素之间存在线性依赖关系。这是由于本质矩阵表示了两个相机之间的相对运动,其中一个相机的位置和旋转可以被表示为线性组合。
对称性:本质矩阵是对称的,这意味着它的元素在主对角线上对称。
行列式为零:本质矩阵的行列式为零,即|E| = 0。这个条件与秩为2相关,并强化了矩阵元素之间的线性依赖关系。
因此,虽然本质矩阵有9个元素,但由于这些约束条件,只有5个元素是独立的。这意味着只需要5个独立的参数来描述两个相机之间的相对运动关系,例如相机的平移和旋转。
直接法求解本质矩阵通常是一个线性方程组求解问题,它涉及到一组对应点的匹配,以及相机的内参矩阵。当你解这个线性方程组时,的确会得到一个解空间,其中包括零解和非零解。在这个上下文中,我们关心的是非零解,因为零解表示两个相机之间的运动是平凡的(没有相对运动)。
解空间中的非零解表示了两个相机之间可能的相对运动。然而,要选择哪一个解,通常需要附加信息或约束。这些约束可能来自于问题的背景知识、相机的运动约束或其他场景信息。
在实际的计算机视觉应用中,通常使用RANSAC(随机抽样一致性)等方法来估计本质矩阵,并根据约束条件筛选解。RANSAC可以帮助排除错误的解,从而选择最适合问题背景和数据的解。
总的来说,选择哪一个解取决于具体的应用和问题背景,通常需要使用附加信息或算法来确定最佳解。这也强调了在计算机视觉中使用本质矩阵时,需要谨慎处理约束和选择解的问题。
根据针孔相机成像原理,相机坐标系下P(X,Y,Z)点投影在像平面上坐标为:
[ x y f ] = 1 Z [ f x 0 0 0 f y 0 0 0 f ] [ X Y Z ] \left[\begin{matrix}x\\y\\f\\\end{matrix}\right]\ =\frac{1}{Z}\ \left[\begin{matrix}f_x&0&0\\0&f_y&0\\0&0&f\\\end{matrix}\right]\left[\begin{matrix}X\\Y\\Z\\\end{matrix}\right] xyf =Z1 fx000fy000f XYZ
但是一般会省略这个焦距,让其变为1(大多说这里是使用齐次坐标,个人感觉这说不通,齐次坐标是为了矩阵运算的维度相等,加的一个1,但这个是直接替换。个人认为是二维平面上第三个坐标本来没有意义,所以直接省略了)。
然后,转为像素坐标,即在OpenCV中处理的格式:
[ u v 1 ] = 1 Z [ f x 0 c x 0 f y c y 0 0 1 ] [ X Y Z ] \left[\begin{matrix}u\\v\\1\\\end{matrix}\right]\ =\frac{1}{Z}\ \left[\begin{matrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\\\end{matrix}\right]\left[\begin{matrix}X\\Y\\Z\\\end{matrix}\right] uv1 =Z1 fx000fy0cxcy1 XYZ
最后使用归一化坐标,化为最简形式。就是使用P点的投影在距离光心,深度为1m的地方的坐标,来进行像素坐标计算:
[ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ X Y 1 ] \left[\begin{matrix}u\\v\\1\\\end{matrix}\right]\ =\ \left[\begin{matrix}f_x&0&c_x\\0&f_y&c_y\\0&0&1\\\end{matrix}\right]\left[\begin{matrix}X\\Y\\1\\\end{matrix}\right] uv1 = fx000fy0cxcy1 XY1