本代码将使用SIFT特征检测和FLANN匹配器来比较两枚指纹是否与模板指纹匹配。
模板指纹
需要匹配的指纹
1.定义显示图像的函数
import cv2
def cv_show(name, img):
cv2.imshow(name, img)
cv2.waitKey(0)
2.定义计算匹配点个数的函数
def verification(src, model):
sift = cv2.xfeatures2d.SIFT_create() # 创建一个SIFT检测器对象,用于检测图像中的关键点
kp1,des1 = sift.detectAndCompute(src, None)
kp2,des2 = sift.detectAndCompute(model, None)
# 对src和model图像分别检测关键点和计算描述符。关键点存储在kp1和kp2中,描述符存储在des1和des2中
flann = cv2.FlannBasedMatcher() # 创建一个FLANN匹配器对象,用于高效地匹配描述符
matches = flann.knnMatch(des1, des2, k = 2)
# 使用FLANN匹配器对des1和des2进行K近邻匹配,k=2表示为每个描述符找到两个最近邻
ok = []
for m,n in matches:
if m.distance < 0.8 * n.distance:
ok.append(m)
#通过距离比率测试筛选匹配点,只有当最佳匹配的距离小于次佳匹配距离的0.8倍时,才认为是一个良好的匹配,并将这些匹配存储在列表ok中
num = len(ok)
if num >= 500:
result = "认证通过"
else:
result = "认证失败"
# 计算好的匹配点的数量,并根据数量是否大于等于500来判断认证是否通过
return result
3.调用函数
if __name__ == "__main__":
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)
print('模板1的结果:', result1)
result2 = verification(src2, model)
print('模板2的结果:', result2)
# 对每张源图像src1和src2与模板图像model调用verification函数,打印出匹配结果