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

北京高端网站设计公司合肥网络关键词排名

北京高端网站设计公司,合肥网络关键词排名,长沙网站设计培训学校,一键生成app制作器免费版sift特征检测和FLANN 匹配器进行指纹匹配 目录 sift特征检测和FLANN 匹配器进行指纹匹配1 sift特征检测1.1 概念1.2 优缺点 2 FLANN 匹配器2.1 概念2.2 工作原理与匹配方式2.3 FLANN 匹配器的使用步骤2.4 优缺点 3 函数3.1 特征检测匹配3.2 匹配符合条件点并绘制 3 代码测试3.1…

sift特征检测和FLANN 匹配器进行指纹匹配

目录

  • sift特征检测和FLANN 匹配器进行指纹匹配
    • 1 sift特征检测
      • 1.1 概念
      • 1.2 优缺点
    • 2 FLANN 匹配器
      • 2.1 概念
      • 2.2 工作原理与匹配方式
      • 2.3 FLANN 匹配器的使用步骤
      • 2.4 优缺点
    • 3 函数
      • 3.1 特征检测匹配
      • 3.2 匹配符合条件点并绘制
    • 3 代码测试
      • 3.1 单个指纹模板匹配
      • 3.2 多个指纹匹配

1 sift特征检测

1.1 概念

SIFT(尺度不变特征变换)是一种用于图像处理中检测和描述图像中局部结构的算法。它是由David Lowe在1999年提出的,并在2004年进行了详细阐述。SIFT特征具有尺度不变性,这意味着即使图像的尺度发生变化,SIFT特征也能保持稳定

1.2 优缺点

SIFT特征的优点

  • 尺度不变性:能够适应图像的尺度变化。
  • 旋转不变性:能够适应图像的旋转变化。
  • 对光照、仿射变换和噪声具有一定的鲁棒性

SIFT特征的缺点

  • 计算复杂度较高,实时性较差。
  • 对于非线性变换和大幅度的视角变化,SIFT特征的性能可能会下降。

2 FLANN 匹配器


2.1 概念

FLANN 匹配器(Fast Library for Approximate Nearest Neighbors,快速近似最近邻搜索库)是 OpenCV 中用于高效匹配特征描述符的工具。它通过近似算法加速最近邻搜索,特别适合处理高维数据(如 SIFT 或 SURF 描述符)。

2.2 工作原理与匹配方式

  • 最近邻搜索
    • 给定一个特征描述符集合,FLANN 的目标是找到与查询描述符最接近的匹配点。
    • 精确的最近邻搜索(如暴力匹配)在高维数据中计算量很大,FLANN 通过近似算法加速搜索。
  • 近似算法
    • FLANN 使用了一种基于树结构的算法(如 KD-Tree 或 Hierarchical K-Means Tree)来组织数据,从而快速缩小搜索范围。
    • 通过牺牲一定的精度,换取更快的搜索速度。
  • 匹配方式
    • FLANN 支持两种匹配方式
    • 单匹配:为每个查询描述符找到一个最近邻。
    • KNN 匹配:为每个查询描述符找到 K 个最近邻。

2.3 FLANN 匹配器的使用步骤

  • 创建 FLANN 匹配器
    使用 cv2.FlannBasedMatcher 创建 FLANN 匹配器对象。

  • 准备特征描述符
    使用特征检测算法(如 SIFT、SURF 或 ORB)提取图像的特征描述符

  • 进行匹配
    使用 knnMatch 方法进行 KNN 匹配,返回每个查询描述符的 K 个最近邻。

  • 筛选匹配点
    根据距离比例或其他条件筛选出可靠的匹配点

2.4 优缺点

优点

  • 高效:比暴力匹配(Brute-Force Matcher)更快,特别适合处理高维数据。
  • 灵活:支持多种算法和参数配置,可以根据需求调整精度和速度。

缺点

  • 近似匹配:结果是近似的,可能存在一定的误差。
  • 参数调优:需要根据具体任务调整参数,否则可能影响匹配效果。

3 函数


3.1 特征检测匹配

  • 特征关键点检测
    • sift = cv2.SIFT_create(),创建 SIFT 特征检测器
    • kp1, des1 = sift.detectAndCompute(src, None),检测并计算 src 图像的关键点(kp1) 和描述符(des1 )
  • 匹配器匹配
    • flann = cv2.FlannBasedMatcher(),创建FLANN 匹配器
    • matches = flann.knnMatch(des1, des2, 2) , 使用 KNN 算法进行特征(des1, des2)匹配k=2 表示每个描述符返回两个最佳匹配

3.2 匹配符合条件点并绘制

