当前位置: 首页 > article >正文

【实战案例:基于特征匹配的指纹识别系统开发】

角点检测角点Corner是图像中在两个或多个方向上灰度值发生剧烈变化的点。这些点通常包含丰富的信息适用于特征匹配、目标跟踪、三维重建等任务。#------------------角点检测------------------------ #角点指图像中局部区域与周围区域有较大灰度变化的点或像素。 #角点指图像中局部区域与周围区域有较大灰度变化的点或像素。 # cornerHarris(img,blocksize,ksize, k[, dst[, borderType]])- dst # img:输入图像。 # blockSize:角点检测中要考虑的领域大小。 # ksize:Sobel求导中使用的窗大小。 # k: Harris角点检测方程中的自由参数,取值参数为[0.04,0.06]。 # dst:返回numpy.ndarray对象,大小和src相同,值越大,对应像素点是角的概率越高 img cv2.imread(phone.png) gray cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) dst cv2.cornerHarris(gray,4,3,0.04) #标记检测到的角点 img[dst 0.05 * dst.max()][0,0,255] # 这里通过对角点响应进行闽值处理标记出检测到的角点。 # 0.05 * dst.max() 是一个值大于这个值的像素点会被标记为红色。 cv2.imshow(img,img) cv2.waitKey(0)特征提取是指从原始数据中抽取关键信息将其转化为具有判别性的特征向量的过程。目的降低数据维度保留最相关的信息提高模型效率与泛化能力。#------------特征提取------------------ #检测图像中的关键点 #cv2.SIFT_create() #cv2.xfeatures2d.SIFT_create()#创建一个sift特征的提取对象 #sift.detect(img)在图像中查找关键点 phone cv2.imread(phone.png) phone_gray cv2.cvtColor(phone,cv2.COLOR_BGR2GRAY) sift cv2.SIFT_create()#sift对象 kp sift.detect(phone_gray) # kp.pt:关键点的(xy) # 坐标。 # kp.size:关键点的大小(尺度) # kp.angle:关键点的方间。 # kp.response:关键点的响应值。 # kp.octave:关键点所在的金字塔层级。 #查找关键点 #drawKeypoints(image,keypoints, outImage, colorNone, flagsNone) # image:原始图片 # keypoints:从原图中获得的关键点这也是画图时所用到的数 # outputimage:输出图像可以是原始图片也可以是None # color:颜色设置通过修改(b,g,r)的值,更改画笔的颜色b蓝色g绿色r红色。 # flags:绘图功能的标识设置 绘制富有信息的关键点。 phone_sift cv2.drawKeypoints(phone,kp,None,flagscv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow(phone,phone_sift) cv2.waitKey(0) # 使用sift.compute()计算关键点描述符,方便后期的特征匹配 kp,des sift.compute(phone,kp) print(np.array(kp).shape,des.shape) # 输出关键点的形状和描述待的形状。 # np.array(kp).shape表不关键点的数量和属性 # des.shape 表示描述符的数量和属性。运行结果基于 SIFT 特征匹配的图像验证程序核心用途是判断两张指纹或其他图像是否为同一目标核心流程读取待验证图像src1/src2和模板图像model→ 用SIFT提取所有图像的特征点特征描述符 → 用FLANN匹配器做K近邻匹配每个特征点找最近的2个匹配→ 通过Lowes比率测试0.8阈值筛选有效匹配 → 统计有效匹配数≥500则判定“认证通过”否则“认证失败”代码段功能cv_show(name,img)封装图像显示函数但注释了cv2.waitKey(0)是关键问题verification(src,model)核心验证函数完成特征提取、匹配、筛选、结果判定sift cv2.SIFT_create()创建 SIFT 特征提取器提取具有尺度 / 旋转不变性的特征点kp1,des1 sift.detectAndCompute(...)检测图像关键点 计算 128 维特征描述符匹配的核心依据flann cv2.FlannBasedMatcher()创建 FLANN 匹配器高效匹配特征描述符比暴力匹配快matches flann.knnMatch(des1,des2,k2)K 近邻匹配为 src 的每个特征点找 model 中最像的 2 个特征点if m.distance0.8*n.distanceLowes 比率测试过滤误匹配最佳匹配远优于次佳匹配才有效num 500自定义阈值匹配数足够多则判定为同一图像指纹认证通过主函数读取图像、调用验证函数、输出认证结果代码import cv2 def cv_show(name,img): cv2.imshow(name,img) # cv2.waitKey(0) def verification(src,model): #创建SIFT特征提取器 sift cv2.SIFT_create() #检测关键点和计算描述符特征向量源图像 kp1,des1sift.detectAndCompute(src,None) #检测关键点和计算描述符 模版图像 kp2,des2sift.detectAndCompute(model,None) #创建FLANN匹配器 flann cv2.FlannBasedMatcher() #使用K近邻匹配des1中的每个描述与des2中的最近两个描述进行匹配 matches flann.knnMatch(des1,des2,k2) #distance :匹配的特征点描述符的欧氏距离数值越小也就说明俩个特征点越相近 #queryIdx: 测试图像的特征描述的下标(第几个特征点描述符)同时也是描述符对应特征点的下标。 #也是描述符对应特征点的下标。 #进行比较筛选 ok [] for m,n in matches: #根据Lowes比率测试选择最佳匹配 if m.distance0.8*n.distance: ok.append((m,n)) #统计通过筛选的匹配数量 num len(ok) if num 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) result1verification(src1,model) result2verification(src2,model) print(src1验证结果为,result1) print(src2验证结果为,result2) cv2.waitKey(0) #运行结果实现一个自动化的指纹识别系统计算指纹匹配个数import os import cv2 计算两个指纹间匹配点的个数 def getNum(src,model): # 1. 读取指纹图像src待识别指纹路径model模板指纹路径 img1cv2.imread(src) img2cv2.imread(model) # 2. 创建SIFT特征提取器尺度不变特征变换抗旋转/尺度变化 siftcv2.SIFT_create() # 3. 检测关键点计算特征描述符128维向量匹配的核心依据 kp1,des1 sift.detectAndCompute(img1,None) kp2,des2 sift.detectAndCompute(img2,None) # 4. 创建FLANN匹配器高效近邻匹配适合大规模特征集 flann cv2.FlannBasedMatcher() # 5. K近邻匹配k2为每个特征点找最近的2个匹配 matches flann.knnMatch(des1,des2,k2) # 6. Lowes比率测试筛选有效匹配过滤误匹配 ok[] for m,n in matches: # 核心逻辑最佳匹配距离 0.8*次佳匹配距离判定为有效匹配 if m.distance0.8*n.distance: ok.append(m) # 7. 返回有效匹配点数量 num len(ok) return num遍历指纹库获取最优匹配 ID#获取指纹编号 def getID(src,database): max0 for file in os.listdir(database): model os.path.join(database,file) num getNum(src,model) print(文件名:,file,匹配点个数,num) if num max: max num name file ID name[0] if max200: 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) print(识别结果为,name)运行结果指纹验证案例中指纹1与模板图片匹配成功了分别在两图内标出匹配成功点的坐标要求匹配结果最近的distance小于次接近distance的0.4提示cv2.circle(src, (x,y), 3, (0, 0, 255), -1)绘制实心圆代码如下import cv2 import numpy as np def cv_show(name, img): cv2.imshow(name, img) cv2.waitKey(0) cv2.destroyAllWindows() def verification_and_mark(src, model, threshold0.4): # -------------------------- 1. 特征提取你学的SIFT -------------------------- sift cv2.SIFT_create() # 检测关键点 计算描述符源图src1、模板图model kp1, des1 sift.detectAndCompute(src, None) kp2, des2 sift.detectAndCompute(model, None) # -------------------------- 2. FLANN匹配你学的K近邻 -------------------------- # 补充FLANN参数避免匹配报错 FLANN_INDEX_KDTREE 1 index_params dict(algorithmFLANN_INDEX_KDTREE, trees5) search_params dict(checks50) flann cv2.FlannBasedMatcher(index_params, search_params) # K2近邻匹配每个特征找最近的2个匹配 matches flann.knnMatch(des1, des2, k2) # -------------------------- 3. 按作业要求筛选匹配0.4阈值 -------------------------- good_matches [] src_points [] # 存储src1上的匹配点坐标 model_points [] # 存储model上的匹配点坐标 for m, n in matches: # 作业要求最近距离 次近距离 × 0.4 if m.distance threshold * n.distance: good_matches.append(m) # 提取匹配点的坐标kp.pt返回(x,y)浮点数转整数用于画圆 src_x, src_y kp1[m.queryIdx].pt model_x, model_y kp2[m.trainIdx].pt src_points.append((int(src_x), int(src_y))) model_points.append((int(model_x), int(model_y))) # -------------------------- 4. 标注匹配点作业要求的cv2.circle -------------------------- # 复制原图避免修改原图像 src_marked src.copy() model_marked model.copy() # 在src1上画红色实心圆 for (x, y) in src_points: cv2.circle(src_marked, (x, y), 3, (0, 0, 255), -1) # 3是圆半径-1实心 # 在model上画红色实心圆 for (x, y) in model_points: cv2.circle(model_marked, (x, y), 3, (0, 0, 255), -1) # -------------------------- 5. 结果输出 -------------------------- print(f符合0.4阈值的有效匹配点数量{len(good_matches)}) print(src1匹配点坐标前10个示例, src_points[:10]) print(model匹配点坐标前10个示例, model_points[:10]) # 显示标注后的图对应你提供的效果图 cv_show(Marked src1, src_marked) cv_show(Marked model, model_marked) # 返回匹配结果认证通过/失败可自定义阈值 return 认证通过 if len(good_matches) 20 else 认证失败 # -------------------------- 主函数直接运行 -------------------------- if __name__ __main__: # 读取你的指纹图替换为你的实际路径 src1 cv2.imread(src1.bmp) model cv2.imread(model.bmp) # 执行验证标注阈值设为作业要求的0.4 result verification_and_mark(src1, model, threshold0.4) print(src1验证结果为, result)运行结果

