OpenCV特征点提取算法orb、surf、sift对比

下面是 OpenCV 中三种常用特征点提取算法:ORB、SURF 和 SIFT 的详细对比,从 算法原理、性能、使用限制适用场景 多维度进行总结,帮助大家在实际项目中合理选择。


一览表:ORB vs. SURF vs. SIFT

属性/算法ORBSURFSIFT
全称Oriented FAST and Rotated BRIEFSpeeded Up Robust FeaturesScale-Invariant Feature Transform
开源许可✅ BSD(免费)❌ 专利限制(非自由软件)✅ 已开源(OpenCV >=4.4)
是否开源商用✅ 可商用❌(受专利保护)✅(2020年后 SIFT 专利过期)
是否旋转不变✅ 支持✅ 支持✅ 支持
是否尺度不变✅ 部分支持(较弱)✅ 支持(多层金字塔)✅ 支持(DoG 金字塔)
描述子类型Binary(256 bits)浮点型(64 或 128 维)浮点型(128 维)
匹配方法Hamming 距离欧氏距离(L2)欧氏距离(L2)
速度性能⭐⭐⭐⭐(快)⭐⭐(中等)⭐(慢)
匹配精度⭐⭐(中等)⭐⭐⭐⭐(好)⭐⭐⭐⭐(非常好)
鲁棒性(旋转/模糊)
适用场景实时系统、嵌入式、SLAM图像拼接、对象识别、高端处理高精度匹配、医学、遥感图像

1. ORB 原理简述

  • 特征点检测:FAST(Features from Accelerated Segment Test)

  • 特征点方向计算:基于像素灰度质心

  • 特征描述子:BRIEF + 旋转不变性(rBRIEF)

  • 优势:

    • 速度快
    • 二值描述符可用 Hamming 距离加速匹配
    • 占用内存低

适合场景:实时 SLAM、低功耗设备、无人机视觉、移动设备等


2. SURF 原理简述

  • 特征点检测:基于 Hessian 矩阵行列式,在图像金字塔中搜索极值
  • 描述子:利用 Haar 小波方向性描述,64 或 128维浮点向量
  • 加速方式:使用 积分图 提升速度

特点:

  • 稳定性优于 ORB
  • 对模糊、光照变化更鲁棒
  • 比 SIFT 快但仍较慢

注意:OpenCV 的 xfeatures2d 模块中,使用 SURF 需要编译 contrib 模块,并且受专利保护(非自由软件)

适合场景:学术研究、工业图像拼接、目标识别(但不推荐商用)


3. SIFT 原理简述

  • 特征点检测:DoG(差分高斯)金字塔中寻找尺度空间极值点
  • 特征方向:主方向分配
  • 描述子:每个关键点周围构建 4×4 子区域 + 每个子区域方向直方图(8 bins) = 128维描述子

特点:

  • 尺度不变性、旋转不变性极好
  • 描述子非常稳定
  • 适合图像配准、结构恢复、医学图像分析等

早期受专利保护,2020 年后专利到期,在 OpenCV 4.4+ 版本已免费开放。

适合场景:离线图像分析、精度优先任务


可视化示意(假设图像中检测点数为 N):

图像特征点分布ORBSURFSIFT
点数控制可以设置最大数目阈值控制(Hessian)阈值控制(DoG)
特征分布较密较稀但稳定密集且稳健
描述子结构二值向量向量

如何选择?

需求推荐算法
实时性强,如 SLAM / 视觉跟踪✅ ORB
匹配精度要求高,时间不敏感✅ SIFT
高端应用/研究图像配准✅ SURF
嵌入式系统/移动设备✅ ORB
可商用、无专利约束✅ ORB / SIFT

示例组合建议

模块ORBSIFTSURF
特征点检测ORB detectorSIFT detectorSURF detector
描述子提取ORBSIFTSURF
匹配器(BF)Hamming matcherL2 matcherL2 matcher
替代方案(更快)AKAZE / BRISK--

总结

