(四)OpenCV——特征點檢測與匹配

前言

特征點檢測與匹配是計算機視覺中的基礎技術,廣泛應用于圖像拼接、物體識別、三維重建、運動跟蹤等領域。OpenCV 提供了多種特征檢測與匹配算法的實現。

特征點檢測與匹配是計算機視覺中的核心技術,廣泛應用于多個領域。以下是其主要應用場景:

  1. 圖像拼接(全景圖生成):旅游攝影、衛星圖像處理、醫學圖像拼接

  2. 圖像修復與增強:老照片修復、藝術品數字化

  3. 產品質量檢測:電子元件檢測、包裝完整性檢查

  4. 自動光學檢測(AOI):PCB板檢測、液晶面板檢測

  5. 運動目標跟蹤:智能監控、交通流量分

  6. 人臉識別與驗證:門禁系統、移動支付

常用算法:

特征點檢測:

  • Harris 角點檢測

  • Shi-Tomasi 角點檢測

  • SIFT

  • SURF

  • ORB

特征匹配:

  • BFMatcher (暴力匹配)

  • FLANN 匹配器

一、角點

通常意義上來說,角點就是極值點,即在某方面屬性特別突出的點,是在某些屬性上強度最大或者最小的孤立點、線段的終點。?對于圖像而言,如圖所示圓圈內的部分,即為圖像的角點,其是物體輪廓線的連接點。

角點是指圖像中各個方向上灰度變化都非常劇烈的點,具有以下特點:

  • 在兩個正交方向上都有明顯的梯度變化

  • 是圖像中邊緣的交點

  • 局部窗口內無論向哪個方向移動,圖像灰度都會發生顯著變化

角點檢測算法基本思想是使用一個固定窗口(取某個像素的一個鄰域窗口)在圖像上進行任意方向上的滑動,比較滑動前與滑動后兩種情況,窗口中的像素灰度變化程度,如果存在任意方向上的滑動,都有著較大灰度變化,那么我們可以認為該窗口中存在角點。

二、Harris 角點檢測

1. 基本思想

Harris角點檢測基于一個核心觀察:角點是圖像中在各個方向上灰度變化都很劇烈的點。算法通過分析圖像窗口在各個方向的移動引起的灰度變化來檢測角點。

2.OpenCV實現

