python计算机视觉编程——基础矩阵和对极几何

本文介绍了基础矩阵在计算机视觉中的作用,详细阐述了其原理、几何推导、性质和估算方法。通过实验,探讨了不同点数(7点、8点、10点)对基础矩阵计算的影响,并分析了如何绘制极点和极线,强调了匹配点数量对结果精度和稳定性的重要性。


此次实验的内容主要有关于基础矩阵的内容,与教材《python计算机视觉编程》衔接。

一、基础矩阵原理

用两个相机在不同位置拍摄同一物体,两张照片中的景物有重叠部分,那么理论上这两张照片会存在一定的对应关系即外极几何。

1.1原理定义

两幅视图存在两个关系:第一种,通过对极几何一幅图像上的点可以确定另外一幅图像上的一条直线;另外一种,通过上一种映射,一幅图像上的点可以确定另外一幅图像上的一个点,这个点是第一幅图像通过光心和图像点的射线与一个平面的交点在第二幅图像上的影像。第一种情况可以用基础矩阵来表示,第二种情况则用单应矩阵来表示。而本质矩阵则是基础矩阵的一种特殊情况,是在归一化图像坐标下的基础矩阵。

基础矩阵(Fundamental Matrix)

基础矩阵体现了两视图几何(对极几何,epipolar geometry)的内在射影几何(projective geometry)关系,基础矩阵只依赖于摄像机的内参KK和外参R,tR,t。
在这里插入图片描述

1.2几何推导

首先在几何层面对上述一个图像上的点到另外一个图像上的对极线的映射关系进行分析。可以把这个映射分成两个步骤:

1.点到平面的转移

存在一个不经过两个相机光心的的平面ππ,光心OO与xx的射线与平面ππ相交与一点XX。该点XX又投影到第二幅图像平面上的点x′x′。这个称为点xx通过平面ππ的转移。点xx,x′x′是平面ππ上的3D点XX在两个相机平面上的像。对应每一个3D点XX都存在一个2D的单应HπHπ把每一个xx映射到x′x′。

2.对极线的构造

已知第二幅图像上的对应点x′x′,再加上对极点e′e′我们可以构造对极线l′=e′×x′=[e′]×x′l′=e′×x′=[e′]×x′(这里的[e′]×[e′]×是叉乘矩阵)。由于x′x′可以表示为x′=Hπxx′=Hπx,则有:

				l′=[e′]×Hπx=Fx
				l′=[e′]×Hπx=Fx

基本矩阵可以记作为F=[e′]×HπF=[e′]×Hπ,其中HπHπ是一幅图像到另外一幅图像通过任意平面ππ的转移映射。因为[e′]×[e′]×的秩是2,HπHπ的秩是3,因此FF是秩为2的矩阵。

从几何角度来讲,F矩阵表示了第一幅图像的2维射影平面P2P2到通过对极点e′e′的对极线束的映射,是从2维到1维的射影空间的映射,因此秩为2。
在这里插入图片描述

1.3基础矩阵性质

(1) 基础矩阵是秩为2、自由度为7的齐次矩阵。(3×3其次矩阵有8个独立比率,还有一个满足约束detF=0的约束,所以再减去一个自由度)
(2)若x与x’是两幅图上的对应点,那么x′TFx=0。
(3)l’是对应于x的对极线,l′=Fx。
(4)若e是第二个摄像机光心在第一幅图像上的极点,那么Fe=0 。

1.4基础矩阵估算方法

八点估算法
基本矩阵是由该方程定义的:
x′TFx=0
其中x↔x′是两幅图像的任意一对匹配点。由于每一组点的匹配提供了计算F系数的一个线性方程,当给定至少7个点(3×3的齐次矩阵减去一个尺度,以及一个秩为2的约束),方程就可以计算出未知的F。我们记点的坐标为x=(x,y,1)T,x′=(x′,y′,1)T
又因为F为:
在这里插入图片描述
所以可得到方程:
在这里插入图片描述
即相应方程式为
在这里插入图片描述
给定n组点的集合,我们有如下方程:
在这里插入图片描述
如果存在确定(非零)解,则系数矩阵A的秩最多是8。由于F是齐次矩阵,所以如果矩阵A的秩为8,则在差一个尺度因子的情况下解是唯一的。可以直接用线性算法解得。

如果由于点坐标存在噪声则矩阵AA的秩可能大于8(也就是等于9,由于A是n×9的矩阵)。这时候就需要求最小二乘解,这里就可以用SVD来求解,f的解就是系数矩阵A最小奇异值对应的奇异向量,也就是A奇异值分解后A=UDVT中矩阵V的最后一列矢量,这是在解矢量f在约束∥f∥下取∥Af∥最小的解。以上算法是解基本矩阵的基本方法,称为8点算法。

上述求解后的F不一定能满足秩为2的约束,因此还要在F的基础上加以约束。通过SVD分解可以解决,令F=UΣVT,则
在这里插入图片描述
因为要秩为2,所以取最后一个元素强制设置为0,则令:
在这里插入图片描述

最终的解为:在这里插入图片描述

二、实验测试

2.1实验要求

实验一.分别用七点、八点、十点(匹配点),计算基础矩阵
实验图片包含三种情况,即
(1)左右拍摄,极点位于图像平面上
(2)像平面接近平行,极点位于无穷远
(3)图像拍摄位置位于前后
实验二. 针对上述情况,画出极点和极线,其中点坐标要均匀分布于各行

2.2.1实验一

2.2.1.1代码

from PIL import Image
from numpy import *
from pylab import *
import numpy as np

import PCV.geometry.camera as camera
import PCV.geometry.homography as homography
import PCV.geometry.sfm as sfm
import PCV.localdescriptors.sift as sift

image1='E:/thirddown/computervision/data/fun/image6.jpg'
im1 = array(Image.open(image1))
sift.process_image(image1, 'im1.sift')
l1, d1 = sift.read_features_from_file('im1.sift')

image2='E:/thirddown/computervision/data/fun/image7.jpg'
im2 = array(Image.open(image2))
sift.process_image(image2, 'im2.sift')
l2, d2 = sift.read_features_from_file('im2.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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值