特征对比ORB(推荐实时)SIFT(推荐精度)SURF(研究可选)
开源许可✅ 免费✅ 免费❌ 专利受限
描述子类型二进制浮点浮点
匹配方式汉明距离欧氏距离欧氏距离
稳定性中等非常好非常好
速度很快中等

特征提前模块封装

下面提供一个完整封装的 OpenCV 特征提取与匹配模块(支持 ORB / SIFT / SURF 切换),包括:

  • 特征点提取(ORB/SIFT/SURF 任选)
  • 特征描述子提取
  • 特征匹配(使用合适的匹配器:Hamming / L2)
  • 简单主函数调用示例

1. C++ 封装版本:FeatureMatcher.hpp / .cpp

FeatureMatcher.hpp

#pragma once
#include <opencv2/opencv.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/xfeatures2d.hpp>enum class FeatureType {ORB,SIFT,SURF
};class FeatureMatcher {
public:FeatureMatcher(FeatureType type = FeatureType::ORB, bool crossCheck = true);void extract(const cv::Mat& image,std::vector<cv::KeyPoint>& keypoints,cv::Mat& descriptors);void match(const cv::Mat& desc1, const cv::Mat& desc2,std::vector<cv::DMatch>& matches);FeatureType getType() const { return featureType; }private:FeatureType featureType;cv::Ptr<cv::Feature2D> detector;cv::Ptr<cv::DescriptorMatcher> matcher;
};

FeatureMatcher.cpp

#include "FeatureMatcher.hpp"FeatureMatcher::FeatureMatcher(FeatureType type, bool crossCheck): featureType(type)
{switch (featureType) {case FeatureType::ORB:detector = cv::ORB::create(1000);matcher = cv::BFMatcher::create(cv::NORM_HAMMING, crossCheck);break;case FeatureType::SIFT:detector = cv::SIFT::create();matcher = cv::BFMatcher::create(cv::NORM_L2, crossCheck);break;case FeatureType::SURF:detector = cv::xfeatures2d::SURF::create(400);matcher = cv::BFMatcher::create(cv::NORM_L2, crossCheck);break;default:throw std::invalid_argument("Unsupported feature type");}
}void FeatureMatcher::extract(const cv::Mat& image,std::vector<cv::KeyPoint>& keypoints,cv::Mat& descriptors)
{detector->detectAndCompute(image, cv::noArray(), keypoints, descriptors);
}void FeatureMatcher::match(const cv::Mat& desc1, const cv::Mat& desc2,std::vector<cv::DMatch>& matches)
{matcher->match(desc1, desc2, matches);
}

2. 主函数示例 main.cpp

#include "FeatureMatcher.hpp"
#include <iostream>int main()
{cv::Mat img1 = cv::imread("image1.jpg", cv::IMREAD_GRAYSCALE);cv::Mat img2 = cv::imread("image2.jpg", cv::IMREAD_GRAYSCALE);if (img1.empty() || img2.empty()) {std::cerr << "Images not found!" << std::endl;return -1;}//  支持 ORB / SIFT / SURFFeatureMatcher matcher(FeatureType::SIFT);  // 可改为 ORB / SURFstd::vector<cv::KeyPoint> kp1, kp2;cv::Mat desc1, desc2;matcher.extract(img1, kp1, desc1);matcher.extract(img2, kp2, desc2);std::vector<cv::DMatch> matches;matcher.match(desc1, desc2, matches);std::sort(matches.begin(), matches.end(),[](const cv::DMatch& m1, const cv::DMatch& m2) {return m1.distance < m2.distance;});cv::Mat output;cv::drawMatches(img1, kp1, img2, kp2, matches, output);cv::imshow("Matches", output);cv::waitKey(0);return 0;
}

3. CMakeLists.txt 示例

cmake_minimum_required(VERSION 3.10)
project(FeatureMatcherDemo)find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})add_executable(main main.cpp FeatureMatcher.cpp)
target_link_libraries(main ${OpenCV_LIBS})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/91880.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/91880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeafletJS 与 React:构建现代地图应用

