首页 > 其他分享 >《深度学习》OpenCV 指纹验证、识别

《深度学习》OpenCV 指纹验证、识别

时间:2024-10-04 21:18:04浏览次数:12  
标签:src 匹配 验证 指纹 OpenCV 指纹图 model

目录

一、指纹验证

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 result


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)   # 放入函数进行判断
    result2 = verification(src2,model)
    print('src1验证结果为:',result1)
    print('src2验证结果为:',result2)

2、实现结果

调试模式:

三、指纹识别案例

1、展示指纹库图片

2、待验证指纹图

3、看完整代码

import re

import cv2
import numpy as np
import sys
import os


def 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 = 0
    for 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 = file
    ID = re.match(r'^(\d+)?\.([\S\s]+)$',name)[1]  # 正则匹配模版图片的文件名前缀
    if max < 100:   # src图片不一定是库里面人的指纹,判断匹配成功的数量是否小于100,小于则说明库里没有对应的指纹
        ID = 9999
    return 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)
        运行结果:

标签:src,匹配,验证,指纹,OpenCV,指纹图,model
From: https://blog.csdn.net/qq_64603703/article/details/142643928

相关文章

  • PbootCms后台登陆不显示验证码
    当使用PbootCMS后台登录时,如果验证码图片不显示,这通常是由于阿里云虚拟主机的配置问题导致的。以下是一些具体的解决步骤:解决方案检查PHP配置修改 php.ini 文件操作步骤1.登录阿里云控制台登录阿里云控制台登录阿里云官网,进入控制台。选择“虚拟主机”。进......
  • BitLocker加密C盘时:启动时需要附加身份验证
    BitLocker加密C盘时:启动时需要附加身份验证BitLocker加密C盘时显示如下错误信息:此设备无法使用受信任的平台模块。管理员必须在操作系统卷的“启动时需要附加身份验证”策略中设置“没有兼容的TPM时允许BitLocker”选项。BitLocker加密C盘时:启动时需要附加身份验证解决办法:Wind......
  • 在树莓派上安装c++版本的opencv并运行
     这里默认你用的是树莓派的镜像(因为ubantu对树莓派的性能占用有点大)树莓派安装使用opencvc++版本首先我们安装依赖sudoapt-getinstallbuild-essentialsudoapt-getinstallcmakelibgtk2.0-devpkg-configlibswscale-devsudoapt-getinstalllibjpeg-devlibpng......
  • win11,vc22源码编译opencv410
    1.安装cmake 2.配代理,否则无法下载依赖包3.自行编译OpenCV源码步骤4.注意配置系统变量,重启机器https://blog.csdn.net/weixin_50648158/article/details/139742826亲测可用OpenCV4.10.0在Windows10,64位,vs2022下的编译及配置方法https://blog.csdn.net/yxfamyself/article......
  • 织梦CMS后台登录验证码如何取消?
    如果你想取消织梦CMS后台登录时的验证码,可以通过以下步骤进行操作:1.下载并编辑 inc_safe_config.php 文件下载文件:使用FTP客户端连接到服务器。导航到网站根目录下的 DATA 文件夹。找到 safe/inc_safe_config.php 文件并下载到本地。编辑文件:使用文本编辑......
  • 【云原生安全篇】Cosign助力Harbor验证镜像实践
    【云原生安全篇】Cosign助力Harbor验证镜像实践目录1引言2概念2.1什么是Cosign?2.2为什么选择Cosign和Harbor?3实践:Cosign对Harbor中的镜像签名3.1环境准备3.2安装Cosign3.3使用Cosign对镜像进行签名3.3.1生成密钥对3.3.2推送镜像至Harbor3.3.3为......
  • 【进阶OpenCV】 (3)--SIFT特征提取
    文章目录sift特征提取一、基本原理二、特点三、代码实现1.函数方法2.检测图像中的关键点3.绘制关键点4.计算关键点描述符5.输出特征坐标点总结sift特征提取SIFT(Scale-InvariantFeatureTransform,尺度不变特征变换)特征检测是一种在图像处理和计算机视觉领域广......
  • 基于JAVA绘制验证码
    目录概要整体架构流程代码解释Java绘图注意事项:Swing演示效果概要        Java绘图通常指的是在Java应用程序中创建和显示图形、图像和其他视觉元素。        Swing是Java的一个图形用户界面工具包,它提供了一套丰富的组件来构建桌面应用程序,包括......
  • 【使用MLP在MANET中进行路由验证】使用多层感知神经网络进行移动自组网中的路由验证(Ma
      ......
  • 代码随想录算法训练营Day17 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜
    目录654.最大二叉树617.合并二叉树700.二叉搜索树中的搜索98.验证二叉搜索树654.最大二叉树题目654.最大二叉树-力扣(LeetCode)给定一个不重复的整数数组nums。最大二叉树可以用下面的算法从nums递归地构建:创建一个根节点,其值为nums中的最大值。递归地在......