[特征提取与匹配]基于Open CV使用SIFT提取特征,并使用FLANN完成单应性匹配

关于单应性

单应性:当一张图是另一张图的一个透视畸变时,在两张图中寻找彼此的一种情况

实现步骤

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值