关于单应性
单应性:当一张图是另一张图的一个透视畸变时,在两张图中寻找彼此的一种情况
实现步骤
- 导入需要的库;
- 读取两张灰度图像作为匹配对象;
- 创建SIFT对象,用于检测SIFT特征点并计算描述子;
- 在两张图像中分别检测SIFT特征点,并计算每个特征点的描述子,即将其转换为若干长度固定的向量;
- 自定义参数执行基于FLANN的匹配。FLANN是一种快速最近邻搜索算法,可以在高维空间中快速搜索最相似的数据点。这里指定使用FLANN索引类型为KDTREE,并指定树的数量为5;
- 指定搜索参数,其中checks表示执行检查或者遍历的次数。checks越大,可以提供的精度也就越高,但是计算成本也就更高;
- 使用FlannBasedMatcher对象对两组SIFT描述子之间进行k近邻匹配,返回值为列表的列表,每个内部列表至少包含一个匹配项,且不超过k个匹配项,各匹配项从最佳(最短距离)到最差依次排序;
- 应用乘数为0.7的劳氏比率检验,剔除不稳定的匹配对。这是一种基于距离比值来剔除不稳定匹配对的方法,可以排除掉一些明显不合理的匹配对;
- 至少需要10个好的匹配点才能进行透视变换;
- 将good_matches中的特征点转换为numpy数组形式,并重塑为三维形式;
- 寻找单应性,计算变换矩阵M和掩模mask。cv2.findHomography方法可以将源图像中的四边形映射到目标图像中的四边形,从而计算出变换矩阵。其中RANSAC算法是一种随机抽样一致性算法,用于估计基础矩阵或单应性矩阵等模型参数;
- 在图像img1中绘制所有与img0匹配的线段。通过透视变换,可以将img0的四个角映射到img1中,并计算出新的四个角坐标dst_corners;
- 在图像img1中绘制由两个点(x0, y0)和(x1, y1)组成的线段,颜色为白色,粗细为3。这里使用cv2.line方法绘制线段;
- 显示绘制结果。
Code
import numpy as np
import cv2
from matplotlib import pyplot as plt
MIN_NUM_GOOD_MATCHES = 10
img0 = cv2.imread('other/B11643_6_15.png',
cv2.IMREAD_GRAYSCALE)
img1 = cv2.imread('other/B11643_6_16.png',
cv2.IMREAD_GRAYSCALE)
cv2.imshow("result", img0)
cv2.waitKey()
# Perform SIFT feature detection and description.
sift = cv2.xfeatures2d.SIFT_create()
kp0, des0 = sift