• Python+OpenCV：对极几何(Epipolar Geometry) 理论 When we take an image using pin-hole camera, we loose an important information, ie depth of the image. Or how far is each point in the image from the...
Python+OpenCV：对极几何(Epipolar Geometry)
理论
When we take an image using pin-hole camera, we loose an important information, ie depth of the image.
Or how far is each point in the image from the camera because it is a 3D-to-2D conversion.
So it is an important question whether we can find the depth information using these cameras.
And the answer is to use more than one camera. Our eyes works in similar way where we use two cameras (two eyes) which is called stereo vision.
So let's see what OpenCV provides in this field.
(Learning OpenCV by Gary Bradsky has a lot of information in this field.)
Before going to depth images, let's first understand some basic concepts in multiview geometry.
In this section we will deal with epipolar geometry. See the image below which shows a basic setup with two cameras taking the image of same scene.

If we are using only the left camera, we can't find the 3D point corresponding to the point x in image because every point on the line OX projects to the same point on the image plane.
But consider the right image also. Now different points on the line OX projects to different points ( x′) in right plane.
So with these two images, we can triangulate the correct 3D point. This is the whole idea.
The projection of the different points on OX form a line on right plane (line l′). We call it epiline corresponding to the point x.
It means, to find the point x on the right image, search along this epiline.
It should be somewhere on this line (Think of it this way, to find the matching point in other image, you need not search the whole image, just search along the epiline.
So it provides better performance and accuracy). This is called Epipolar Constraint.
Similarly all points will have its corresponding epilines in the other image. The plane XOO′ is called Epipolar Plane.
O and O′ are the camera centers.
From the setup given above, you can see that projection of right camera O′ is seen on the left image at the point, e. It is called the epipole.
Epipole is the point of intersection of line through camera centers and the image planes.
Similarly e′ is the epipole of the left camera.
In some cases, you won't be able to locate the epipole in the image, they may be outside the image (which means, one camera doesn't see the other).
All the epilines pass through its epipole. So to find the location of epipole, we can find many epilines and find their intersection point.
So in this session, we focus on finding epipolar lines and epipoles.
But to find them, we need two more ingredients, Fundamental Matrix (F) and Essential Matrix (E).
Essential Matrix contains the information about translation and rotation, which describe the location of the second camera relative to the first in global coordinates.
See the image below (Image courtesy: Learning OpenCV by Gary Bradsky):

But we prefer measurements to be done in pixel coordinates, right?
Fundamental Matrix contains the same information as Essential Matrix in addition to the information about the intrinsics of both cameras so that we can relate the two cameras in pixel coordinates.
(If we are using rectified images and normalize the point by dividing by the focal lengths, F=E).
In simple words, Fundamental Matrix F, maps a point in one image to a line (epiline) in the other image.
This is calculated from matching points from both the images. A minimum of 8 such points are required to find the fundamental matrix (while using 8-point algorithm).
More points are preferred and use RANSAC to get a more robust result.
Epipolar Geometry in OpenCV
####################################################################################################
# draw Epilines
def drawlines(image1, image2, lines, pts1, pts2):
"""
函数功能: img1: image on which we draw the epilines for the points in img2.
lines: corresponding epilines.
"""
r, c = image1.shape
image1 = lmc_cv.cvtColor(image1, lmc_cv.COLOR_GRAY2BGR)
image2 = lmc_cv.cvtColor(image2, lmc_cv.COLOR_GRAY2BGR)
for r, pt1, pt2 in zip(lines, pts1, pts2):
color = (np.random.randint(0, 255), np.random.randint(0, 255), np.random.randint(0, 255))
x0, y0 = map(int, [0, -r[2] / r[1]])
x1, y1 = map(int, [c, -(r[2] + r[0] * c) / r[1]])
image1 = lmc_cv.line(image1, (x0, y0), (x1, y1), color, 1)
image1 = lmc_cv.circle(image1, tuple(pt1), 5, color, -1)
image2 = lmc_cv.circle(image2, tuple(pt2), 5, color, -1)
return image1, image2
####################################################################################################
# 对极几何(Epipolar Geometry)
def lmc_cv_epipolar_geometry():
"""
函数功能: 对极几何(Epipolar Geometry)。
"""