相关文章:

【实战案例:基于特征匹配的指纹识别系统开发】

角点检测:角点(Corner)是图像中在两个或多个方向上灰度值发生剧烈变化的点。这些点通常包含丰富的信息,适用于特征匹配、目标跟踪、三维重建等任务。#------------------角点检测------------------------ #角点指图像中局部区域与…...

拆解液晶面板供电:用GH6121AC实现120mA双路输出的5个关键技巧

拆解液晶面板供电:用GH6121AC实现120mA双路输出的5个关键技巧 液晶面板的稳定供电是显示设备可靠运行的基础,而GH6121AC作为一款专为中小尺寸液晶面板优化的电源管理芯片,其双路120mA输出能力在3.3V系统中表现尤为突出。本文将深入剖析五个工…...

Ubuntu虚拟机IP卡在127.0.0.1?别慌,试试这个一键修复命令(附原理详解)

Ubuntu虚拟机IP卡在127.0.0.1的终极解决方案 刚装好的Ubuntu虚拟机突然上不了网,输入ifconfig只看到127.0.0.1这个回环地址?作为Linux新手,这种场景确实容易让人手足无措。但别担心,这其实是虚拟机环境下非常典型的网络配置问题。…...

Vite项目实战:利用Autoprefixer优化跨浏览器CSS兼容性

1. 为什么你的CSS在不同浏览器上表现不一致? 每次写完漂亮的CSS样式,打开Chrome一看效果完美,结果同事用Safari打开却发现布局错乱?这种场景前端开发者应该都不陌生。浏览器兼容性问题就像牛皮癣一样困扰着我们,特别是…...

万象熔炉 | Anything XL基础教程:模型加载日志解读与常见报错排查

万象熔炉 | Anything XL基础教程:模型加载日志解读与常见报错排查 你是不是也遇到过这种情况?满怀期待地启动一个AI绘画工具,结果控制台刷出一堆看不懂的日志,或者干脆弹出一个红色的错误提示,瞬间浇灭了创作的激情。…...

漫画脸描述生成创意玩法:反向提示词生成、风格迁移描述、跨作品融合设定

漫画脸描述生成创意玩法:反向提示词生成、风格迁移描述、跨作品融合设定 你是不是也遇到过这样的情况:脑子里有个特别酷的动漫角色形象,但就是不知道怎么用文字描述出来?或者想画个新角色,但想来想去都是那几个老套路…...

sdut-软件测试-软件测试概述1

1. 单选题 某网上购物软件,与京东、淘宝等现有主流系统操作流程一致,符合最终用户的使用习惯和操作模式,主要目的是为了改善 ISO/IEC 9126 质量模型中的( C )质量特性。 A. 功能性B. 可靠性C. 易用性D. 可维护性E.…...

Stable Yogi Leather-Dress-Collection免配置方案:自动检测显存并推荐最优参数

