目录
一、指纹验证
1、什么是指纹验证
2、步骤
1)图像采集
2)图像预处理
3)特征提取
4)特征匹配
5)相似度比较
6)结果输出
二、案例实现
1、完整代码
2、实现结果
调试模式:
三、指纹识别案例
1、展示指纹库图片
2、待验证指纹图
3、看完整代码
运行结果:
一、指纹验证
1、什么是指纹验证
在OpenCV中,指纹验证是一种图像处理技术,用于识别和验证人类指纹。指纹是一种独特的生物特征,每个人的指纹都具有独特的纹路和图案。指纹验证使用这些独特的特征来确认一个人的身份。
指纹验证主要包括两个步骤:指纹图像的提取和指纹图像的匹配。
在指纹图像提取阶段,OpenCV会处理输入的图像,通过一系列的图像处理和特征提取算法,提取出指纹图像中的纹路和图案。
在指纹图像匹配阶段,OpenCV会将提取的指纹图像与一个或多个预先存储的指纹模板进行比对。比对过程中,OpenCV会计算两幅指纹图像之间的相似度,并根据相似度的阈值进行判断。
如果两幅指纹图像的相似度超过了设定的阈值,OpenCV将判断它们属于同一个人,否则判断它们属于不同的人。指纹验证可以应用于许多领域,如安全系统、身份识别和刑事调查等。
2、步骤
1)图像采集
通过摄像头或扫描仪等设备获取人的手指指纹图像。
2)图像预处理
对采集到的指纹图像进行预处理,包括图像增强、去噪、增强对比度等操作,以便更好地提取指纹特征。
3)特征提取
在预处理后的图像中提取指纹的特征,常用的方法包括细化、方向计算、特征点定位等。
4)特征匹配
将提取的指纹特征与预先存储的指纹模板进行匹配。匹配算法可以使用比对指纹特征向量之间的相似度,如欧氏距离、汉明距离等。
5)相似度比较
根据匹配得到的相似度进行比较,判断两幅指纹图像是否属于同一个人。可以根据设定的阈值进行判断,超过阈值则认为匹配成功,否则认为匹配失败。
6)结果输出
根据匹配结果输出验证结果,可以是通过图像显示、文本信息或其他方式进行输出。
二、案例实现
1、完整代码
import cv2
def cv_show(name, img):cv2.imshow(name,img)cv2.waitKey(0)def verification(src,model): # 判断src图与模版图片model一致性# 创建SIFT特征提取器sift = cv2.SIFT_create()kp1,des1 = sift.detectAndCompute(src,None) # 输入参数为图片、掩码图像,返回图片src的关键点坐标与关键点描述符kp2,des2 = sift.detectAndCompute(model, None) # 计算模版图片的关键点和描述符# 创建FLANN匹配器,FLANN是一个高效的算法,用于在大规模数据集中执行最近邻搜索flann = cv2.FlannBasedMatcher()# 使用k近邻匹配(des1中的每个描述符与des2中的最近两个描述符进行匹配)# 对des1中的每个描述符在des2中查找两个最近邻matches = flann.knnMatch(des1,des2,k=2) # 对待验证图与模版图进行匹配,返回匹配成功的点之间的欧式距离、测试图像的索引、样本图像的索引# distance:匹配的特征点描述符的欧式距离,数值越小也就说明俩个特征点越相近。
# queryIdx:测试图像的特征点描述符的下标(第几个特征点描述符),同时也是描述符对应特征点的下标。
# trainIdx:样本图像的特征点描述符下标,同时也是描述符对应特征点的下标。# 进行比较筛选ok = [] # 存放匹配成功的点的坐标for m,n in matches: # 遍历匹配成功点对应的两组欧氏距离,m为最近的一对点,n为次近的一对点# 根据lowe's比率测试,选择最佳匹配if m.distance < 0.8 * n.distance: # 判断如果最近的比上次近的大小小于0.8,那么认为这是个正确的匹配ok.append(m) # 将正确匹配的点存入列表# 统计逋过筛选的匹配数量num = len(ok)if num >= 500: # 判断如果匹配数量大于500,则认为匹配成功result = "认证通过"else:result = "认证失败"return resultif __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) # 放入函数进行判断result2 = verification(src2,model)print('src1验证结果为:',result1)print('src2验证结果为:',result2)
2、实现结果
调试模式:
三、指纹识别案例
1、展示指纹库图片
2、待验证指纹图
3、看完整代码
import reimport cv2
import numpy as np
import sys
import osdef getNum(src, model): # 输入待验证图与模版图img1 = cv2.imread(src)img2 = cv2.imread(model)sift = cv2.SIFT_create() # 创建sift特征提取器kp1,des1 = sift.detectAndCompute(img1, None) # 提取待验证图片和模版图的关键点和描述符信息kp2,des2 = sift.detectAndCompute(img2, None)flann = cv2.FlannBasedMatcher() # 建立Flann匹配器,其用来匹配大规模数据速度快matches = flann.knnMatch(des1,des2,k=2) # 使用匹配器的K近邻算法匹配待匹配图片与模版图片,匹配两个最近距离ok = []for m,n in matches: # 判断距离比例值是否小于0.8,是则将这一对点存入列表if m.distance < 0.8 *n.distance:ok.append(m)num = len(ok) # 返回匹配成功的匹配数目return num"""获取指纹编号"""def getID(src, database):max = 0for file in os.listdir(database): # 使用os.listdir读取database文件夹内的每一个文件model = os.path.join(database, file) # 智能的将database的路径和file的路径结合成一个新的路径num = getNum(src,model) # 将待验证图片src与提取出来的模版图model放入函数进行匹配,返回匹配成功的点的对数print("文件名:",file,"匹配数:",num)if num > max: # 判断匹配成功的个数并不断更新max的值max = num # 如果遇到最大匹配个数,那么将这个个数更新到max值,然后再更新模版图片的地址name = fileID = re.match(r'^(\d+)?\.([\S\s]+)$',name)[1] # 正则匹配模版图片的文件名前缀if max < 100: # src图片不一定是库里面人的指纹,判断匹配成功的数量是否小于100,小于则说明库里没有对应的指纹ID = 9999return ID # 返回对应的图片名称"""根据指纹编号,获取对应姓名"""
def getName(ID):nameID = {0:'张三',1:'李四',2:'王五',3:'赵六',4:'朱老七',5:'钱八',6:'曹九',7:'王二麻子',8:'andy',9:'Anna',9999:"没找到"}name = nameID.get(int(ID))return name"""主函数"""
if __name__ == '__main__':src = "src.BMP"database = "database"ID = getID(src, database)name = getName(ID) # 将得到的ID导入函数判断待验证指纹的人的姓名print("识别结果为:",name)