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
英文地址,請注明出處:http://en.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…