计算机视觉——基础矩阵与对称几何

本文详细介绍了计算机视觉中的基础矩阵概念,包括基础矩阵的定义、八点法及其优缺点,以及如何通过归一化八点法进行计算。还通过实验展示了估算基础矩阵、确定外极点和外极线的过程,分析了实验结果并提出了改善匹配精度的方法。
摘要由CSDN通过智能技术生成

一、实验任务

二、基础矩阵和八点法

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,
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值