# harris角點檢測
import cv2img = cv2.imread('../chess.png')# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Harris角點檢測
# 參數說明:
# blockSize - 鄰域大小
# ksize - Sobel算子孔徑
# k - Harris檢測器自由參數
dst = cv2.cornerHarris(gray, 2, 3, 0.04)# 角點展示
img[dst > 0.01 * dst.max()] = [0, 0, 255]cv2.imshow('Harris Corners', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

?運行后的結果:

3.函數解析

def? cornerHarris(src, blockSize, ksize, k)

  1. blockSize

    • 鄰域窗口大小

    • 值越大,檢測的角點越"粗"

    • 典型值:2-5

  2. ksize

    • Sobel算子的孔徑參數

    • 必須是奇數且≤31

    • 影響梯度計算的精度

    • 典型值:3或5

  3. k

    • Harris檢測器的自由參數

    • 值越小,檢測到的角點越多

    • 經驗值范圍:0.04-0.06

4.算法特點

優點

  1. 旋轉不變性:角點旋轉后仍能被檢測

  2. 部分光照不變性:對均勻光照變化不敏感

  3. 計算效率高:適合實時應用

  4. 對噪聲有一定魯棒性(指該算法在圖像存在噪聲干擾的情況下,仍能相對穩定地檢測出正確的角點位置,不會因小的噪聲干擾而產生大量虛假角點或丟失真實角點)

缺點

  1. 不具有尺度不變性:圖像縮放后可能檢測不到相同角點

  2. 對閾值敏感:需要根據圖像調整閾值參數

  3. 角點可能聚集:在紋理豐富區域可能檢測到過多角點

三、Shi-Tomasi 角點檢測

Shi-Tomasi角點檢測方法是基于Harris角點檢測的一種改進,它在多個方面提供了更好的性能和精度。Shi-Tomasi方法的核心思想是通過評估圖像的最小特征值來識別角點。

1.OpenCV實現

# Shi-Tomasi角點檢測(常用)
import cv2
import numpy as npimg = cv2.imread('../chess.png')# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Shi-Tomasi參數
corners = cv2.goodFeaturesToTrack(gray, 1000, 0.01, 10)# 轉為整數
corners = np.int64(corners)# 繪制角點
for i in corners:x, y = i.ravel()cv2.circle(img, (x, y), 3, (0, 0, 255), -1)cv2.imshow('Shi-Tomasi Corners', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

?運行后的結果:

?2.函數解析

def? goodFeaturesToTrack( src, maxCorners, qualityLevel, minDistance)

參數說明建議值
maxCorners表示最多可以檢測到的角點數量,如果圖像中存在更多角點,只保留質量最高的前 n 個。根據需求設定
qualityLevel角點質量閾值(相對最佳角點的比例),角點質量分數的最小值。只有質量高于該值的點才會被保留。值越小,保留的角點數量越多。0.01-0.1
minDistance角點間最小歐式距離,任意兩個角點之間的像素距離必須大于該值,用于避免角點過于密集3-10像素

3.算法特點

優勢

  1. 更直觀的閾值設定:直接使用特征值,無需調整k參數

  2. 角點分布更均勻:通過minDistance參數控制

  3. 計算效率更高:避免計算完整的響應函數

劣勢

  1. 對閾值的絕對依賴:qualityLevel需要根據圖像調整

  2. 固定角點數量:可能遺漏部分角點

四、SIFT(尺度不變特征變換)

1.核心特征

  1. 尺度不變性

    • 通過高斯差分金字塔檢測不同尺度的特征

    • 自動確定特征點所在的最佳尺度

  2. 旋轉不變性

    • 基于局部梯度方向分配主方向

    • 描述符相對于主方向構建

  3. 光照魯棒性

    • 使用梯度信息而非絕對灰度值

    • 對線性光照變化不敏感

2.OpenCV實現

這里我使用的版本是4.12,因為sift的專利已經過期,可以直接使用

import cv2img = cv2.imread('../chess.png')# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 創建sift對象
sift = cv2.SIFT_create()# 檢測關鍵點與描述子
kp, des = sift.detectAndCompute(gray, None)# 繪制關鍵點
cv2.drawKeypoints(gray, kp, img)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

運行結果:

?
3.關鍵點與描述子

關鍵點

  • 本質:圖像中具有顯著特性的局部特征位置
  • 核心屬性:空間信息(坐標、尺度(σ))、幾何特性(主方向、響應強度)

描述子:記錄了關鍵點周圍對其有貢獻的像素點的一組向量值,其不受仿射變換、光照變換等影響

?4.算法特性

優點:

  • 尺度不變性:在圖像縮放±50%時仍能保持80%以上的特征重復率
  • 旋轉不變性:圖像旋轉30°時匹配準確率>90%
  • 光照魯棒性:對光照變化和對比度拉伸的抵抗能強
  • 高區分度描述子:128維向量提供豐富的特征信息

缺點:

  • 計算復雜度高
  • 對模糊敏感:模糊圖像下的性能衰減
  • 邊緣響應問題

五、SURF

SURF是SIFT算法的高效改進版本,在保持類似性能的同時顯著提高了運算速度。

1.OpenCV實現

import cv2img = cv2.imread('../chess.png')# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 因為版權原因,不能使用
surf = cv2.xfeatures2d.SURF_create()# 檢測關鍵點與描述子
kp, des = surf.detectAndCompute(gray, None)cv2.drawKeypoints(gray, kp, img)cv2.imshow('img', img)
cv2.waitKey(0)

運行后的結果:

2.與SIFT對比

特性SURFSIFT
計算速度快3-5倍較慢
描述符維度64/128維128維
尺度空間構建盒式濾波器+積分圖像高斯金字塔
旋轉不變性基于Haar小波響應統計梯度方向直方圖
專利狀態有專利(OpenCV需特殊編譯)已過期
光照魯棒性略優于SIFT優秀

六、ORB特征檢測算法?

ORB(Oriented FAST and Rotated BRIEF)兼具實時性和良好匹配性能,可以做到實時檢測。

1.OpenCV實現

# ORB特征檢測
import cv2img = cv2.imread('../chess.png')# 轉為灰度圖
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 創建ORB對象
orb = cv2.ORB_create()kp, des = orb.detectAndCompute(gray, None)# 繪制關鍵點
cv2.drawKeypoints(gray, kp, img)cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

運行后的結果:

?

2.算法特點

優點:

  • 計算效率高
  • 旋轉不變性改進
  • 尺度不變性(結合金字塔)
  • 二進制描述符:匹配時可通過漢明距離(異或運算)快速計算,適合硬件加速

缺點:

  • 對光照和噪聲敏感:在光照劇烈變化或噪聲較多時性能下降明顯
  • 缺乏仿射不變性:在極端視角變化下匹配效果較差
  • 特征點分布不均
  • 描述符區分性有限:在高相似紋理或重復場景中易誤匹配,需依賴后續篩選

七、對比特征點檢測算法

算法速度尺度不變性旋轉不變性光照魯棒性適用場景
Harris??靜態角點檢測(如標定板)
Shi-Tomasi??需要穩定角點的場景
SIFT??????高精度匹配(如全景拼接、3D重建)
SURF??????實時性要求較低的魯棒匹配
ORB??(金字塔)??(改進BRIEF)?實時應用(SLAM、AR、移動端)

選擇建議

  • 實時性優先:選 ORB(如無人機、移動端 AR)。

  • 精度優先:選 SIFT/SURF(如醫學圖像、三維重建)。

  • 簡單角點檢測:Harris/Shi-Tomasi(如標定、低動態場景)。

  • 平衡速度與魯棒性:SURF 或 ORB + RANSAC 后處理。

八、BFMatcher (暴力匹配)

BFMatcher?是 OpenCV 中一種基于暴力搜索(Brute-Force)的特征匹配方法,通過計算所有特征點之間的相似度來尋找最佳匹配。它適用于各種特征描述符(如 SIFT、SURF、ORB、BRIEF 等),但計算復雜度較高,適合小規模特征匹配或精度要求高的場景。

BFMatcher 的核心思想是?窮舉搜索,即對兩組特征描述符進行兩兩比對,選擇最相似的匹配對。

1.OpenCV實現

# 暴力特征匹配方法
import cv2img1 = cv2.imread('../opencv_search.png')
img2 = cv2.imread('../opencv_orig.png')# 轉為灰度圖
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)# 創建sift對象
sift = cv2.SIFT_create()# 檢測關鍵點與描述子
kp1, des1 = sift.detectAndCompute(gray1, None)
kp2, des2 = sift.detectAndCompute(gray2, None)# 暴力匹配
bf = cv2.BFMatcher(cv2.NORM_L1)
matches = bf.match(des1, des2)# 繪制關鍵點
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches, None)cv2.imshow('img', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

運行結果:

2.算法特點?

優點

??高精度:暴力搜索確保找到全局最優匹配,適合對匹配質量要求高的場景(如 SIFT/SURF)。
??靈活性:支持任意距離度量(如?NORM_L2?用于浮點描述符,NORM_HAMMING?用于二進制描述符)。
??簡單易用:OpenCV 提供直接接口,無需復雜參數調優。

缺點

??計算復雜度高:時間復雜度為 ,大數據量時極慢。
??內存消耗大:需存儲所有特征點的距離矩陣,不適合實時或大規模匹配。

九、FLANN 匹配器

FLANN 是 OpenCV 中用于高效近似最近鄰搜索的庫,適用于大規模特征匹配(如 SIFT、SURF、ORB)。相比暴力匹配(BFMatcher),它通過空間分割(如 KD 樹)層次聚類加速搜索,犧牲少量精度換取速度的大幅提升。

1.LANN 的核心原理

FLANN 通過以下兩種主要方法加速最近鄰搜索:

  1. KD 樹(KD-Tree)

    • 適用于浮點型描述符(如 SIFT、SURF)。

    • 將特征空間遞歸劃分為超矩形區域,搜索時跳過無關區域。

    • 需設置樹的數量(trees=4)和搜索次數(checks=32)。

  2. 局部敏感哈希(LSH)

    • 適用于二進制描述符(如 ORB、BRIEF)。

    • 通過哈希函數將相似特征映射到相同桶中,減少比較次數。

    • 參數包括哈希表數量(table_number)和鍵值長度(key_size)。

2.OpenCV實現

# FLANN特征匹配
import cv2img1 = cv2.imread('../opencv_search.png')
img2 = cv2.imread('../opencv_orig.png')# 轉為灰度圖
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)# 創建sift對象
sift = cv2.SIFT_create()# 檢測關鍵點與描述子
kp1, des1 = sift.detectAndCompute(gray1, None)
kp2, des2 = sift.detectAndCompute(gray2, None)# flann
# FLANN索引的參數
index_params = dict(algorithm=1, trees=5)
# 搜索時的參數
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)# 對描述子進行匹配計算
matches = flann.knnMatch(des1, des2, k=2)# 篩選匹配
good = []
for i, (m, n) in enumerate(matches):if m.distance < 0.7 * n.distance:good.append(m)# 繪制關鍵點
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, [good], None, flags=2)cv2.imshow('img', img3)
cv2.waitKey(0)