ok = []  # 存储符合条件的匹配点
ok_n = []  # 存储对应的次佳匹配点# 遍历所有匹配点
for m, n in matches:
# 如果最佳匹配点的距离小于次佳匹配点距离的 0.65 倍,则认为是一个好的匹配if m.distance < 0.65 * n.distance:ok.append(m)  # 将好的匹配点加入 ok 列表ok_n.append(n)  # 将对应的次佳匹配点加入 ok_n 列表# 计算好的匹配点的数量
num = len(ok)# 如果好的匹配点数量大于等于 400,则认为验证通过
if num >= 400:result = '认证通过'  # 设置验证结果为通过# 遍历所有匹配点for m, n in matches:# 再次筛选好的匹配点if m.distance < 0.65 * n.distance:ok.append(m)x1 = int(kp1[m.queryIdx].pt[0])y1 = int(kp1[m.queryIdx].pt[1])x2 = int(kp2[n.queryIdx].pt[0])y2 = int(kp2[n.queryIdx].pt[1])src = cv2.circle(src, (x1, y1), 3, (0, 0, 255), -1)model = cv2.circle(model, (x2, y2), 3, (0, 0, 255), -1)

3 代码测试


3.1 单个指纹模板匹配

图片1:
在这里插入图片描述

图片2:
在这里插入图片描述

模板:
在这里插入图片描述

代码展示:

import cv2
def cv_chow(name,img):cv2.imshow(name,img)cv2.waitKey(0)
def verification(src,model):sift =cv2.SIFT_create()kp1, des1 = sift.detectAndCompute(src, None)kp2, des2 = sift.detectAndCompute(model, None)flann = cv2.FlannBasedMatcher()matches = flann.knnMatch(des1, des2, 2)ok = []ok_n = []for m, n in matches:if m.distance < 0.65 * n.distance:ok.append(m)ok_n.append(n)## m,n,在kp的ptnum = len(ok)if num>=400:result = '认证通过'for m, n in matches:if m.distance < 0.65 * n.distance:ok.append(m)x1 = int(kp1[m.queryIdx].pt[0])y1 = int(kp1[m.queryIdx].pt[1])x2 = int(kp2[n.queryIdx].pt[0])y2 = int(kp2[n.queryIdx].pt[1])src = cv2.circle(src, (x1, y1), 3, (0, 0, 255), -1)model = cv2.circle(model, (x2, y2), 3, (0, 0, 255), -1)cv_chow('src', src)cv_chow('model', model)else:result = '认证失败'return resultif __name__=='__main__':src1 = cv2.imread('zhiwen1.bmp')cv_chow('src1',src1)src2 = cv2.imread('zhiwen2.bmp')cv_chow('src2', src2)model = cv2.imread('zhiwenp.bmp')cv_chow('model_', model)result1 = verification(src1,model)result2 = verification(src2, model)print(f'src1验证结果:{result1}')print(f'src2验证结果:{result2}')

运行结果:
在这里插入图片描述
在这里插入图片描述

3.2 多个指纹匹配

指纹文件库:
在这里插入图片描述

代码展示:

import osdef getNum(src,model):img1 = cv2.imread(src)img2 = cv2.imread(model)sift = cv2.SIFT_create()kp1, des1 = sift.detectAndCompute(img1, None)kp2, des2 = sift.detectAndCompute(img2, None)flann = cv2.FlannBasedMatcher()matches = flann.knnMatch(des1, des2, 2)ok = []for m, n in matches:if m.distance < 0.8 * n.distance:ok.append(m)num = len(ok)return numdef getID(src,database):max = 0for file in os.listdir(database):print(file)model = os.path.join(database,file)num = getNum(src,model)print(f'文件名:{file},匹配点个数:{num}')if num>max:max = numname = fileID = name[0]if max<100:ID = 9999return IDdef getname(ID):nameID = {0:'张三',1:'李四',2:'王五',3:'赵六',4:'朱老七',5:'钱八',6:'曹九',7:'王二麻子',8:'andy',9:'Anna',9999:'没找到'}name = nameID.get(int(ID))return nameif __name__=='__main__':src = "scrpp.bmp"database = "database//database"ID = getID(src,database)name = getname(ID)print(f'识别结果:{name}')

运行结果:
在这里插入图片描述


