一、案例整体介绍
- 下图中上面一张指纹图片与下面两张图片中的其中一个指纹是同一个指纹
- 分别将上面的指纹图片与下面的两张图片进行匹配验证
- 在model(模板指纹图片)与验证的两张指纹图片的2次匹配中,分别需要提取出模板指纹图片与验证指纹图片的特征(特征检测),并检测关键点和计算描述符
- 对检测出的描述符进行匹配,满足匹配阈值的要求则匹配成功
二、代码解释
-
进行匹配验证的三个关键步骤如下:
- 1.计算特征描述符 :使用如SIFT特征检测器 和描述子来计算图像中的特征点和对应的描述符。
- 以下链接中的文章有对SIFT特征检测 的介绍和实现方法
- 2.创建匹配器 :使用 cv2.BFMatcher() 创建一个暴力匹配器实例
- 3.进行KNN匹配 :使用 knnMatch() 方法(实际上是BFMatcher的knnMatch()方法)来找到每个特征点的K个最佳匹配。
- 1.计算特征描述符 :使用如SIFT特征检测器 和描述子来计算图像中的特征点和对应的描述符。
-
完整代码
pythonimport cv2 # 定义显示图片的函数 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) # 创建BFMatcher暴力匹配器 BF = cv2.BFMatcher() # 使用k近邻匹配(des1中的每个描述符与des2中的最近2个描述符进行匹配) matches = BF.knnMatch(des1, des2, k=2) ok = [] # 用于存储被认为是"好"的匹配对(即满足最近距离与次近距离比值条件的匹配对) for m, n in matches: # 使用了固定的距离比率阈值(这里设为 0.8)来判断匹配的是否足够好,这个值可能需要根据具体图片数据进行调整 if m.distance < 0.8 * n.distance: ok.append(m) # 统计通过筛选的匹配数量 num = len(ok) if num >= 500: # 如果有500及以上个最佳匹配结果则为匹配成功,这个值也需要根据图片数据和实际情况进行调整 result = "认证通过" else: result = "认证失败" return result """ 读取三张指纹图片并显示 """ src1 = cv2.imread("src1.bmp") cv_show('src1', src1) src2 = cv2.imread('src2.bmp') cv_show('src2', src2) model = cv2.imread('model.bmp') cv_show('model', model) """ 调用验证函数将两张验证图片与模板图片进行验证 """ result1 = verification(src1, model) result2 = verification(src2, model) print("src1验证结果为:", result1) print("src2验证结果为:", result2)
-
验证结果如下: