計算機視覺(opencv)實戰二十二——指紋圖像中提取特征點,計算兩兩指紋之間的相似度

指紋識別原理與代碼實現詳解

指紋識別是一種常見的生物特征識別技術,廣泛應用于門禁系統、手機解鎖、考勤打卡、身份認證等場景。其核心思想是:從指紋圖像中提取特征點,計算兩幅指紋之間的相似度,并根據相似度判斷是否為同一人。本文將結合具體代碼,詳細講解指紋識別的基本原理及實現方法。


1. 指紋識別的原理

指紋識別主要分為以下幾個步驟:

  1. 圖像采集
    獲取原始指紋圖像,保證質量清晰,避免噪聲干擾。

  2. 特征提取
    從指紋中提取關鍵特征點(如脊線端點、分叉點),并計算特征描述符。
    在實際工程中,可以使用 SIFT (Scale-Invariant Feature Transform) 算法,它能夠在尺度和旋轉變化下保持特征點的穩定性,非常適合指紋特征提取。

  3. 特征匹配
    將待識別指紋的特征點與數據庫中指紋的特征點進行匹配,計算相似度。常見做法是使用 FLANN (Fast Library for Approximate Nearest Neighbors) 進行快速近似匹配。

  4. 身份確認
    根據匹配到的特征點數量,判斷是否為同一人,并返回識別結果。通常設定一個閾值,匹配點數低于閾值則認為“未匹配成功”。

🔑 SIFT(Scale-Invariant Feature Transform)

作用: 從圖像中提取穩定的局部特征點和描述符。
特點:

  • 對圖像的縮放、旋轉、光照變化有很強的魯棒性。

  • 能夠在不同視角下找到同一物體的匹配點。

  • 輸出包括關鍵點位置、尺度、方向以及128維的特征描述符。

簡單來說,SIFT 就是幫你找到圖像里“最有代表性”的點,并用一串向量描述它們的外觀。


? FLANN(Fast Library for Approximate Nearest Neighbors)

作用: 快速匹配兩張圖像中的特征點。
特點:

  • 采用高效的近似最近鄰搜索算法,比逐一比對更快。

  • 適合大規模特征匹配場景。

  • 通常配合 SIFT、ORB 等特征描述符使用。

簡單來說,FLANN 就是幫你快速找出兩張圖里哪些特征點最相似,減少匹配的計算量。


2. 代碼實現與解析

下面給出完整代碼,并逐段解釋其功能:

import os
import cv2"""====================計算兩個指紋間匹配點的個數===================="""
def getNum(src, model):img1 = cv2.imread(src)img2 = cv2.imread(model)# 1?? 創建SIFT特征提取器sift = cv2.SIFT_create()# 2?? 計算關鍵點和特征描述符kp1, des1 = sift.detectAndCompute(img1, None)kp2, des2 = sift.detectAndCompute(img2, None)# 3?? 構建FLANN匹配器,執行k近鄰匹配flann = cv2.FlannBasedMatcher()matches = flann.knnMatch(des1, des2, k=2)# 4?? 使用比率測試 (Lowe's ratio test) 過濾出好的匹配ok = []for m, n in matches:if m.distance < 0.8 * n.distance:ok.append(m)num = len(ok)  # 統計匹配點數量return num

原理解析:

  • SIFT_create() 用于提取圖像中穩定的關鍵點及其特征描述符。

  • FlannBasedMatcher() 是一種高效的近似最近鄰搜索算法,能快速找到匹配點。

  • 比率測試 m.distance < 0.8 * n.distance 用來剔除錯誤匹配,保留可靠的匹配點。

  • 返回值 num 即兩張指紋的相似程度的量化指標。


"""====================獲取指紋編號===================="""
def getID(src, database):max = 0for file in os.listdir(database):model = os.path.join(database, file)num = getNum(src, model)print("文件名:", file, "匹配點個數:", num)# 找到匹配點數最多的指紋if num > max:max = numname = fileID = name[0]  # 假設文件名以編號開頭if max < 100:  # 閾值判斷,匹配點太少則認為沒找到ID = 9999return ID

原理解析:

  • 遍歷數據庫文件夾,計算待識別指紋與每個指紋的匹配點數,找到匹配度最高的文件。

  • 設置閾值 100,確保匹配足夠可靠,避免誤識別。


"""====================根據指紋編號,獲取對應姓名===================="""
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 = "model.BMP"database = "database"ID = getID(src, database)name = getName(ID)print("識別結果為:", name)

功能說明:

  • 設定待識別指紋路徑和指紋數據庫路徑。

  • 調用 getID() 獲取編號,再用 getName() 轉換為姓名。

  • 最終輸出識別結果。


3. 總結與優化建議