引言 LeafletJS 是一个轻量、灵活的 JavaScript 地图库&#xff0c;广泛用于创建交互式 Web 地图&#xff0c;而 React 作为现代前端框架&#xff0c;以其组件化、状态管理和虚拟 DOM 特性&#xff0c;成为构建动态用户界面的首选工具。将 LeafletJS 与 React 结合&#xff0c…

前后端数据交互,关于表单数据传输问题

表单提交var formData new FormData(); // 添加每个事故ID作为单独的参数 accidentIds.forEach(id > formData.append(accidentIds, id)); formData.append(status, statusText); $.messager.confirm(确认, 确定要将事故记录标记为 statusText 吗&#xff1f;, function …

新书推介 | 吉林大学出版教材《汽车智能辅助驾驶系统技术》,国产仿真工具链GCKontrol-GCAir教学应用

近日&#xff0c;吉林大学出版了由高镇海教授、孙天骏副教授主编的新教材《汽车智能辅助驾驶系统技术》&#xff0c;本书系统地介绍了汽车智能辅助驾驶系统的发展需求、物理架构、功能算法、技术原理以及应用场景。在教材第17章《仿真测试》&#xff0c;应用国产化GCKontrol-GC…

从 0 到 1 玩转 XSS - haozi 靶场:环境搭建 + 全关卡漏洞解析

文章目录前言靶场地址0X00 直接注入0X01 闭合标签10X02 闭合标签20X03 绕过特殊符号10X04 绕过特殊符号20X05 绕过注释符0X06 绕过更多符号0X07 绕过更多符号20X08 绕过闭合符号0X09 绕过URL匹配0X0A 绕过URL过滤0X0B 绕过大写转换10X0C 绕过大写转换20X0D 绕过注释0X0E 古英语…

TF卡格式化

cmd 输入diskpart,在新打开的窗口输入list disk&#xff0c;然后select disk [磁盘号]&#xff0c;clean&#xff0c;回车变成未分区的。再选中磁盘&#xff0c;选中之后create partition [分区名] 回车&#xff0c;list partition&#xff0c;查看分区&#xff0c;输入active&…

Python爬虫实战:研究sqlparse库相关技术

1. 引言 1.1 研究背景与意义 在当今数据驱动的时代,SQL 作为关系型数据库的标准查询语言,被广泛应用于各种数据处理和分析场景。随着数据库应用的不断发展,SQL 代码的规模和复杂度也在不断增加,这给 SQL 代码的编写、维护和优化带来了挑战。 研究表明,低效的 SQL 查询是…

全球天气预报5天(经纬度版)免费API接口教程

本文全面介绍由接口盒子免费API提供的全球天气预报API&#xff0c;支持通过经纬度坐标获取任意地区未来5天的详细天气预报数据。 一、接口核心功能 ​全球覆盖​&#xff1a;支持全球任意经纬度坐标点的天气预报​高精度预报​&#xff1a;提供每3小时为间隔的精细化预报&…

5 基于STM32单片机的绝缘检测系统设计(STM32代码编写+手机APP设计+PCB设计+Proteus仿真)

系列文章目录 文章目录 系列文章目录前言1 1 资料获取与演示视频1.1 资料介绍1.2 资料获取1.3 演示视频 2 系统框架3 硬件3.1 主控制器3.2 显示屏3.3 WIFI模块3.4 DHT11温湿度传感器3.5 可调电位器 4 设计PCB4.1 安装下载立创EDA专业版4.2 画原理图4.3 摆放元器件&#xff0c;设…

CPP学习之list使用及模拟实现

一、list简介及用法 1. list简介 list是可以在常数范围内任意位置进行插入、删除、修改操作的有顺序性的容器&#xff0c;而且支持双向迭代&#xff0c;其底层是双链表结构&#xff0c;逻辑上连续但物理空间上不连续&#xff0c;只能通过指针来进行元素访问&#xff0c;无法使用…

Spring Boot 参数校验:@Valid 与 @Validated

在日常开发中&#xff0c;参数校验是保障接口健壮性与数据安全的第一道防线。Spring Boot 为我们提供了基于 JSR-303/JSR-380 的强大校验机制&#xff0c;通过注解与 AOP 实现了灵活且高效的数据校验方式。本篇博客将详细介绍 Spring Boot 中 Valid、Validated 注解的使用方法&…