Stable Yogi Leather-Dress-Collection免配置方案:自动检测显存并推荐最优参数 想体验动漫风格的皮衣穿搭生成,但被复杂的模型配置和显存不足劝退?今天介绍的这个工具,或许能让你眼前一亮。 Stable Yogi Leather-Dress-Collecti…...

密码安全那些坑:为什么你的正则表达式可能漏掉键盘连续字符?

密码安全进阶:如何用正则表达式堵住键盘连续字符的漏洞? 当我们在设计密码策略时,常常会关注密码长度、字符多样性等基本要求,却忽略了一个关键的安全隐患——键盘连续字符。这类密码看似复杂,实则极易被破解工具识别。…...

Clawdbot部署实操:Qwen3-32B与LangChain/LlamaIndex生态无缝集成指南

Clawdbot部署实操:Qwen3-32B与LangChain/LlamaIndex生态无缝集成指南 1. 项目概述与核心价值 Clawdbot是一个统一的AI代理网关与管理平台,专门为开发者设计,提供了一个直观的界面来构建、部署和监控自主AI代理。这个平台通过集成的聊天界面…...

达摩院PALM春联模型应用场景:文旅景区AI楹联互动体验设计

达摩院PALM春联模型应用场景:文旅景区AI楹联互动体验设计 春节贴春联,是中国人传承千年的文化习俗。一副好的春联,不仅寓意吉祥,更能烘托节日氛围。但对于文旅景区、文化街区、博物馆等场所来说,每年为不同主题、不同…...

MacBook用户必看:Cursor免费版无限续杯的3种技术方案

1. Cursor免费版的试用限制解析 作为MacBook用户,你可能已经发现Cursor免费版存在一些使用限制。Cursor官方通过多重技术手段识别设备信息,包括硬件指纹、网络标识和账户关联等。当检测到同一设备频繁使用免费服务时,系统会自动触发限制机制。…...

实战解密il2cpp的global-metadata.dat文件:用IDA和VS Code逆向分析技巧

实战解密il2cpp的global-metadata.dat文件:用IDA和VS Code逆向分析技巧 在移动应用安全研究和游戏逆向工程领域,il2cpp作为Unity引擎的核心组件,其生成的global-metadata.dat文件承载着关键的类型信息和运行时元数据。本文将深入探讨如何通过…...

正点原子2026开发板教程——从0开始配置Linux内核(4)内核模块详解:从 Hello World 到设备驱动

正点原子2026开发板教程——从0开始配置Linux内核(4)内核模块详解:从 Hello World 到设备驱动 为什么要写这一章 这块跟移植关系不大,是桥接到后续驱动编写的。后面准备更新Rootfs。 前面我们花了三章的篇幅,把 Linux …...

DocMost 容器化部署进阶:从单机到高可用集群

1. 从单机到集群:为什么需要高可用部署 第一次用Docker Compose部署DocMost时,那种"一条命令启动全套服务"的爽快感至今难忘。但当我负责的在线教育平台用户量突破10万时,凌晨三点被报警短信吵醒成了家常便饭——数据库连接池爆满、…...

手把手教你为STM32F103C8T6(蓝色小药丸)编译Cleanflight固件,解决Flash溢出问题

深度优化STM32F103C8T6固件编译:从Flash溢出到精准裁剪实战 如果你手头正好有一块STM32F103C8T6开发板(也就是圈内俗称的"蓝色小药丸"),想要为它编译Cleanflight固件却频频遭遇Flash空间不足的问题,那么这篇…...

2026四川AI企业培训避坑指南:选对路径,少走弯路

随着DeepSeek等国产大模型在2025年的爆发式普及,四川企业迎来AI赋能的关键窗口期。成都、绵阳、德阳等地的国央企和民营企业纷纷启动AI培训计划,但在落地过程中,超过60%的企业反馈培训效果与预期存在差距。笔者近期调研了四川省内47家已开展A…...

高效获取网络小说与个性化阅读的全流程指南

高效获取网络小说与个性化阅读的全流程指南 你是否也曾遇到过这样的困扰:想在不同设备上阅读喜欢的网络小说,却被格式不兼容、广告弹窗和多平台切换搞得心烦意乱?FictionDown作为一款跨平台小说处理工具,通过智能格式适配技术&…...

【愚公系列】《剪映+DeepSeek+即梦:短视频制作》020-声音:让短视频更加动听(音频素材处理)

💎【行业认证权威头衔】 ✔ 华为云天团核心成员:特约编辑/云享专家/开发者专家/产品云测专家 ✔ 开发者社区全满贯:CSDN博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主 ✔ 技术生态共建先锋&am…...