?運行后的結果:

3. 算法特點

優點

??速度快:比 BFMatcher 快 10~100 倍(尤其適合大規模數據)。
??靈活性:支持浮點和二進制描述符,參數可調。
??內存友好:索引結構優化,適合嵌入式設備或實時系統(如 SLAM)。

缺點

??近似匹配:返回的結果是近似最優,可能遺漏真實最近鄰。
??參數敏感:需根據數據分布調整?treeschecks?等參數。

參考文獻:

角點(corner point)、關鍵點(key point)、特征點(feature point)概念辨析_關鍵角點-CSDN博客

OpenCV快速入門:特征點檢測與匹配_opencv特征點檢測與匹配-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89544.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89544.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89544.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

if (a == 1 a == 2 a == 3)返回true的問題思考

引文&#xff1a; 無意中看到了這樣的非常規邏輯&#xff0c;在想前后端應該都可以實現&#xff0c;a 是變量&#xff0c;或者操作a時觸發了值得改變。 意義&#xff1a; 該問題讓我們知道了一切規則都是可以被打破的&#xff0c;世界上的規則都是為了解釋某種現象設計的。 題目…

MySQL的索引操作及底層結構淺析

一.索引提高數據庫的性能&#xff0c;索引是物美價廉的東西了。不用加內存&#xff0c;不用改程序&#xff0c;不用調sql&#xff0c;只要執行正確的 create index &#xff0c;查詢速度就可能提高成百上千倍。但是天下沒有免費的午餐&#xff0c;查詢速度的提高是以插入、更新…

stm32f4 dma的一些問題

文章目錄前言一、使用開發板燒錄dma代碼不生效問題二、一個工程同時使用uart2、uart3借助dma來傳遞1.并行。2.DMA "同時工作"的本質3.總線訪問的具體含義4.實際效果5.最佳實踐5.1 總線傳輸機制&#xff1a;6.DMA傳輸中斷的問題總結前言 記錄一些使用stm32f4 dma過程…

登錄功能實現深度解析:從會話管理到安全校驗全流程指南

登錄功能實現深度解析&#xff1a;從會話管理到安全校驗全流程指南大家好&#xff0c;我是凱哥Java本文標簽&#xff1a;登錄驗證流程、過濾器與攔截器、安全防護措施簡介本文深入探討了從登錄功能實現到會話管理和安全校驗的全流程&#xff0c;包括參數校驗、身份驗證、令牌生…

2023 年 5 月青少年軟編等考 C 語言六級真題解析

目錄 T1. 字符串插入 思路分析 T2. 機器翻譯 思路分析 T3. 棧基本操作 思路分析 T4. 雙端隊列 思路分析 T1. 字符串插入 題目鏈接:SOJ D1138 有兩個字符串 s t r str str 和 s u b s t r substr substr, s t r str str 的字符個數不超過 10 10 10, s u b s t r substr …

Redux架構解析:狀態管理的核心原理

Redux 作為 JavaScript 應用的狀態管理庫&#xff0c;其技術架構與核心原理圍繞??可預測的狀態管理??設計&#xff0c;通過嚴格的單向數據流和函數式編程理念實現復雜應用的狀態控制。以下從設計理念、核心架構、工作流程、源碼實現等角度進行系統性剖析&#xff1a;一、設…

linux制作鏡像、壓縮鏡像、燒錄的方法

最近在玩香橙派的時候&#xff0c;需要搞多個板子&#xff0c;一個一個配環境也太麻煩了吧......于是通過搜索&#xff0c;發現可以把linux設備&#xff08;比如香橙派&#xff0c;樹莓派等等&#xff09;制作為鏡像&#xff0c;然后像燒錄官方鏡像一樣燒進新的sd卡&#xff0c…

機械材料計算軟件,快速核算重量

軟件介紹 今天為大家推薦一款專為機械行業設計人員打造的金屬材料重量計算軟件&#xff0c;幫助工程師快速完成材料重量核算。 軟件特點 這款綠色版計算工具體積小巧&#xff0c;不足100KB&#xff0c;無需安裝即可直接運行&#xff0c;不占用系統資源&#xff0c;特別適…

Chrome更新后,擴展不能用問題

Chrome更新后&#xff0c;擴展不能用問題 此擴展程序不再受支持&#xff0c;因此已停用 在 Windows 10/11 搜索框中輸入 regedit 打開 注冊表編輯器 在注冊表編輯器中打開&#xff1a;HKEYLOCALMACHINE\SOFTWARE\Policies\ 右鍵單擊 Policies 新建項 命名為 Google 右鍵單…