# find the list of best matches from both the images
sift = lmc_cv.SIFT_create()
# find the keypoints and descriptors with SIFT
keypoints1, descriptors1 = sift.detectAndCompute(image1, None)
keypoints2, descriptors2 = sift.detectAndCompute(image2, None)
# FLANN parameters
flann_index_kdtree = 1
index_params = dict(algorithm=flann_index_kdtree, trees=5)
search_params = dict(checks=50)
flann = lmc_cv.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(descriptors1, descriptors2, k=2)
pts1 = []
pts2 = []
# ratio test as per Lowe's paper
for i, (m, n) in enumerate(matches):
if m.distance < 0.8 * n.distance:
pts2.append(keypoints2[m.trainIdx].pt)
pts1.append(keypoints1[m.queryIdx].pt)

# find the Fundamental Matrix
pts1 = np.int32(pts1)
pts2 = np.int32(pts2)
ret, mask = lmc_cv.findFundamentalMat(pts1, pts2, method=lmc_cv.FM_LMEDS, ransacReprojThreshold=3, confidence=0.99,
maxIters=10)
# We select only inlier points

# find the epilines in both the images and draw them
# Find epilines corresponding to points in right image (second image) and drawing its lines on left image
lines1 = lmc_cv.computeCorrespondEpilines(pts2.reshape(-1, 1, 2), 2, ret)
lines1 = lines1.reshape(-1, 3)
image5, image6 = drawlines(image1, image2, lines1, pts1, pts2)
# Find epilines corresponding to points in left image (first image) and drawing its lines on right image
lines2 = lmc_cv.computeCorrespondEpilines(pts1.reshape(-1, 1, 2), 1, ret)
lines2 = lines2.reshape(-1, 3)
image3, image4 = drawlines(image2, image1, lines2, pts2, pts1)

stacking_images = []
# stacking images side-by-side
stacking_image = np.hstack((image5, image3))
stacking_images.append(stacking_image)

# 显示图像
for i in range(len(stacking_images)):
pyplot.figure('Epipolar Geometry %d' % (i + 1), figsize=(16, 9))
# pyplot.subplot(1, 1, 1)
pyplot.imshow(stacking_images[i], 'gray')
pyplot.title('Epipolar Geometry')
pyplot.xticks([])
pyplot.yticks([])
pyplot.savefig('%02d.png' % (i + 1))
pyplot.show()


展开全文
• 对极几何基本概念（The basic concept of Epipolar Geometry） 1.在这里，我专门挑了一个最为清晰明白的图片来表达我们要讲的对极几何，可以通过图片看出来对极几何一定对应着两张不同角度的视图，否则不能提供足够...
一.对极几何基本概念（The basic concept of Epipolar Geometry）
1.在这里，我专门挑了一个最为清晰明白的图片来表达我们要讲的对极几何，可以通过图片看出来对极几何一定对应着两张不同角度的视图，否则不能提供足够的信息来实现对极几何。  首先，我们先介绍一下在这里的基本概念： （1）相机位置（

O

O

和

O

′

