一、实验任务
二、基础矩阵和八点法
1.基础矩阵
2.八点法
三、实验内容
1、估算基础矩阵
2、外极点和外极线
一、实验任务:
1.求解图像之间的基础矩阵
要求:分别用七点、八点、十点(匹配点),计算基础矩阵
实验图片包含三种情况,即(1)左右拍摄,极点位于图像平面上(2)像平面接近平行,极点位于无穷远(3)图像拍摄位置位于前后
2.针对上述情况,画出极点和极线,其中点坐标要均匀分布于各行
二、基础矩阵与八点法
1.基础矩阵:
在三维空间中,与成像平面上的位置x对应的场景点可以位于这条线上的所有位置。这说明如果要根据图像中的一个点找到另一幅图像中对应的点,就需要在第二个成像平面上沿着这条线的投影搜索,这条线称为对、极线,在这里是 l’ 。另外,所有的对极线都通过同一个点,这个点成为极点,这是图中的 e 和 e’。那么这时,出来了一个矩阵F,称为基础矩阵。
基础矩阵
一个场景中的一个空间点在不同视角下的像点存在一种约束关系,称为对极约束。基础矩阵就是这种约束关系的代数表示。它具体表示的是图像中的像点 p1 到另一幅图像对极线 l2 的映射,有如下公式
而和像点 p1 匹配的另一个像点 p2必定在对集线 l2上,所以有
基础矩阵是一个 3x3 的矩阵,且使用的是齐次坐标系,所以可以用8个匹配的特征点来求解出基础矩阵F。这种方法称为8点法(Eight-Point-Algorithm)。在数学上,所有对极线都穿过极点,对矩阵产生了一个约束条件。使用这个约束条件,可以只用7组匹配点进行计算。用术语来讲,就是基础矩阵有7个自由度。相应这种方法称为7点法。
2.八点法
优点: 线性求解,容易实现,运行速度快 . 缺点:对噪声敏感
改进:归一化八点法
归一化操作步骤:
对点进行平移使其形心位于原点。
对点进行缩放,使它们到原点的平均距离为√ 2
对两幅图像独立进行上述变换
左边是原始图像的坐标,右边是归一化后的坐标,H是归一化的变换矩阵,可记为如下形式:
其中μ¯¯,ν¯ 是图像像点坐标两个分量的平均值
S 表示尺度,其表达式为:
三、实验内容
1.实验一:估算基础矩阵
步骤:
导入两幅图像,并使用sift算法提取特征;
使用函数match_twosided连接两幅图的特征;
RANSAC去除错误点匹配;
归一化8点算法估计基础矩阵。这是通过对应点来计算基础矩阵的算法。
代码实现:
# -*- coding: utf-8 -*-
from PIL import Image
from numpy import *
from pylab import *
import numpy as np
from PCV.geometry import camera
from PCV.geometry import homography
from PCV.geometry import sfm
from PCV.localdescriptors import sift
# -*- coding: utf-8 -*-
im1 = array(Image.open('picture/test/1.jpg'))
im2 = array(Image.open('picture/test/2.jpg'))
sift.process_image('picture/test/1.jpg', 'im1.sift')
l1, d1 =sift.read_features_from_file('im0.sift')
sift.process_image('picture/test/2.jpg', 'im2.sift')
l2, d2 =sift.read_features_from_file('im1.sift')
matches = sift.match_twosided(d1, d2)
ndx = matches.nonzero()[0]
x1 = homography.make_homog(l1[ndx, :2].T)
ndx2 = [int(matches[i]) for i in ndx]
x2 = homography.make_homog(l2[ndx2, :2].T)
d1n = d1[ndx]
d2n = d2[ndx2]
x1n = x1.copy()
x2n = x2.copy()
figure(figsize=(16,16))
sift.plot_matches(im1, im2, l1, l2, matches, True)
show()
def F_from_ransac(x1, x2, model, maxiter=5000, match_threshold=1e-6):
""" Robust estimation of a fundamental matrix F from point
correspondences using RANSAC (ransac.py from
http://www.scipy.org/Cookbook/RANSAC).
input: x1, x2 (3*n arrays) points in hom. coordinates. """
from PCV.tools import ransac
data = np.vstack((x1, x2))
d = 10 # 20 is the original
# compute F and return with inlier index
F, ransac_data = ransac.ransac(data.T, model,
8, maxiter, match_threshold,