SIFT特征匹配實戰:KNN算法實現指紋認證

這個利用了前面學到的SIFT特征檢測來實現的,然后這里主要就是引入了一個新的匹配器。這里

匹配是用KNN算法進行匹配的。下面來看下細節。

介紹函數

由于要頻繁展示,所以這里定義了一個函數。

def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)

導入圖片

if __name__ == "__main__":# 讀取圖像src1 = cv2.imread("zhiwen3.bmp")src2 = cv2.imread("zhiwen2.bmp")model = cv2.imread("zhiwen1.bmp")# 檢查圖像是否成功加載if src1 is None or src2 is None or model is None:print("錯誤: 無法加載圖像文件")else:# 顯示圖像(需要指定窗口名稱)cv_show('src1', src1)cv_show('src2', src2)cv_show('model', model)# 進行認證驗證result1 = verification(src1, model)result2 = verification(src2, model)print("src1驗證結果為:", result1)print("src2驗證結果為:", result2)

可以看到這里導入了三張圖片,一張目標圖片,兩張圖片。然后打印出結果

匹配函數

def verification(src, model):
# 創建SIFT特征提取器
sift = cv2.SIFT_create()

這里創建了一個SIFT特征提取器,前面一篇文章講過的。

? ? # 檢測關鍵點和計算描述符
kp1, des1 = sift.detectAndCompute(src, None) ?# 源圖像 ? ? ?第二個參數 掩膜
kp2, des2 = sift.detectAndCompute(model, None) ?# 模板圖像

然后這里返回了重要信息kp和des

kp

  • ?位置信息? (pt):關鍵點在圖像中的坐標位置 (x, y)(重要,后面要用來標注出匹配點)
  • ?尺度信息? (size):關鍵點被檢測到的尺度級別
  • ?方向信息? (angle):關鍵點的主方向,用于實現旋轉不變性
  • ?響應強度? (response):表示該特征點的顯著程度

des

描述符的特點?:

  • 通常是高維向量(如SIFT描述符是128維)
  • 描述了關鍵點周圍區域的視覺外觀
  • 對光照變化、旋轉、尺度變化具有一定的不變性
  • 相似的圖像區域會產生相似的描述符向量

? ? # 檢查是否有足夠的特征點
if des1 is None or des2 is None or len(des1) < 2 or len(des2) < 2:
return "認證失敗(特征點不足)"

檢測看數量夠不夠匹配了,有時候特征太少,匹配不成功出現異常。
# 創建FLANN匹配器
flann = cv2.FlannBasedMatcher()
# 使用K近鄰匹配
matches = flann.knnMatch(des1, des2, k=2)

建立了一個FLANN匹配器,用于直接傳入兩個的描述符的特點,然后就可以匹配了

? ? # 應用Lowe's比率測試篩選優質匹配
good_matches = []
for m, n in matches:
if m.distance < 0.7 * n.distance: ?# 通常使用0.7-0.8的比率
good_matches.append(m)

這里我們前面參數k=2,是檢測我們這個點對應匹配兩個點,然后去計算這兩個點距離我們點的歐氏距離,然后得出如果兩個距離很接近就說明我們點匹配失敗。

? ? # 統計優質匹配數量
num = len(good_matches)

得到匹配點的個數,這里也可以看作匹配度

