特征提取与深度神经网络(二)

embedded/2024/12/23 6:12:12/

关键点/角点检测

        2011论文-ORB关键点检测,比SIFT与SURF速度更快。

        ORB算法可以看出两个部分组成:快速关键点定位+BRIEF描述子生成

Fast关键点检测:

选择当前像素点P,阈值T,周围16个像素点,超过连续N=12个像素点大于或者小于P

优先现检测1、5、9、13循环所有的像素点。

特征提取

从关键点到特征描述子

基于关键点周围区域

浮点数表示与二值编码

描述子长度

描述子是指在计算机视觉和图像处理领域中用于表示图像或图像中的特征的数学特征向量或向量集合。描述子的目标是以紧凑的方式捕获图像的关键信息。使得在进行图像识别、检索、匹配等任务时能高效的比较和处理图像。描述子通常基于图像的局部特征点,比如角点、边缘点等,通过提取这些局部特征点的特征向量来描述图像。如以下图表:

ORB特征描述子生成步骤:

        提取特征关键点

        描述子方向指派

        特征描述子编码(二值编码32位)

orb.detectAndCompute提取图像关键点跟特征描述子,得到453个关键点,对应453x32的描述子矩阵

特征匹配算法

用于比较和匹配图像中特征点或描述子的算法。特征匹配算法的目标是在不同图像或视频帧中找到对应的特征点或描述子,从而实现目标跟踪、图像配准、物体识别。

常见的特征匹配算法包括:

        1、基于光流的匹配算法,需要通过追踪图像中像素的移动来匹配特征点。

        2、基于相似度度量,通过计算特征点或描述子之间的相似度来进行匹配。

        3、基于几何形状的匹配算法:通过比较特征点之间的几何关系来进行匹配

        4、基于优化方法的匹配算法:通过最小化匹配误差的优化方法来进行匹配

        5、基于机器学习的匹配算法:通过训练机器学习模型来实现特征匹配。

DMatch是OpenCV中用于表示特征匹配结果的数据结构。在OpenCV中,DMatch对象包含了两个特征点之间的距离和它们在特征点列表中的索引。通过DMatch对象,可以方便地获取匹配特征点之间的距离信息,以及它们在特征点列表中的索引位置,从而在特征匹配算法中进行匹配结果的分析和处理。

DMatch数据结构:

queryIdx

trainldx

distance,表示匹配最后得到的距离,值越小表示匹配程度越高。

暴力匹配算法实现

        使用SIFT算法检测关键点和描述子。接着,我们初始化了一个暴力匹配器,并使用KNN方法进行匹配。最后,我们应用了比率测试,筛选出最佳匹配,并将匹配结果绘制在一张新的图像中展示出来。

import cv2
import numpy as np# 读取图像
img1 = cv2.imread('image1.jpg', 0)  # queryImage
img2 = cv2.imread('image2.jpg', 0)  # trainImage# 初始化SIFT检测器
sift = cv2.SIFT_create()# 寻找关键点和描述子
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)# 初始化暴力匹配器
bf = cv2.BFMatcher()# 使用KNN匹配
matches = bf.knnMatch(des1, des2, k=2)# 应用比率测试,以确保最佳匹配
good_matches = []
for m, n in matches:if m.distance < 0.75 * n.distance:good_matches.append([m])# 绘制匹配结果
img_matches = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good_matches, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)# 显示匹配结果
cv2.imshow('Matches', img_matches)
cv2.waitKey(0)
cv2.destroyAllWindows()

KNN是K-Nearest Neighbors(K近邻)的缩写,是一种常用的机器学习算法。在KNN算法中,当需要对一个新样本进行分类或回归时,会找出与该样本最相似的K个训练样本(即最近的K个邻居),然后利用这K个样本的标签或属性值来进行分类或回归预测。

在分类问题中,KNN根据K个最近邻居的类别进行投票,将投票数最多的类别作为新样本的类别;在回归问题中,KNN根据K个最近邻居的属性值进行平均或加权平均来预测新样本的属性值。


http://www.ppmy.cn/embedded/41213.html

相关文章

AI电视起风,三星电视打破“隔代飞跃”,在AI纪元再次领跑

作者 | 曾响铃 文 | 响铃说 要说什么是当下最热的话题&#xff0c;刚落下帷幕的北京车展一定是其中之一&#xff0c;除了各类让人眼花缭乱的新车&#xff0c;纷至沓来的各界行业大佬&#xff0c;也让车展话题度被不断拉高。在此之外&#xff0c;此次车展还刮起了一股“旋风”…

【Delphi 爬虫库 5】HTTP响应状态码说明详解(Response Status Code)

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是互联网上应用最广泛的协议之一&#xff0c;用于在客户端和服务器之间传输数据。在HTTP通信中&#xff0c;服务器在接收到客户端请求后&#xff0c;会返回一个HTTP响应&#xff0c;其中包含一个状态码&#xff0c;这个…

Android中gradle.properties 和 gradle-wrapper.properties 作用

我们更深入地了解这两个文件的作用和它们可以包含的一些常见配置。 gradle.properties gradle.properties文件是一个标准的Java属性文件&#xff0c;它允许你为Gradle构建配置全局属性。这些属性可以在项目的任何地方使用&#xff0c;包括项目的子项目。以下是一些常见的配置…

在React中利用Postman测试代码获取数据

文章目录 概要名词解释1、Postman2、axios 使用Postman测试API在React中获取并展示数据小结 概要 在Web开发中&#xff0c;通过API获取数据是一项常见任务。Postman是一个功能强大的工具&#xff0c;可以帮助开发者测试API&#xff0c;并查看API的响应数据。在本篇博客中&…

如何使用Sentinel实现流控和降级

Sentinel 是一款面向分布式系统的流量控制、熔断和自适应限流工具&#xff0c;由Alibaba开源。Sentinel 以Java客户端的形式提供&#xff0c;可以嵌入到Java应用中以保护系统稳定运行。 以下是使用Sentinel实现流量控制和降级操作的详细步骤&#xff1a; 1. 添加Sentinel依赖…

《架构风清扬-Java面试系列第29讲》聊聊DelayQueue的使用场景

DelayQueue是BlockingQueue接口的一个实现类之一 这个属于基础性问题&#xff0c;老规矩&#xff0c;我们将从使用场景和代码示例来进行讲解 来&#xff0c;思考片刻&#xff0c;给出你的答案 1&#xff0c;使用场景 实现&#xff1a;延迟队列&#xff0c;其中元素只有在其预定…

linux修改目录和文件的权限,linux修改目录下所有文件的权限

查看权限 ls -l your-script.sh 为所有者添加读取和执行权限&#xff08;目录级别&#xff0c;当前目录下所有文件&#xff09; chmod urx * 为组用户添加读取权限&#xff08;目录级别&#xff0c;当前目录下所有文件&#xff09; chmod gr * 为其他用户添加读取和执行权限…

Pytorch学习-引言

Pytorch相关链接 Pytorch官方网站 https://pytorch.org/ Pytorch的Github仓库 https://github.com/pytorch/pytorch Pytorch论坛 https://discuss.pytorch.org/ Pytorch离线下载包链接 https://download.pytorch.org/whl/torch_stable.html Pytorch学习视频推荐链接 http://【…