opencv圖像處理之指紋驗(yàn)證的實(shí)現(xiàn)
一、簡(jiǎn)介
在當(dāng)今數(shù)字化時(shí)代,生物識(shí)別技術(shù)作為一種安全、便捷的身份驗(yàn)證方式,正廣泛應(yīng)用于各個(gè)領(lǐng)域。指紋識(shí)別作為生物識(shí)別技術(shù)中的佼佼者,因其獨(dú)特性和穩(wěn)定性,成為了眾多應(yīng)用場(chǎng)景的首選。今天,我們就來(lái)深入探討如何利用 OpenCV 庫(kù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的指紋識(shí)別系統(tǒng),并詳細(xì)解讀相關(guān)代碼。
二、具體案例實(shí)現(xiàn)
本例是將src1和src2與模板model進(jìn)行匹配的一個(gè)代碼實(shí)現(xiàn)

具體代碼如下
import cv2
def cv_show(name, img):
cv2.imshow(name, img)
cv2.waitKey(0)
def verification(src, model):
# 創(chuàng)建SIFT特征提取器
sift = cv2.SIFT_create()
# 檢測(cè)關(guān)鍵點(diǎn)和計(jì)算描述符(特征向量) 源圖像
kp1, des1 = sift.detectAndCompute(src, None) # 第二個(gè)參數(shù):掩膜
# 檢測(cè)關(guān)鍵點(diǎn)和計(jì)算描述符 模板圖像
kp2, des2 = sift.detectAndCompute(model, None)
# 創(chuàng)建FLANN匹配器
flann = cv2.FlannBasedMatcher()
# 使用k近鄰匹配(des1中的每個(gè)描述符與des2中的最近兩個(gè)描述符進(jìn)行匹配)
matches = flann.knnMatch(des1, des2, k=2)
# distance:匹配的特征點(diǎn)描述符的歐式距離,數(shù)值越小也就說(shuō)明倆個(gè)特征點(diǎn)越相近。
# queryIdx:測(cè)試圖像的特征點(diǎn)描述符的下標(biāo)(第幾個(gè)特征點(diǎn)描述符),同時(shí)也是描述符對(duì)應(yīng)特征點(diǎn)的下標(biāo)。
# trainIdx:樣本圖像的特征點(diǎn)描述符下標(biāo), 同時(shí)也是描述符對(duì)應(yīng)特征點(diǎn)的下標(biāo)。
# 進(jìn)行比較篩選
ok = []
for m, n in matches:#m是最接近點(diǎn)的匹配結(jié)果,n是次接近點(diǎn)的匹配結(jié)果
# 根據(jù)Lowe's比率測(cè)試,選擇最佳匹配
if m.distance < 0.8 * n.distance:
ok.append(m)
# 統(tǒng)計(jì)通過(guò)篩選的匹配數(shù)量
num = len(ok)
if num >= 500:
result = "認(rèn)證通過(guò)"
else:
result = "認(rèn)證失敗"
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驗(yàn)證結(jié)果為:", result1)
print("src2驗(yàn)證結(jié)果為:", result2)1. 圖像顯示函數(shù)
def cv_show(name, img):
cv2.imshow(name, img)
cv2.waitKey(0)這個(gè)函數(shù)的作用是使用 OpenCV 的imshow函數(shù)顯示圖像,并通過(guò)waitKey(0)等待用戶按下任意鍵后關(guān)閉圖像窗口。name參數(shù)是窗口的名稱,img參數(shù)是要顯示的圖像數(shù)據(jù)
2. 指紋驗(yàn)證函數(shù)
def verification(src, model):
# 創(chuàng)建SIFT特征提取器
sift = cv2.SIFT_create()
# 檢測(cè)關(guān)鍵點(diǎn)和計(jì)算描述符(特征向量) 源圖像
kp1, des1 = sift.detectAndCompute(src, None) # 第二個(gè)參數(shù):掩膜
# 檢測(cè)關(guān)鍵點(diǎn)和計(jì)算描述符 模板圖像
kp2, des2 = sift.detectAndCompute(model, None)
# 創(chuàng)建FLANN匹配器
flann = cv2.FlannBasedMatcher()
# 使用k近鄰匹配(des1中的每個(gè)描述符與des2中的最近兩個(gè)描述符進(jìn)行匹配)
matches = flann.knnMatch(des1, des2, k=2)
# distance:匹配的特征點(diǎn)描述符的歐式距離,數(shù)值越小也就說(shuō)明倆個(gè)特征點(diǎn)越相近。
# queryIdx:測(cè)試圖像的特征點(diǎn)描述符的下標(biāo)(第幾個(gè)特征點(diǎn)描述符),同時(shí)也是描述符對(duì)應(yīng)特征點(diǎn)的下標(biāo)。
# trainIdx:樣本圖像的特征點(diǎn)描述符下標(biāo), 同時(shí)也是描述符對(duì)應(yīng)特征點(diǎn)的下標(biāo)。
# 進(jìn)行比較篩選
ok = []
for m, n in matches:#m是最接近點(diǎn)的匹配結(jié)果,n是次接近點(diǎn)的匹配結(jié)果
# 根據(jù)Lowe's比率測(cè)試,選擇最佳匹配
if m.distance < 0.8 * n.distance:
ok.append(m)
# 統(tǒng)計(jì)通過(guò)篩選的匹配數(shù)量
num = len(ok)
if num >= 500:
result = "認(rèn)證通過(guò)"
else:
result = "認(rèn)證失敗"
return result首先,創(chuàng)建 SIFT 特征提取器對(duì)象sift。
然后,分別對(duì)輸入的待驗(yàn)證指紋圖像src和模板指紋圖像model使用sift.detectAndCompute方法檢測(cè)關(guān)鍵點(diǎn)并計(jì)算描述符。detectAndCompute方法的第一個(gè)參數(shù)是圖像,第二個(gè)參數(shù)是掩膜(這里設(shè)為None)。
接著,創(chuàng)建 FLANN 匹配器對(duì)象flann,并使用flann.knnMatch方法對(duì)兩個(gè)圖像的描述符進(jìn)行匹配,k=2表示為每個(gè)描述符找到兩個(gè)最近的匹配。
之后,通過(guò)遍歷匹配結(jié)果,根據(jù) Lowe's 比率測(cè)試(即m.distance < 0.8 * n.distance)篩選出最佳匹配點(diǎn),存入ok列表。
最后,統(tǒng)計(jì)ok列表的長(zhǎng)度,即匹配點(diǎn)的數(shù)量。如果數(shù)量大于等于 500,則認(rèn)為認(rèn)證通過(guò),返回 "認(rèn)證通過(guò)";否則返回 "認(rèn)證
3. 主函數(shù)
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驗(yàn)證結(jié)果為:", result1)
print("src2驗(yàn)證結(jié)果為:", result2)在主函數(shù)中,首先使用cv2.imread函數(shù)讀取三張圖像,分別是src1.BMP、src2.BMP(待驗(yàn)證指紋圖像)和model.BMP(模板指紋圖像)。然后使用cv_show函數(shù)依次顯示這三張圖像。接著,分別對(duì)src1和src2調(diào)用verification函數(shù)進(jìn)行指紋驗(yàn)證,并將結(jié)果存儲(chǔ)在result1和result2中。最后,打印出兩個(gè)待驗(yàn)證指紋圖像的驗(yàn)證結(jié)果。
4、運(yùn)行結(jié)果

三、總結(jié)
通過(guò)上述代碼,我們成功實(shí)現(xiàn)了一個(gè)基于 OpenCV 的簡(jiǎn)單指紋驗(yàn)證系統(tǒng)。這個(gè)系統(tǒng)能夠根據(jù)指紋圖像的特征匹配情況判斷指紋是否匹配。然而,實(shí)際應(yīng)用中,還存在一些可以優(yōu)化和改進(jìn)的地方。例如,指紋圖像的預(yù)處理(如去噪、增強(qiáng)對(duì)比度等)可以進(jìn)一步提高特征提取的準(zhǔn)確性;調(diào)整匹配算法的參數(shù)或嘗試其他更先進(jìn)的匹配算法,可以提高匹配的精度和效率。希望本文的介紹和代碼示例能夠幫助你對(duì) OpenCV 指紋驗(yàn)證技術(shù)有更深入的理解,也期待你在實(shí)際應(yīng)用中不斷探索和完善,將指紋驗(yàn)證技術(shù)應(yīng)用到更多有價(jià)值的場(chǎng)景中。
到此這篇關(guān)于opencv圖像處理之指紋驗(yàn)證的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)opencv 指紋驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python Pandas中數(shù)據(jù)的合并與分組聚合
大家好,本篇文章主要講的是python Pandas中數(shù)據(jù)的合并與分組聚合,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
python對(duì)raw格式照片進(jìn)行降噪處理的方法詳解
要對(duì)RAW格式的照片進(jìn)行降噪,我們可以使用rawpy庫(kù)來(lái)讀取RAW圖像,并使用imageio庫(kù)將處理后的圖像保存為其他格式,如PNG或JPEG,本文將詳細(xì)給大家介紹python如何對(duì)raw格式照片進(jìn)行降噪處理,文中有詳細(xì)的代碼流程,需要的朋友可以參考下2023-05-05
女友半夜加班發(fā)自拍 python男友用30行代碼發(fā)現(xiàn)驚天秘密
大家好,我是Lex 喜歡欺負(fù)超人那個(gè)Lex 女友說(shuō)今晚加班,還給我發(fā)了一張照片? 我心生懷疑,就用python分析了一下照片,結(jié)果發(fā)現(xiàn)。。。 劃重點(diǎn):利用Python讀取照片的GPS信息信息2021-08-08
Python利用appium實(shí)現(xiàn)模擬手機(jī)滑動(dòng)操控的操作
Appium 是一個(gè)開(kāi)源、跨平臺(tái)的自動(dòng)化測(cè)試工具,用于測(cè)試原生和輕量移動(dòng)應(yīng)用,支持 iOS, Android 和 FirefoxOS 平臺(tái)。本文將利用appium實(shí)現(xiàn)模擬手機(jī)滑動(dòng)操控的操作,感興趣的可以了解一下2022-07-07
Python基礎(chǔ)之列表常見(jiàn)操作經(jīng)典實(shí)例詳解
這篇文章主要介紹了Python基礎(chǔ)之列表常見(jiàn)操作,結(jié)合實(shí)例形式詳細(xì)分析了Python列表創(chuàng)建方式、內(nèi)置函數(shù)與相關(guān)使用技巧,需要的朋友可以參考下2020-02-02
詳解Django框架中用戶的登錄和退出的實(shí)現(xiàn)
這篇文章主要介紹了詳解Django框架中用戶的登錄和退出的實(shí)現(xiàn),Django是重多Python人氣框架中最為知名的一個(gè),需要的朋友可以參考下2015-07-07
Python使用Spire.Doc for .NET輕松實(shí)現(xiàn)Word和Markdown互轉(zhuǎn)
在寫作、技術(shù)文檔管理和知識(shí)庫(kù)建設(shè)中,Word 和 Markdown 是我們最常打交道的兩種文檔格式,本文將詳細(xì)介紹如何使用 Spire.Doc for .NET 在 Python 環(huán)境中高效實(shí)現(xiàn) Word 與 Markdown 的互轉(zhuǎn),有需要的小伙伴可以了解下2026-06-06

