极线几何
1. 使用同一相机,在两个不同的位姿分别拍摄同一个棋盘格,然后使用本质矩阵估计两次拍摄间的平移和旋转。
代码如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 加载图片
img1 = cv2.imread('imgl.jpg', 0)
img2 = cv2.imread('imgr.jpg', 0)
# 初始化SIFT方法
sift = cv2.xfeatures2d_SIFT.create()
# 获取关键点和描述子
k1, d1 = sift.detectAndCompute(img1, None)
k2, d2 = sift.detectAndCompute(img2, None)
# 设置FLANN 超参数
FLANN_INDEX_KDTREE = 0
# K-D树索引超参数
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
# 搜索超参数
search_params = dict(checks=50)
# 初始化FlannBasedMatcher匹配器
flann = cv2.FlannBasedMatcher(index_params, search_params)
# 通过KNN的方式匹配两张图的描述子
matches = flann.knnMatch(d1, d2, k=2)
good = []
pts1 = []
pts2 = []
# 筛选比较好的匹配点
for i, (m, n) in enumerate(matches):
if m.distance < 0.8 * n.distance:
good.append(m)
pts2.append(k2[m.trainIdx].pt)
pts1.append(k1[m.queryIdx].pt)
# 计算基础矩阵
pts1 = np.int32(pts1)
pts2 = np.int32(pts2