文章转载自:
http://troopial.wqfj.cn
http://meloid.wqfj.cn
http://upstart.wqfj.cn
http://pincers.wqfj.cn
http://hate.wqfj.cn
http://laminal.wqfj.cn
http://adoze.wqfj.cn
http://soleiform.wqfj.cn
http://culling.wqfj.cn
http://moil.wqfj.cn
http://carices.wqfj.cn
http://troublesomely.wqfj.cn
http://beguilement.wqfj.cn
http://beaconage.wqfj.cn
http://goethite.wqfj.cn
http://chino.wqfj.cn
http://beerburst.wqfj.cn
http://theoretical.wqfj.cn
http://knottiness.wqfj.cn
http://etude.wqfj.cn
http://cubbyhouse.wqfj.cn
http://gressorial.wqfj.cn
http://implausibility.wqfj.cn
http://veld.wqfj.cn
http://decretal.wqfj.cn
http://thiocyanate.wqfj.cn
http://jewbaiter.wqfj.cn
http://unreconstructible.wqfj.cn
http://barology.wqfj.cn
http://teakwood.wqfj.cn
http://aristocracy.wqfj.cn
http://polysynthetism.wqfj.cn
http://engram.wqfj.cn
http://favor.wqfj.cn
http://grozing.wqfj.cn
http://undeliverable.wqfj.cn
http://disk.wqfj.cn
http://toxicologically.wqfj.cn
http://ocelli.wqfj.cn
http://cognizant.wqfj.cn
http://discommodious.wqfj.cn
http://test.wqfj.cn
http://tropophyte.wqfj.cn
http://polyclonal.wqfj.cn
http://freesia.wqfj.cn
http://methacrylic.wqfj.cn
http://featheredge.wqfj.cn
http://fathership.wqfj.cn
http://aswandam.wqfj.cn
http://reindustrialization.wqfj.cn
http://toric.wqfj.cn
http://bento.wqfj.cn
http://ornery.wqfj.cn
http://repristinate.wqfj.cn
http://freight.wqfj.cn
http://expressionless.wqfj.cn
http://rumorous.wqfj.cn
http://lacustrine.wqfj.cn
http://playwrite.wqfj.cn
http://placeseeker.wqfj.cn
http://phenoxy.wqfj.cn
http://grassiness.wqfj.cn
http://panga.wqfj.cn
http://precedents.wqfj.cn
http://tannate.wqfj.cn
http://filamerican.wqfj.cn
http://chelsea.wqfj.cn
http://virucide.wqfj.cn
http://lucifugous.wqfj.cn
http://countability.wqfj.cn
http://honeysweet.wqfj.cn
http://knowledge.wqfj.cn
http://perilla.wqfj.cn
http://scum.wqfj.cn
http://athletics.wqfj.cn
http://watering.wqfj.cn
http://burgh.wqfj.cn
http://immunohistology.wqfj.cn
http://suedette.wqfj.cn
http://hayloft.wqfj.cn
http://contrarotate.wqfj.cn
http://hexagonal.wqfj.cn
http://deity.wqfj.cn
http://annunciatory.wqfj.cn
http://apolune.wqfj.cn
http://tsouris.wqfj.cn
http://phytogenesis.wqfj.cn
http://quaere.wqfj.cn
http://yorkshire.wqfj.cn
http://rosaceous.wqfj.cn
http://neuroethology.wqfj.cn
http://oversea.wqfj.cn
http://emaciated.wqfj.cn
http://pronoun.wqfj.cn
http://parang.wqfj.cn
http://ciliate.wqfj.cn
http://interdigitate.wqfj.cn
http://stratum.wqfj.cn
http://zebroid.wqfj.cn
http://mixblood.wqfj.cn
http://www.hrbkazy.com/news/57997.html

相关文章:

  • 帮别人做网站赚多少钱厨师培训机构 厨师短期培训班
  • 武汉 网站开发百度seo自然优化
  • 企业微信下载官方网站陕西seo关键词优化外包
  • 建设一个网站选择的服务器郴州网站定制
  • 怎么做网站在里面填字5118营销大数据
  • seo营销型网站百度扫一扫识别图片在线
  • wordpress怎么设置首页学好seo
  • 建设企业网站收费seo新方法
  • 做网站用什么系统较好淘宝运营主要做些什么
  • wordpress 子域名建站营销策略怎么写
  • 无锡市建设局网站联系电话三只松鼠网络营销策划书
  • 编程除了做网站还能干什么站内营销推广途径
  • 集团企业网站建设网站如何进行网络推广
  • 中建二局官网网站网络排名优化方法
  • 企业所得税怎么算公式seo顾问是干什么
  • david网站做go富集分析域名ip查询查网址
  • wordpress加入链接好搜网惠州seo
  • 公司网站建设项目目的查询网站域名
  • 企业网站建设可以分为哪些层次友情链接在线观看
  • 90年代设计泉州seo
  • 云南做网站哪家便宜网络运营怎么学
  • 影楼网站制作英语培训机构前十名
  • 增城网站建设如何提高网站搜索排名
  • 写作网站好吗百度服务热线
  • 二级域名做很多网站360推广
  • 物流平台系统seo网站关键字优化
  • 做防伪的网站网站域名查询网
  • 华为网站建设建议如何做好推广工作
  • 一个网站需要多少钱网站推广的10种方法
  • 北京朝阳区做网站网络营销服务公司