【Python】通過cmd的shell命令獲取局域網內所有IP、MAC地址,通過主機名獲取IP

【Python】通過cmd的shell命令獲取局域網內所有IP、MAC地址&#xff0c;通過主機名獲取IP 更新以gitee為準&#xff1a; gitee 文章目錄cmd命令獲取IPping主機名獲取IP的主機名socket獲取當前網關運行效果附錄&#xff1a;列表的賦值類型和py打包列表賦值BUG復現代碼改進優化總…

sky-take-out項目Mybatis的使用

分頁查詢public PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO) {PageHelper.startPage(categoryPageQueryDTO.getPage(),categoryPageQueryDTO.getPageSize());//下一條sql進行分頁&#xff0c;自動加入limit關鍵字分頁Page<Category> page categor…

H3CNE小小綜合實驗

實驗拓撲圖實驗需求 按照圖示配置IP地址在SW1和SW2之間配置鏈路聚合增加鏈路帶寬&#xff0c;提高可靠性PC5和PC6屬于VLAN10&#xff0c; PC7和PC8屬于VLAN20SW1和SW2屬于二層交換機&#xff0c;SW3為三層交換機&#xff08;VLAN100用于對接R4&#xff09;,在交換機之間相連的鏈…

IP協議深入理解

一、什么是ip協議?1.1、ip協議是網絡層協議&#xff0c;ip協議的本質工作是提供一種能力&#xff0c;把數據可靠的跨網絡從主機A送到主機B&#xff1b;1.2、什么是ip&#xff1f;ip目標網絡目標主機&#xff1b;畫圖圖解:如圖&#xff0c;當主機A想要把數據發給主機B時&#x…

接收表單數據:serialize()函數解析

一、form-serialize作用與引入 作用&#xff1a; form-serialize可以快速收集表單數據&#xff0c;按照使用者意愿轉化為對象或字符串輸出&#xff0c;以便于提交至服務器。 引入&#xff1a; form-serialize不是瀏覽器自帶的JS方法&#xff0c;而是第三方工具庫。可以直接通過…

vc配置使用預編譯

預編譯原理 stdafx.h中加入系統文件&#xff0c;減少cpp中對這些文件的解析&#xff0c;提高速度 stdafx.h 會把編譯的文件生成pch&#xff0c;后續解析頭文件直接調用pch里面的數據 配置 新建stdafx.h和stdafx.cpp文件 配置stdafx.cpp文件為/Yc 創建預編譯文件整個項目設置/Yc…

反射機制的登錄系統

一、實體層&#xff08;po層&#xff09; //UserInfo package com.hugeyurt.po;import java.sql.ResultSet; import java.sql.SQLException;public class UserInfo {private String userID;private String name;private int count;private Long errorTime;private String pwd;p…

裝飾器模式及優化

裝飾器模式&#xff08;Decorator Pattern&#xff09;是一種結構型設計模式&#xff0c;它允許向一個現有的對象添加新的功能&#xff0c;同時又不改變其結構。這種模式創建了一個裝飾器類&#xff0c;用來包裝原有的類&#xff0c;并在保持類方法簽名完整性的前提下&#xff…

共指消解技術全解析:從語言學規則到深度學習(附論文精讀)

精讀威斯康星大學綜述《Coreference Resolution: A Survey》&#xff0c;揭秘NLP中"實體鏈接"的核心技術一、什么是共指消解&#xff1f;為什么它是NLP的基石&#xff1f;共指消解(Coreference Resolution) 旨在識別文本中指向同一實體的不同表述。例如&#xff1a;t…

git配置git commit -m “fix 11,22: 修改bugid為11,22“

文章目錄前言一、報錯提示二、實現1.commitlint.config.js規范配置2. **修改正則表達式**&#xff1a;3. **移除 scope-case 規則**&#xff1a;4. **增強自定義規則邏輯**&#xff1a;測試結果&#xff1a;正則表達式詳解&#xff1a;前言 提示&#xff1a;正常的配置git規范…

nastools繼任者?極空間部署影視自動化訂閱系統『MediaMaster』

nastools繼任者&#xff1f;極空間部署影視自動化訂閱系統『MediaMaster』 哈嘍小伙伴們好&#xff0c;我是Stark-C~ 對于我們NAS玩家來說&#xff0c;觀影總是大家繞不開的一個執念&#xff0c;并且為觀影的折騰大家也都是樂此不疲~ 曾經有一個非常絕絕子的觀影神器擺在我們…