? 優點:

  • 使用 SIFT 特征點 + FLANN 匹配,魯棒性較強。

  • 通過閾值過濾避免誤匹配,保證結果可靠。

  • 代碼清晰,易于擴展。

🔧 優化建議:

  • 可視化匹配結果(使用 cv2.drawMatchesKnn),方便調試和驗證。

  • 數據庫較大時,可以預先計算特征描述符并緩存,提高匹配速度。

  • 閾值 100 可改為動態閾值(基于平均匹配點數比例判斷)。

  • 可增加多線程處理,提高數據庫遍歷效率。


📌 總結
本文通過理論分析和實際代碼實現,完整展示了基于特征點的指紋識別流程:特征提取、特征匹配、匹配數量統計、身份判定。該方案適用于小規模指紋數據庫的身份識別場景,如果要在大規模應用中部署,可以考慮使用深度學習方法(如指紋特征嵌入 + 度量學習),進一步提升魯棒性和速度。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/98103.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/98103.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/98103.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux基礎之部署mysql數據庫

文章目錄一、環境準備二、源碼解壓與依賴三、CMake 編譯配置四、配置 MySQL權限管理修改配置文件 /etc/my.cnf五、環境變量設置六、數據庫初始化七、服務管理八、賬號密碼管理一、環境準備 yum -y install gcc gcc-c ncurses ncurses-devel bison cmakegcc / gcc-c&#xff1a…

代碼審計-PHP專題原生開發文件上傳刪除包含文件操作監控Zend源碼解密1day分析

快速分析脆弱&#xff1a;1、看文件路徑2、看代碼里面的變量&#xff08;可控&#xff09;3、看變量前后的過濾文件安全挖掘點&#xff1a;1、腳本文件名2、應用功能點3、操作關鍵字文件上傳&#xff0c;文件下載(讀取)&#xff0c;文件包含&#xff0c;文件刪除等emlog-文件上…

零基礎搭建 Hexo 博客:從本地到 GitHub Pages 全流程指南

零基礎搭建 Hexo 博客&#xff1a;從本地到 GitHub Pages 全流程指南 Hexo 是一個快速、簡潔且高效的博客框架&#xff0c;支持使用 Markdown 來編寫文章&#xff0c;并能快速生成靜態網頁&#xff0c;非常適合想要搭建個人博客的同學。本文將帶你從零開始&#xff0c;本地搭建…

Git 簡介

Git 是目前全球最流行的分布式版本控制系統&#xff08;Distributed Version Control System, DVCS&#xff09;&#xff0c;核心作用是追蹤文件修改歷史、支持多人協同開發&#xff0c;并能高效管理代碼&#xff08;或任何文本類文件&#xff09;的版本迭代。它由 Linux 內核創…

后端Web實戰-Spring原理

目錄 1. 配置優先級 2. Bean管理 2.1 獲取Bean 2.2 Bean作用域 面試題&#xff1a;Lazy是如何解決循環依賴問題的&#xff1f; 2.3 第三方Bean 3. SpringBoot原理 3.1 起步依賴 3.2 自動配置 3.2.1 概述 3.2.2 自動配置的原理及常見方案 3.2.2.1 概述 3.2.2.2 方案…

在 Qoder 等 AI 二創 IDE 里用 VS Code Remote-SSH 的“曲線連接”實戰

目標&#xff1a;讓你在 Qoder 等在線/AI 輔助 IDE 中&#xff0c;也能像本地 VS Code 一樣通過 Remote-SSH 連接到自己的遠程服務器進行開發。 前提&#xff1a;只在你擁有或被授權的服務器上使用&#xff0c;遵守所用平臺的條款與限制。兩句話說清楚 先用本地 VS Code 正常連…

python發送請求SSL驗證設置

這個錯誤通常是由于SSL/TLS握手失敗導致的&#xff0c;可能原因包括證書驗證問題、不兼容的加密協議或網絡連接中斷。以下是幾種解決方案&#xff0c;按推薦順序排列&#xff1a; 方案一&#xff1a;臨時禁用SSL驗證&#xff08;快速測試&#xff09; response requests.get(u…

工廠自動化正從 “人工堆疊” 向 “設備替代” 快速轉變

?人工進行零件排列&#xff0c;雖在操作靈活性上有一定表現&#xff0c;但實際應用中存在明顯短板&#xff0c;對工廠自動化轉型形成制約。從成本來看&#xff0c;一名工人日均工資約數百元&#xff0c;若需 5-6 名工人協同作業&#xff0c;月均人力成本易突破萬元&#xff0c…

中標麒麟7.4部署gitlab-runner

1. 部署環境 本次部署環境完全斷網。需要離線下載gitlab-runner及其依賴。 本次部署環境為中標麒麟7.4。目前機器上部署了gitlab&#xff0c;安裝了maven。 2. 部署步驟 2.1 在外部下載好依賴 我首先在騰訊云上布置了一個centos7.9的虛擬機&#xff0c;沒有安裝任何東西。 …