? ? # 可視化匹配結果(可選)
img_match = cv2.drawMatches(src, kp1, model, kp2, good_matches, None,
flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv_show('匹配結果', img_match)

這里是可視化結果的一個方法。

? ? # 根據匹配數量判斷認證結果
if num >= 500: ?# 閾值可根據實際情況調整
result = "認證通過"
else:
result = "認證失敗"

? ? return f"{result} (匹配點: {num})"

總體代碼

import cv2
import numpy as np  # 需要添加此導入def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)def verification(src, model):# 創建SIFT特征提取器sift = cv2.SIFT_create()# 檢測關鍵點和計算描述符kp1, des1 = sift.detectAndCompute(src, None)  # 源圖像      第二個參數 掩膜kp2, des2 = sift.detectAndCompute(model, None)  # 模板圖像# 檢查是否有足夠的特征點if des1 is None or des2 is None or len(des1) < 2 or len(des2) < 2:return "認證失敗(特征點不足)"# 創建FLANN匹配器flann = cv2.FlannBasedMatcher()# 使用K近鄰匹配matches = flann.knnMatch(des1, des2, k=2)# 應用Lowe's比率測試篩選優質匹配good_matches = []for m, n in matches:if m.distance < 0.7 * n.distance:  # 通常使用0.7-0.8的比率good_matches.append(m)# 統計優質匹配數量num = len(good_matches)# 可視化匹配結果(可選)img_match = cv2.drawMatches(src, kp1, model, kp2, good_matches, None,flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)cv_show('匹配結果', img_match)# 根據匹配數量判斷認證結果if num >= 500:  # 閾值可根據實際情況調整result = "認證通過"else:result = "認證失敗"return f"{result} (匹配點: {num})"if __name__ == "__main__":# 讀取圖像src1 = cv2.imread("zhiwen3.bmp")src2 = cv2.imread("zhiwen2.bmp")model = cv2.imread("zhiwen1.bmp")# 檢查圖像是否成功加載if src1 is None or src2 is None or model is None:print("錯誤: 無法加載圖像文件")else:# 顯示圖像(需要指定窗口名稱)cv_show('src1', src1)cv_show('src2', src2)cv_show('model', model)# 進行認證驗證result1 = verification(src1, model)result2 = verification(src2, model)print("src1驗證結果為:", result1)print("src2驗證結果為:", result2)

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

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

相關文章

網絡安全滲透測試第一步信息收集

信息收集是滲透測試中最基礎且關鍵的一步&#xff0c;它直接影響后續漏洞發現和利用的成功率。本文將系統介紹信息收集的常用方法、工具和技巧&#xff0c;幫助你在實戰中高效定位目標弱點。 一、搜索引擎利用 1. Google Hacking 通過Google搜索語法快速定位敏感信息、后臺地…

C++——類和對象1

1.類的定義1.1 類定義格式class為定義類的關鍵字&#xff0c;Stack為類的名字&#xff0c;{ }中的內容是類的主題為了&#xff0c;注意類定義結束時后面的分號不能省略。類體中的內容稱為類的成員&#xff1a;類中的變量稱為類的屬性或成員變量&#xff1b;類中的函數稱為類的方…

動手學Agent:Agent設計模式——構建有效Agent的7種模型

Agent本身的定義也不是絕對的&#xff0c;從LLM到最高等級的Agent&#xff0c;中間是有大量灰度地帶的&#xff0c;在Anthropic看來&#xff0c;Agent可以以多種方式定義&#xff0c;有些人將完全自主系統定義為Agent&#xff0c;而另一些團隊則將預定義的工作流程定義為Agent。…

Windows 下 .venv 激活腳本深度定制:同時注入 PyTorch 調試日志與國內網絡加速通道——從“能跑”到“好調”的完整工程化方案

Windows 下 .venv 激活腳本深度定制&#xff1a;同時注入 PyTorch 調試日志與國內網絡加速通道 ——從“能跑”到“好調”的完整工程化方案 一、為什么非得改激活腳本&#xff1f; 重復勞動最耗時 每次打開終端都要敲四五行 set/export&#xff0c;人腦就是不可靠的剪貼板。 環…

[BX]和loop指令,debug和masm匯編編譯器對指令的不同處理,循環,大小寄存器的包含關系,操作數據長度與寄存器的關系,段前綴

[bx]是什么[bx]這個表達方式和[0]很像&#xff0c;他們倆的功能也很像。之前就提到了&#xff0c;[0]表示一個內存單元&#xff0c;他的偏移地址是0。從這邊我們可以引出內存單元的定義&#xff1a;要有內存單元的地址&#xff0c;要有內存單元的長度&#xff08;類型&#xff…

域格YM310 X09移芯CAT1模組HTTPS連接服務器

HTTPS連接服務器 本文檔介紹了HTTPS連接服務器的大致流程&#xff0c;測試服務器為httpbin.org。 HTTPS連接服務器流程 創建證書文件 創建一個文件 ATFSCREATE<filename>參數&#xff1a;<filename> 文件名 寫入CA證書 ATFSWRITE<filename>,<mode&…

【ManiSkill】常見envs學習筆記

1. StackCube-v1 用于模擬機器人在桌面場景中將紅色立方體&#xff08;cubeA&#xff09;堆疊到綠色立方體&#xff08;cubeB&#xff09;上的操作。該任務強調精確抓取、放置和穩定性控制。成功條件包括紅色立方體穩定堆疊在綠色立方體上且不被機器人抓取。 參數 (Arguments…

Java 網絡編程全解析

前言&#xff1a;網絡編程的意義與價值 前言&#xff1a;網絡編程的意義與價值 在當今互聯網時代&#xff0c;網絡編程是軟件開發的核心技能之一。無論是桌面應用、移動應用還是企業級系統&#xff0c;幾乎都需要與網絡交互。Java 作為一門跨平臺的編程語言&#xff0c;提供了完…

HarmonyOS應用拉起系列(三):如何直接拉起騰訊/百度/高德地圖進行導航

在鴻蒙應用開發中&#xff0c;經常需要跳轉第三方地圖應用&#xff08;如 騰訊地圖、百度地圖、高德地圖&#xff09;進行導航。無論是出行類 App、物流類 App&#xff0c;還是線下活動類應用&#xff0c;都存在“跳轉地圖導航”的實際需求。寫完HarmonyOS應用拉起系列一和二后…

PCGrad解決多任務沖突

論文解讀&#xff1a;"Gradient Surgery for Multi-Task Learning" 1. 論文標題直譯 Gradient Surgery: 梯度手術for Multi-Task Learning: 應用于多任務學習 合在一起就是&#xff1a;為多任務學習量身定制的梯度手術。這個名字非常形象地概括了它的核心思想。 …

Nvidia顯卡架構解析與cuda應用生態淺析

文章目錄 0. Nvidia顯卡簡介 一、主要顯卡系列 二、主要GPU架構與代表產品 1.main 1.1 CUDA 13.0 的重大變化 1.2 V100 的硬件短板已顯現 1.3 這意味著什么? 1.4 寫在后面 彩蛋:V100 0. Nvidia顯卡簡介 一、主要顯卡系列 GeForce 系列(消費級) 用途:游戲、創作、日常圖形…

開發指南:使用 MQTTNet 庫構建 .Net 物聯網 MQTT 應用程序

一、背景介紹 隨著物聯網的興起&#xff0c;.Net 框架在構建物聯網應用程序方面變得越來越流行。微軟的 .Net Core 和 .Net 框架為開發人員提供了一組工具和庫&#xff0c;以構建可以在 Raspberry Pi、HummingBoard、BeagleBoard、Pine A64 等平臺上運行的物聯網應用程序。 MQT…

突破性能瓶頸:基于騰訊云EdgeOne的AI圖片生成器全球加速實踐

1. 項目背景與挑戰 1.1 開發背景 隨著AIGC技術爆發&#xff0c;我們團隊決定開發一款多模型支持的AI圖片生成器&#xff0c;主要解決以下痛點&#xff1a; 不同AI模型的參數規范不統一生成結果難以系統化管理缺乏企業級的安全水印方案全球用戶訪問延遲高&#xff0c;中國用戶…

一、Java 基礎入門:從 0 到 1 認識 Java(詳細筆記)

1.1 Java 語言簡介與發展歷程 Java 是一門面向對象的高級編程語言&#xff0c;以“跨平臺、安全、穩定”為核心特性&#xff0c;自誕生以來長期占據編程語言排行榜前列&#xff0c;廣泛應用于后端開發、移動端開發、大數據等領域。 1.1.1 起源與核心人物 起源背景&#xff1…

uniapp:根據目的地經緯度,名稱,喚起高德/百度地圖來導航,兼容App,H5,小程序

1、需要自行申請高德地圖的key,配置manifest.json 2、MapSelector選擇組件封裝 <template><view><u-action-sheet :list="mapList" v-model="show" @click="changeMap"></u-action-sheet></view> </template&…

我對 WPF 動搖時的選擇:.NET Framework 4.6.2+WPF+Islands+UWP+CompostionApi

目錄 NET Framework 4.6.2的最大亮點 為什么固守462不升級 WPF-開發體驗的巔峰 為什么對WPF動搖了 基于IslandsUWP的濾鏡嘗試 總結 NET Framework 4.6.2的最大亮點 安全性能大提升&#xff1a; 默認啟用TLS1.2協議&#xff0c;更安全&#xff0c;它為后續的版本提供了重…

SpringBoot大文件下載失敗解決方案

SpringBoot大文件下載失敗解決方案 后端以文件流方式給前端接收下載文件,文件過大時出現下載失敗的情況或者打開后提示文件損壞,實際是字節未完全讀取寫入。 針對大文件下載失敗的情況,以下是詳細的解決方案: 大文件下載失敗的主要原因 內存溢出:一次性加載大文件到內存…

torch.gather

torch.gather 介紹 torch.gather(input, dim, index, *, sparse_gradFalse, outNone) → Tensor 沿由 dim 指定的軸收集值。 對于三維張量&#xff0c;輸出按如下方式確定&#xff1a; out[i][j][k] input[index[i][j][k]][j][k] # 如果 dim 0 out[i][j][k] input[i][i…

Golang | http/server Gin框架簡述

http/server http指的是Golang中的net/http包&#xff0c;這里用的是1.23.10。 概覽 http包的作用文檔里寫的很簡明&#xff1a;Package http provides HTTP client and server implementations. 主要是提供http的客戶端和服務端&#xff0c;也就是能作為客戶端發http請求&a…

Vision Transformer (ViT) :Transformer在computer vision領域的應用(三)

Experiment 上來的一段話就概括了整章的內容。 We evaluate the representation learning capabilities of ResNet, Vision Transformer (ViT), and the hybrid. 章節的一開頭就說明了,對比的模型就是 ResNet,CNN領域中的代碼模型。 ViT。 上一篇中提到的Hybrid模型,也就是…