【认知雷达(Cognitive Radar)与深度学习融合架构】第2章 雷达信号预处理与深度特征工程

项目地址 https://wwbrq.lanzouv.com/ijsMS3lb8sah 第2章 雷达信号预处理与深度特征工程 2.1 雷达回波信号数字化与去噪 2.1.1 高速ADC采样与数字下变频(DDC)实现 2.1.1.1 基于Xilinx RFSoC的14-bit直接采样与数字正交解调算法 2.1.1.2 CIC抽取滤波器与FIR匹配滤波器的级…...

SecGPT-14B部署案例:CSDN平台双24G 4090 GPU算力高效适配实践

SecGPT-14B部署案例:CSDN平台双24G 4090 GPU算力高效适配实践 1. 项目背景与模型介绍 SecGPT-14B是一款专注于网络安全领域的14B参数大语言模型,基于Qwen2ForCausalLM架构开发。该模型在CSDN星图平台上实现了开箱即用的部署方案,特别针对双…...

数据结构从入门到劝退?我用王者荣耀段位比喻线性表操作

数据结构王者之路:用游戏段位解锁线性表操作精髓 青铜段位:初识数据结构与线性表 刚接触数据结构的新手,就像刚注册游戏账号的青铜玩家。在这个阶段,我们需要理解最基础的概念——什么是数据结构?简单来说,…...

Breaking the Prior Dependency: A Novel Approach to Camouflaged Object Detection with Adaptive Featur

1. 伪装目标检测的挑战与突破 想象一下在丛林中寻找一只变色龙,或是军事侦察时识别伪装目标——这些场景下,目标物体往往与背景高度融合,肉眼都难以分辨。这正是伪装目标检测(Camouflaged Object Detection, COD)要解决…...

系统辨识入门:从最小二乘法到ARX模型,5步搞定黑箱建模

系统辨识入门:从最小二乘法到ARX模型,5步搞定黑箱建模 在自动化控制和机械工程领域,系统辨识是一项基础而关键的技能。面对一个未知的系统,如何通过输入输出数据建立数学模型?本文将带你从零开始,用最小二乘…...

Apache Flink Checkpoint 与 Chandy-Lamport 算法深度解析

本文从基础定义到底层算法原理,系统梳理 Flink Checkpoint 机制的完整知识体系,包含架构图、执行流程图、分类对比与生产调优指南。一、什么是 Checkpoint Checkpoint(检查点) 是 Apache Flink 容错机制的核心,它在不停…...

批量次品频发?MES+QMS的参数比对机制提前拦截风险

批量次品是制造业质量管控的“重灾区”,一旦发生不仅会造成物料、产能浪费,还会延误订单交付、损害品牌信誉。传统质量管控多依赖事后检验,待发现次品时已形成批量产出,损失难以挽回。核心症结在于缺乏生产过程中实时质量校验机制…...

从Talkie到MiniMax-01:揭秘这款低调国产AI如何征服海外市场

从Talkie到MiniMax-01:揭秘这款低调国产AI如何征服海外市场 在AI技术日新月异的今天,一个来自中国的团队正以惊人的速度在全球市场崭露头角。MiniMax,这个在国内鲜为人知的名字,却在海外AI应用市场占据了重要席位。它的成功并非偶…...

云曦26开学考复现

hello_rce查看当前目录: print_r(scandir(.)); print_r(scandir(dirname(__FILE__)));查看flag文件: call_user_func(passthru,base64${IFS}flag); call_user_func(passthru,tac${IFS}flag);新东西输入: {{lipsum.globals.os.popen(‘ls’).read()}}输入…...

90%的AI创业BP被VC秒删,因为创始人犯了同一个致命错误

大多数AI创始人花大量时间在BP里堆砌技术参数、模型架构和宏大愿景,以为这样就能显得专业。 结果发出去后,99%石沉大海。 其实VC每天处理几十份BP,用的是最残酷的「排除法」。你的BP很可能前30秒就被扔进垃圾桶。 真正决定AI项目生死的是6个评…...

检索大赛 实验3 豆包实验结果

根据对提供文献的核实,以下是真实存在的文献判断结果:1. **《RealVul: Can We Detect Vulnerabilities in Web Applications with LLM?》** - **真实性**:**存疑** - 理由:EMNLP 2024尚未召开(通常会议论文接收列表会…...