O^{'}

）：代表相机在空间的位置。 （2）基线（

O

O

O

′

O^{'}

，BaseLine）：两个相机位置的连线为基线。 （3）对极线（

O

M

OM

和

O

′

M

O^{'}M

）：代表相机位置和图片之间的交线。 （4）对极平面（

O

O

′

M

OO^{'}M

）：代表着由基线

O

O

′

OO^{'}

与图像平面相交的平面。我觉得下面这张图片表达的更为有力，我们一起来看下图。
二.对极几何（Epipolar Geometry）
嗯，我们又来这张图片，下面让我们用公式来表示一下对极几何： （1）首先，我们将

M

(

x

,

y

,

z

)

M(x,y,z)

作为三维空间的点 （2）相机位置点为

O

O

和

O

′

O^{'}

（3）两个相机之间的位置关系可以有相机之间角度的旋转角度

R

R

和平移距离

T

T

来表示，举个例子也就是说

O

′

=

R

O

+

T

O^{'}=RO+T

（4）

K

，

K

′

K，K^{'}

分别代表在对应相机位置点

O

，

O

′

O，O^{'}

的相机内参矩阵 （5）

I

，

I

′

I，I^{'}

分别对应的像素点齐次坐标，通过特征提取和匹配获得 （6）通过以上给出的已知条件，我们可以简单的表达：

O

I

=

K

M

，

O

′

I

′

=

K

′

M

即

O

′

I

′

=

(

R

K

+

T

)

M

OI=KM ，O^{'}I^{'}=K^{'}M即{O^{'}I^{'}=(RK+T)M}

（7）接下来通过上述式子的求解，我们可以求出对应的

R

,

T

R,T

二.对极几何的约束条件（Constraints on Epipolar Geometry）
好吧，我们又来这幅图，（嗯，他画的很好~）
（1）我们可以看到，对极平面（

O

O

′

M

OO^{'}M

）其实是有五个位置点确认的一个平面，五个位置点分别为（

O

,

O

′

,

I

,

I

′

,

M

O,O^{'},I,I^{'},M

）简单来说由着五个点共面来约束现在的对极平面（

O

O

′

I

′

M

I

OO^{'}I^{'}MI

）
（2）对极约束（这么大是因为它重要，我们经常用到）

1）.对于单一相机位置1来说，我们观察位置原图像或者特征图的像素点

x

1

x_1

,并且我们不能确定该3D位置点的深度D。
2).现在我们考虑观测同一个3D点的第二个摄像机。从第一个摄像机可得知，该点必定位于3D空间中的一条特定光线上。进而第二幅图像中该点的投影位置x2必定位于第二幅图像中这条光线投影上的某个位置。三维空间中的光线在二维空间中的投影就是所谓的极线（绿色代表的线）。
3).这种几何关系告诉我们一些重要信息：对于第一幅图像中的任意点，其在第二幅图像中的对应点被限制在一条线上。这就是所谓的极线约束。而这条受约束的特定极线依赖于摄像机的内在参数和外在参数（也就是两个摄像机间的相对平移和旋转）。
（3）极点  极点其实就是相机位置1,2与图片（特征图）之间的交点，也就是基线12（BaseLine），也就说所有的光线都汇聚于第一个摄像机的光心1，所以极线必须汇聚于第二幅图像平面上的一个点。这是第一个摄像机的光心在第二个摄像机中的图像，称为极点，如上图所示

参考文献
【1】视觉SLAM十四讲
【2】Computer Vision：Model，Learning，and Inference
【3】中科院自动化所机器视觉PPT 【4】https://www.cnblogs.com/majiale/p/9306039.html

展开全文
• 对立体视觉建模的一种方法(约束)，使得立体匹配问题有一个最优解 X: 三维空间点(研究对象) C、C’: 两摄像机中心 x、x’: X在两摄像机成像平面的投影点 基线：两摄像机光心的连线 CC’ 对极点：一幅视图中另一个...
对立体视觉建模的一种方法(约束)，使得立体匹配问题有一个最优解

X: 三维空间点(研究对象) C、C’: 两摄像机中心 x、x’: X在两摄像机成像平面的投影点
基线：两摄像机光心的连线 CC’对极点：一幅视图中另一个摄像机中心的像(基线与两成像平面的交点) e、e’对极平面：包含基线的平面(以基线为轴转动) CXC’对极线：对极平面与成像平面的交点 xe、xe'
展开全文
• 计算机视觉中的计算几何--双目几何和多视几何，包含双目几何中的基础矩阵，核心，三视几何的三焦点张量...
• Epipolargeometry对极几何

千次阅读 2017-02-14 17:31:29
参考https://en.wikipedia.org/wiki/Epipolar_geometry#Epipolar_line对极几何是立体视觉几何。当两个相机从两个不同位置拍摄3D场景时，在3D点和2D映射之间会有一定的几何相关性，在图像点之间产生约束。这个关系是...
参考https://en.wikipedia.org/wiki/Epipolar_geometry#Epipolar_line
对极几何是立体视觉几何。当两个相机从两个不同位置拍摄3D场景时，在3D点和2D映射之间会有一定的几何相关性，在图像点之间产生约束。这个关系是基于针孔相机模型近似得到的。
对极几何最典型的应用场景如上图，用两个位于不同位置的相机拍摄同一个场景的不同视点，对极几何可以描述两个结果视点间的关系。
上图是针孔相机模型图。两个针孔相机看向点X，实际相机的像面位于焦点中心后面，生成了一幅关于透镜的焦点中心对称的图像。这个问题可以简化为在焦点中心前方放置一个虚拟像面来生成正立图像，而不需要对称变换得到。OL和OR表示两个相机透镜中心，X表示两个相机共同的目标点，XL和XR是点X在两像面上的投影。
epipolar points极点  每一个相机的透镜中心是不同的，会投射到另一个相机像面的不同点上。这两个像点用eL和eR表示，被称为epipolar points极点。两个极点eL、eR分别与透镜中心OL、OR在空间中位于一条直线上。
epipolar plane极面  将X、OL和OR三点形成的面称为epipolar plane极面。
epipolar line极线  直线OL-X被左相机看做一个点，因为它和透镜中心位于一条线上。然而，从右相机看直线OL-X，则是像面上的一条线直线eR-XR，被称为epipolar line极线。从另一个角度看，极面X-OL-OR与相机像面相交形成极线。  极线是3D空间中点X的位置函数，随X变化，两幅图像会生成一组极线。直线OL-X通过透镜中心OL，右像面中对应的极线必然通过极点eR。一幅图像中的所有极线包含了该图像的所有极点。实际上，任意一条包含极点的线都是由空间中某一点X推导出的一条极线。
如果两个相机位置已知，则：  1.如果投影点XL已知，则极线eR-XR已知，点X必定投影到右像面极线上的XR处。这就意味着，在一个图像中观察到的每个点，在已知的极线上观察到该点的其他图像。这就是Epipolar constraint极线约束：X在右像面上的投影XR必然被约束在eR-XR极线上。对于OL-XL上的X，X1，X2，X3都受该约束。极线约束可以用于测试两点是否对应同一3D点。极线约束也可以用两相机间的基本矩阵来描述。  2.如果XL和XR已知，他们的投影线已知。如果两幅图像上的点对应同一点X，则投影线必然交于X。这就意味着X可以用两个像点的坐标计算得到。
展开全文
• 对极几何（Epipolar Geometry）描述的是两幅视图之间的内在射影关系，与外部场景无关，只依赖于摄像机内参数和这两幅试图之间的的相对姿态。     1. 基线（baseline）：直线CC'为基线。 2. 对极平面束...
• 魏老师学生——Cecil：学习OpenCV-机器视觉之旅 基本概念代码演示 Aim: 学习多视角几何基础； 学习极点、极线、对极约束。 ...使用针孔相机时，由于是从3D到2D的转换，丢失大量信息，比如：图像深度、图像上点和...
• 先思考一个问题：用两个相机在不同的位置拍摄同一物体，如果两张...　要寻找两幅图像之间的对应关系，最直接的方法就是逐点匹配，如果加以一定的约束条件对极约束(epipolar constraint)，搜索的范围可以大大减小。
• Planar Homography （共面点成像）& Epipolar Geometry（对极几何）
• 先思考一个问题：用两个相机在不同的位置拍摄同一物体，如果两...　要寻找两幅图像之间的对应关系，最直接的方法就是逐点匹配，如果加以一定的约束条件对极约束(epipolar constraint)，搜索的范围可以大大减小。 　...
• 目录 1 基本概念 2 代码 1 基本概念 在我们使用针孔相机时，我们会丢失大量重要的信息，比如说图像的深度，或者说图像上的点和摄像机的距离，因这是一个从 3D 到 2D 的转换。因此一 个重要的问题就产生了，使用...
• 这一篇，要搞清楚两个概念，Planar Homography （共面点成像）& Epipolar Geometry（对极几何） Now，Start！ 先补充Homography的概念，简单来说 Homography（单应性），说的是投影的时候可以逆过来找， 比如,...
• Two images of a single scene/object are related by the epipolar geometry, which can be described by a 3x3 singular matrix called the essential matrix if images’ internal parameters are known, or the...
• epipolar geometry 对极几何介绍3.2. Essential Matrix3.3. Fundamental Matrix3.4. （Standard）Eight point Algorithm3.5. Normalized Eight point Algorithm3.6. Image Rectification 参考: ...
• 2D-2D:对极几何(epipolar geometry) 对极约束 现在，假设我们从两张图像中，得到了一对配对好的特征点，像图7-7里显示的那样。如果我们有若干对这样的匹配点，就可以通过这些二维图像点的对应关系，恢复出在两帧之间...
• 对极几何（Epipolar Geometry）是计算机视觉理论的基础，它描述了同一场景中两幅图像（2D-2D）之间的视觉几何关系，在图像匹配、三维重建等领域应用广泛。本文中将涉及到以下知识点： 对极约束（Epipolar ...
• 3.1. Epipoloar Geometry of Light Field Images 光场图像的对极几何 借鉴了前人的工作，我们设计了一个端到端的神经网络结构利用了光场几何特点来预测光场图像深度。因为光场图像有很多角度垂直和水平方向的像素，...
•  其中l prime 就是epipolar line, epipolar跟点p prime向量的乘积为0。 我下意识的就想，这个epipolar line的向量跟点向量的乘积为0，那就是垂直。但是怎么也证明不出来这俩垂直，而且还举了好多反例。 最后...
• 对极几何（Epipolar Geometry）是Structure from Motion问题中，在两个相机位置产生的两幅图像的之间存在的一种特殊几何关系，是sfm问题中2D-2D求解两帧间相机姿态的基本模型。 基本模型 其中c0、c1为两个相机...
• 官网https://docs.opencv.org/3.4.1/da/de9/tutorial_py_epipolar_geometry.html 基本概念 当我们使用针孔相机获取图像时候，会丢失一些重要的信息，例如：图像的深度，或者从图像上的点到摄像机的距离，因为这是从...

...