linux看门狗重启定位思路总结

1&#xff0c;看门狗定位思路&#xff08;1&#xff09;是否是死锁导致查看日志查看是否有RCU install或者deadlock相关打印&#xff0c;如果有的话可以考虑使用lockdep死锁检测工具&#xff08;2&#xff09;中断风暴查看中断&#xff0c;抓中断打印&#xff0c;可以查看/proc…

基于单片机直流电机测速中文液晶显示设计

摘 要 在现在工业自动化高度发展的时期&#xff0c;几乎所有的工业设备都离不开旋转设备&#xff0c;形形色色的电机在不同领域发挥着很重要的作用。不同场合对电机控制要求是不同的&#xff0c;但大部分都会涉及到旋转设备的转速测量&#xff0c;从而利用转速来实施对旋转设备…

c# sqlsugar 主子表明细 查询

在使用 SqlSugar ORM 进行数据库操作时&#xff0c;特别是在处理主子表关系时&#xff0c;通常需要执行关联查询来获取主表和其子表的数据。SqlSugar 提供了强大的查询能力&#xff0c;支持多种方式的关联查询&#xff0c;包括左连接&#xff08;Left Join&#xff09;、内连接…

研华PCI-1285/1285E 系列------(一概述)

PCI-1285/1285E 系列是基于 DSP 的 SoftMotion PCI 总线控制器卡,专为各种电机自动 化和其它机器自动化的广泛应用设计。板卡配有高性能 DSP,其中包括 SoftMotion算法,能够实现运动轨迹和时间控制,以满足精确运动中的同步应用需求。 研华 SoftMotion 支持以下特性:龙门…

二代身份证识别技术的发展:从机器学习到深度学习

一、技术发展历程1. 传统机器学习时代&#xff08;2000-2012&#xff09;特征工程方法&#xff1a;主要依赖手工设计的特征&#xff08;HOG、SIFT、LBP等&#xff09;分类器技术&#xff1a;支持向量机(SVM)、随机森林、AdaBoost等OCR技术&#xff1a;基于模板匹配和连通区域分…

云服务器如何设置防火墙和安全组规则?

一、安全组&#xff08;Security Group&#xff09;设置安全组是云平台提供的虚拟防火墙&#xff0c;用于控制 入站&#xff08;Ingress&#xff09;和出站&#xff08;Egress&#xff09;流量。1. 基本安全组规则&#xff08;推荐&#xff09;协议端口源IP用途是否必需TCP22你…

排序【各种题型+对应LeetCode习题练习】

目录 常用排序 快速排序 LeetCode 912 排序数组 归并排序 LeetCode 912 排序数组 常用排序 名称排序方式时间复杂度是否稳定快速排序分治O(n log n)否归并排序分治O(n log n)是冒泡排序交换O(n)是插入排序插入O(n)是选择排序选择最值O(n)否C STL sort快排内省排序O(n log…

鸿蒙与web混合开发双向通信

鸿蒙与web混合开发双向通信用runJavaScript和registerJavaScriptProxy web entry/src/main/resources/rawfile/1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&q…

unity Physics.RaycastNonAlloc

Physics.RaycastNonAlloc 是 Unity 中用于 3D 物理射线检测的高性能方法&#xff0c;它是 Physics.Raycast 的非分配版本。 方法签名 public static int RaycastNonAlloc(Ray ray, RaycastHit[] results, float maxDistance Mathf.Infinity, int layerMask DefaultRaycastLay…

数据库(five day finally)——物物而不物于物,念念而不念于念。(数据库到此结束!祝世间美好与各位不期而遇,善意常伴汝身!)

1.子查询&#xff08;1&#xff09;where 子查询①多行单列配合in和not in操作&#xff08;类似于数据范围查询&#xff09;例&#xff1a;显示工资与各个经理相同的雇员信息&#xff08;包含经理本身&#xff09;。select * from empwhere sal(select sal from emp where jobM…