SIFT特征匹配实战:KNN算法实现指纹认证

这个利用了前面学到的SIFT特征检测来实现的,然后这里主要就是引入了一个新的匹配器。这里

匹配是用KNN算法进行匹配的。下面来看下细节。

介绍函数

由于要频繁展示,所以这里定义了一个函数。

复制代码
def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)

导入图片

复制代码
if __name__ == "__main__":
    # 读取图像
    src1 = cv2.imread("zhiwen3.bmp")
    src2 = cv2.imread("zhiwen2.bmp")
    model = cv2.imread("zhiwen1.bmp")

    # 检查图像是否成功加载
    if src1 is None or src2 is None or model is None:
        print("错误: 无法加载图像文件")
    else:
        # 显示图像(需要指定窗口名称)
        cv_show('src1', src1)
        cv_show('src2', src2)
        cv_show('model', model)

        # 进行认证验证
        result1 = verification(src1, model)
        result2 = verification(src2, model)

        print("src1验证结果为:", result1)
        print("src2验证结果为:", result2)

可以看到这里导入了三张图片,一张目标图片,两张图片。然后打印出结果

匹配函数

def verification(src, model):

创建SIFT特征提取器

sift = cv2.SIFT_create()

这里创建了一个SIFT特征提取器,前面一篇文章讲过的。

检测关键点和计算描述符

kp1, des1 = sift.detectAndCompute(src, None) # 源图像 第二个参数 掩膜

kp2, des2 = sift.detectAndCompute(model, None) # 模板图像

然后这里返回了重要信息kp和des

kp

  • 位置信息 (pt):关键点在图像中的坐标位置 (x, y)(重要,后面要用来标注出匹配点)
  • 尺度信息 (size):关键点被检测到的尺度级别
  • 方向信息 (angle):关键点的主方向,用于实现旋转不变性
  • 响应强度 (response):表示该特征点的显著程度

des

描述符的特点​:

  • 通常是高维向量(如SIFT描述符是128维)
  • 描述了关键点周围区域的视觉外观
  • 对光照变化、旋转、尺度变化具有一定的不变性
  • 相似的图像区域会产生相似的描述符向量

检查是否有足够的特征点

if des1 is None or des2 is None or len(des1) < 2 or len(des2) < 2:

return "认证失败(特征点不足)"

检测看数量够不够匹配了,有时候特征太少,匹配不成功出现异常。

创建FLANN匹配器

flann = cv2.FlannBasedMatcher()

使用K近邻匹配

matches = flann.knnMatch(des1, des2, k=2)

建立了一个FLANN匹配器,用于直接传入两个的描述符的特点,然后就可以匹配了

应用Lowe's比率测试筛选优质匹配

good_matches = \[\]

for m, n in matches:

if m.distance < 0.7 * n.distance: # 通常使用0.7-0.8的比率

good_matches.append(m)

这里我们前面参数k=2,是检测我们这个点对应匹配两个点,然后去计算这两个点距离我们点的欧氏距离,然后得出如果两个距离很接近就说明我们点匹配失败。

统计优质匹配数量

num = len(good_matches)

得到匹配点的个数,这里也可以看作匹配度

可视化匹配结果(可选)

img_match = cv2.drawMatches(src, kp1, model, kp2, good_matches, None,

flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)

cv_show('匹配结果', img_match)

这里是可视化结果的一个方法。

根据匹配数量判断认证结果

if num >= 500: # 阈值可根据实际情况调整

result = "认证通过"

else:

result = "认证失败"

return f"{result} (匹配点: {num})"

总体代码

复制代码
import cv2
import numpy as np  # 需要添加此导入


def cv_show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)


def verification(src, model):
    # 创建SIFT特征提取器
    sift = cv2.SIFT_create()

    # 检测关键点和计算描述符
    kp1, des1 = sift.detectAndCompute(src, None)  # 源图像      第二个参数 掩膜
    kp2, des2 = sift.detectAndCompute(model, None)  # 模板图像

    # 检查是否有足够的特征点
    if des1 is None or des2 is None or len(des1) < 2 or len(des2) < 2:
        return "认证失败(特征点不足)"


    # 创建FLANN匹配器
    flann = cv2.FlannBasedMatcher()
    # 使用K近邻匹配
    matches = flann.knnMatch(des1, des2, k=2)

    # 应用Lowe's比率测试筛选优质匹配
    good_matches = []
    for m, n in matches:
        if m.distance < 0.7 * n.distance:  # 通常使用0.7-0.8的比率
            good_matches.append(m)

    # 统计优质匹配数量
    num = len(good_matches)

    # 可视化匹配结果(可选)
    img_match = cv2.drawMatches(src, kp1, model, kp2, good_matches, None,
                                flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
    cv_show('匹配结果', img_match)

    # 根据匹配数量判断认证结果
    if num >= 500:  # 阈值可根据实际情况调整
        result = "认证通过"
    else:
        result = "认证失败"

    return f"{result} (匹配点: {num})"


if __name__ == "__main__":
    # 读取图像
    src1 = cv2.imread("zhiwen3.bmp")
    src2 = cv2.imread("zhiwen2.bmp")
    model = cv2.imread("zhiwen1.bmp")

    # 检查图像是否成功加载
    if src1 is None or src2 is None or model is None:
        print("错误: 无法加载图像文件")
    else:
        # 显示图像(需要指定窗口名称)
        cv_show('src1', src1)
        cv_show('src2', src2)
        cv_show('model', model)

        # 进行认证验证
        result1 = verification(src1, model)
        result2 = verification(src2, model)

        print("src1验证结果为:", result1)
        print("src2验证结果为:", result2)
相关推荐
动物园猫3 分钟前
铁路障碍物目标检测数据集:4类别、5,500+张图像 | 目标检测
人工智能·目标检测·计算机视觉
ly-272534 分钟前
IEEE PDF eXpress终稿检测踩坑记录:PDF图片字体未嵌入与LaTeX参考文献编译异常解决方法
服务器·人工智能·算法
陕西企来客4 分钟前
2026年8月咸阳家用雨棚上门测量怎么选
大数据·人工智能·咸阳家用雨棚上门测量
夏文强4 分钟前
DeepSeek Harness SDK 集成:把 Agent 嵌进你的应用
人工智能·开源·大模型·agent·deepseek
志栋智能5 分钟前
凌晨3点的告警,如何用AI在5分钟内完成定界?
运维·服务器·数据库·人工智能·自动化
joinwell525 分钟前
工信部414号文深度解读:从模型供给走向应用交付
人工智能·企业数字化·行业分析
Everbrilliant899 分钟前
实时视觉感知实战:CameraX + OpenCV(C++/JNI) 实现多级联人脸检测与框选实物跟
opencv·实时人脸检测·多级联人脸检测·camshift实物跟踪·haar 级联检测器·多模型检测 + nms 聚类·camshift+多维特征验证
流浪00112 分钟前
大模型技术全景(五):开源大模型生态指南,Hugging Face 与魔搭社区
人工智能·深度学习·llm
yangmu320318 分钟前
DLSS 5:从“AI提帧”到“AI定义画质”的渲染革命
人工智能
Li Ming&21 分钟前
基于OpenCV+MediaPipe+PyGame的手势控制音乐播放器(Python实现)
人工智能·python·计算机视觉