在 IDEA 2024 創建 Vue 項目(保姆級)

目錄 一、 前后端分離 1. 簡介 2. 實現前后端分離的常用前端框架 3. 前后端分離和動靜分離 3.1 前后端分離: 3.2 動靜分離: 二、 Vue.js概述 1. 簡介 2. SPA介紹 2.1 優點 2.2 缺點 3. MVVM介紹 3.1 示例 三、 名詞解釋 1. Node.js 2. npm 3. webpack 4. Vue…

Coze源碼分析-資源庫-創建知識庫-后端源碼-應用/領域/數據訪問

3. 應用服務層 3.1 知識庫應用服務 文件位置: backend/application/knowledge/knowledge.go func (k *KnowledgeApplicationService) CreateKnowledge(ctx context.Context, req *dataset.CreateDatasetRequest) (*dataset.CreateDatasetResponse, error) {// 1. 轉換文檔類型d…

Shopify指紋手機矩陣:無限擴店,橫掃FB/GG廣告封號風險

一、 為什么需要為Shopify使用指紋手機&#xff1f;雖然Shopify不會因為你多開店而封號&#xff0c;但以下場景需要隔離環境&#xff1a;規避廣告平臺關聯&#xff1a;這是最核心的用途。你會用Facebook、Google、TikTok等廣告平臺為你的Shopify店鋪引流。這些廣告平臺嚴格禁止…

【Python】家庭用電數據分析Prophet預測

數據集&#xff1a;Household Electricity Consumption | Kaggle 目錄 數據集簡介 探索性分析 Prophet預測 Prophet模型 Prophet理念 Prophet優點 數據集簡介 240000-household-electricity-consumption-records數據集包含了一個家庭6個月的用電數據&#xff0c;收集于2…

信息系統運維管理

運行維護服務指的是采用信息技術手段及方法&#xff0c;依據客戶提出的服務要求&#xff0c;為其在使用信息系統過程中提出的需求提供的綜合服務是信息技術服務中的一種主要類型。運行維護服務對象是指信息系統工程建設項目交付的內容&#xff0c;包括機房基礎設施&#xff0c;…

系統編程完結整理以及補充

Shell&#xff08;命令與腳本語法&#xff09; 系統編程&#xff08;一&#xff09;shell的學習-CSDN博客 功能/概念語法/關鍵字參數/用法說明返回值/效果難易點注意事項示例/實驗提示定義函數func_name() { commands; }無參數或通過 $1 $2 ... 傳參函數執行參數傳遞、全局變…

第十四屆藍橋杯青少組C++選拔賽[2022.12.18]第二部分編程題(2、字符翻轉)

參考程序&#xff1a;#include <bits/stdc.h> using namespace std;int main() {string s;cin >> s; // 讀取輸入字符串&#xff0c;若無輸入則結束for (int i 0; i < (int)s.size(); i) {// i 從 0 開始&#xff0c;位置是 i1&#xff1b;如果 i 是奇數&#…

Django基礎環境入門

熟悉過程 搭建環境&#xff0c;運行起來基礎請求到服務接口跟java web對比 說明先不糾結細節先跑起來再說 1. 環境搭建 python已經安裝&#xff0c;使用conda管理 django安裝 django官方文檔 pip install django也可以命令創建 mkdir djangotutorial django-admin startp…

408學習之c語言(結構體)

今天給大家分享C語言中結構體的幾種常見使用方法&#xff0c;包括基礎結構體定義與初始化&#xff0c;結構體指針的兩種訪問方式&#xff0c;結構體數組的遍歷&#xff0c;動態內存分配與結構體使用&#xff0c;typedef簡化結構體類型基礎結構體定義與使用#define _CRT_SECURE_…

Navicat中設計表格默認值時,如何不設置成NULL,而是設置成空文本?

在 Navicat 中設計表時&#xff0c;將字段的默認值設置為空文本而不是 NULL 是一個非常常見的需求。操作很簡單&#xff0c;但有幾個細節需要注意。■ 方法一&#xff1a;通過“設計表”界面設置&#xff08;最常用&#xff09;1. 連接數據庫并找到表&#xff1a;在左側連接導…

深入理解Java虛擬機:JVM高級特性與最佳實踐(第3版)第十三章知識點問答(15題)

預告下一本 可能是mysql8的書籍 或者是AI應用工程的基本崗位所有技能 問題1 什么是 線程安全&#xff1f;在 Java 中如何定義“線程安全”&#xff1f;線程安全&#xff08;Thread Safety&#xff09; 的定義是&#xff1a; 當多個線程同時訪問某個類的對象時&#xff0c;無論運…