OpenCv高階(四)——角點檢測

一、角點檢測

在計算機視覺中,角點檢測是識別圖像中局部區域(角點)的關鍵技術,這些區域通常是兩條或多條邊緣的交點,具有豐富的結構信息,常用于圖像匹配、跟蹤、三維重建等任務。

Harris角點檢測算法是一種常用的計算機視覺算法,用于檢測圖像中的角點。該算法通過計算圖像中每個像素的局部自相關矩陣,來判斷該像素是否為角點。

角點檢測算法的基本思想:

使用一個固定的小窗口在圖像上進行任意方向的滑動,比較滑動前與滑動后兩種情況,窗口中的像素灰度變化程度,如果存在任意方向上的滑動,都有著較大灰度變化(sobel算子,在圖像的邊緣檢測中有詳細解釋),那么我們可以認為該窗口中存在角點。

1、Harris 角點檢測(經典方法)

1.?原理

基于圖像局部灰度變化,通過計算像素點在x/y 方向的梯度,構建結構張量矩陣(梯度自相關矩陣),再通過響應函數判斷是否為角點:

角點指圖像中局部區域與周圍區域有較大灰度變化的點或像素。
cornerHarris(img, blockSize, ksize, k[, dst[, borderType]]) -> dst? img:單通道灰度圖像(數據類型為 float32)。? blockSize: 計算角點時考慮的鄰域大小(如 2 表示 2x2 鄰域)。? ksize:Sobel 梯度計算的核大小(常用 3)。? k: 響應函數中的參數,影響角點檢測的敏感度(k 越小,檢測到的角點越多)。,取值參數為 [0.04,0.06]。dst:返回numpy.ndarray對象,大小和src相同,值越大,對應像素點是角的概率越高

?1、圖片的讀取以及灰度轉換

img = cv2.imread('huanghelou.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

?2、檢測角點,并對響應值進行閾值處理

dst = cv2.cornerHarris(gray,4,3,0.04)
# 標記檢測到的角點
img[dst > 0.01 * dst.max()] = [0, 255, 0]
# 這里通過對角點響應進行閾值處理,標記出檢測到的角點。
# 0.05 * dst.max() 是一個閾值,大于這個值的像素點會被標記為綠色。
cv2.imshow('img',img)
cv2.waitKey(0)

2、Shi-Tomasi 角點檢測(Good Features to Track)

1.?原理

Harris 算法的改進版,直接利用矩陣?M?的最小特征值判斷角點:

  • 若最小特征值大于閾值,則認為是角點(相比 Harris 更魯棒,尤其在圖像跟蹤中表現更好)。
2.?OpenCV 函數
corners = cv2.goodFeaturesToTrack(gray_img, maxCorners, qualityLevel, minDistance)
  • 參數
    • maxCorners:最多檢測的角點數量(若角點數量超過,按響應值降序篩選)。
    • qualityLevel:角點質量閾值(0~1,值越小保留的角點越多,通常取 0.01~0.1)。
    • minDistance:角點之間的最小像素距離(避免密集角點)。
  • 輸出:角點坐標數組(形狀為?(N, 1, 2),N 為角點數量)。
3.?示例代碼
import cv2
import numpy as npimg = cv2.imread('building.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# Shi-Tomasi角點檢測
corners = cv2.goodFeaturesToTrack(gray, maxCorners=100, qualityLevel=0.01, minDistance=10)
corners = np.int0(corners)  # 轉換為整數坐標# 繪制角點
for corner in corners:x, y = corner.ravel()cv2.circle(img, (x, y), 3, (0, 255, 0), -1)  # 綠色圓點標記cv2.imshow('Shi-Tomasi Corners', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3、FAST 角點檢測(快速角點檢測)

1.?原理

基于像素灰度差異的高效角點檢測算法,核心思想是:若某像素點與其周圍 16 個像素中的 N 個(如 9 個)灰度差異足夠大,則認為是角點(稱為 FAST-9)。

  • 優點:速度極快,適合實時應用。
  • 缺點:對噪聲敏感,需結合非極大值抑制(NMS)篩選角點。
2.?OpenCV 函數
fast = cv2.FastFeatureDetector_create(threshold=10, nonmaxSuppression=True)
corners = fast.detect(gray_img, None)
  • 參數
    • threshold:灰度差異閾值(值越小,檢測到的角點越多)。
    • nonmaxSuppression:是否啟用非極大值抑制(建議設為 True,避免密集角點)。
  • 輸出KeyPoint?對象列表,包含角點坐標、大小等信息。
3.?示例代碼
import cv2img = cv2.imread('fast_corner.jpg', cv2.IMREAD_GRAYSCALE)# 創建FAST檢測器
fast = cv2.FastFeatureDetector_create(threshold=10, nonmaxSuppression=True)# 檢測角點
corners = fast.detect(img, None)# 繪制角點
img_color = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
cv2.drawKeypoints(img_color, corners, img_color, color=(0, 255, 0), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)cv2.imshow('FAST Corners', img_color)
cv2.waitKey(0)
cv2.destroyAllWindows()

二、算法對比與選擇

算法優點缺點適用場景
Harris經典方法,檢測穩定計算量大,角點密集學術研究、全局角點檢測
Shi-Tomasi跟蹤效果好,抑制邊緣響應依賴參數調優圖像跟蹤(如 LK 光流)
FAST速度極快,適合實時應用對噪聲敏感,需 NMS實時系統(如無人機、機器人)

三、注意事項

  1. 輸入圖像預處理

    • 必須為單通道灰度圖(彩色圖需先轉換為灰度圖)。
    • 建議先進行高斯模糊降噪(如?cv2.GaussianBlur),減少噪聲對角點檢測的影響。
  2. 參數調優

    • qualityLevel(Shi-Tomasi)和?threshold(FAST)需根據圖像對比度調整,避免檢測到過多或過少角點。
    • minDistance?用于控制角點密度,避免相鄰過近的角點。
  3. 角點響應可視化

    • Harris 的響應值需通過閾值(如全局最大值的 1%~5%)篩選后標記。
    • Shi-Tomasi 和 FAST 可直接通過坐標繪制角點。

總結

角點檢測是圖像特征提取的基礎步驟,OpenCV 提供了從經典(Harris)到高效(FAST)的多種算法。選擇時需結合場景需求:

  • 追求精度和穩定性:Shi-Tomasi(推薦用于跟蹤任務)。
  • 追求速度:FAST(需配合 NMS 和降噪)。
  • 學術研究或通用場景:Harris(理解角點檢測的數學原理)。 通過合理調整參數和預處理,可有效提升角點檢測的效果,為后續計算機視覺任務奠定基礎。

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

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

相關文章

Conda 入門指令教程

Conda 入門指令教程 Conda 是一個強大的包和環境管理工具,廣泛應用于數據科學和機器學習項目中。本文將介紹 Conda 的常用指令,幫助你快速上手。 1. Conda 基礎操作 查看 Conda 版本 conda --version顯示當前安裝的 Conda 版本。 更新 Conda conda…

Unity ShaderLab引用HLSL文件找不到其中函數

在寫Unity Shader的過程中,常常需要將方法封裝到HLSL文件中,今天遇到一個這樣的報錯, 明明hlsl文件路徑引用沒問題,卻引用不到方法 并且將分散文件中的函數復制過來一切正常,最終定位到HLSL的預編譯指令中 這指令的…

uniapp上傳圖片時(可選微信頭像、相冊、拍照)

參考文獻&#xff1a;微信小程序登錄——頭像_onchooseavatar-CSDN博客 <button open-type"chooseAvatar" chooseavatar"onChooseAvatar"> </button>onChooseAvatar(e) {uni.showLoading({title: 上傳中...,mask: true});uni.uploadFile({url…

單元測試的一般步驟

Qt Test Qt Test 是 Qt 開發人員發布的一個單元測試框架&#xff0c;用于測試基于 Qt 框架的應用程序或庫。它提供了單元測試框架中常見的所有功能以及用于測試圖形用戶界面的擴展。 1.自動化測試包絡ui測試>接口測試>單元測試&#xff1b;現問如何使用Qt進行單元測試&…

【Matlab】中國沿岸潮灘寬度和坡度分布

【Matlab】中國沿岸潮灘寬度和坡度分布 參考文獻見最后或者閱讀原文&#xff01; 中國沿岸潮灘寬度和坡度分布: figure 1 a 潮灘寬度分布。b 潮灘坡度分布。 圖中標注了中國沿海各省&#xff0c;分別為遼寧&#xff08;LN&#xff09;、河北&#xff08;HB&#xff09;、山東&…

理解.NET Core中的配置Configuration

什么是配置 .NET中的配置&#xff0c;本質上就是key-value鍵值對&#xff0c;并且key和value都是字符串類型。 在.NET中提供了多種配置提供程序來對不同的配置進行讀取、寫入、重載等操作&#xff0c;這里我們以為.NET 的源碼項目為例&#xff0c;來看下.NET中的配置主要是有…

windows服務器及網絡:論如何安裝(虛擬機)

今天我要介紹的是&#xff1a;在Windows中對于安裝系統&#xff08;虛擬機的步驟以及相關的安裝事宜&#xff09;&#xff0c;事不宜遲&#xff0c;讓我們來看看系統安裝&#xff08;虛擬機&#xff09;是怎么操作的&#xff1a; 對現在來說&#xff0c;安裝電腦系統已經是非常…

shardingsphere-jdbc集成Seata分布式事務

1、導入相關依賴 <!-- shardingsphere-jdbc --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc</artifactId><version>5.5.1</version></dependency><!-- shardingspher…

05-DevOps-Jenkins自動拉取構建代碼

新建Gitlab倉庫 先在Gitab上創建一個代碼倉庫&#xff0c;選擇創建空白項目 安裝說明進行填寫&#xff0c;然后點擊創建項目 創建好的倉庫是空的&#xff0c;什么都沒有 新建一個springboot項目&#xff0c;用于代碼上傳使用。 只是為了測試代碼上傳功能&#xff0c;所以代碼…

C#核心(24)結構體和類的區別,抽象類和接口的區別(面試常問)

前言 隨著上一節我們對StringBulider的講解落下帷幕&#xff0c;c#核心的知識點我們也即將告一段落,我們講完了面向對象要用的三大特性&#xff08;封裝&#xff0c;繼承&#xff0c;多態&#xff09;和七大原則。期中自然也不乏一些小的散的碎的的知識點。 今天我們要講的也…

HTMLCSS實現異環網站,期末web作業

本網站是我在學習前端時敲得&#xff0c;僅供學習使用。 這段代碼是一個完整的 HTML 網頁項目&#xff0c;包含 HTML、CSS 和 JavaScript 部分&#xff0c;用于構建一個名為 “異環” 的網頁。網頁具備頭部導航欄、主體視頻展示、圖片交互元素、音樂播放控制、視頻彈窗播放以及…

Oracle表的別名不能用as,列的別名可以用as

在 Oracle 數據庫中&#xff0c;?表的別名?和?列的別名?在使用 AS 關鍵字時確實有不同規則&#xff0c;以下是詳細說明&#xff1a; 1. 表的別名&#xff08;Table Alias&#xff09;? ?不支持 AS 關鍵字?&#xff0c;直接跟在表名后即可。?語法示例?&#xff1a; S…

【SAP ME 44】在 HANA DB中報廢SFC時的SHOP_ORDER表記錄鎖定

癥狀 SELECT…FROM SHOP_ORDER FOR UPDATE 在 SFC 報廢期間持有鎖,當同時調用數量較大時,可能會導致 HANA 數據庫出現大量鎖積壓。這有時會導致因等待 HANA 數據庫釋放“選擇更新”鎖而導致報廢 SFC 花費數分鐘。 HANA 數據庫日志中的示例: # begin PreparedStatement_ex…

Vscode開發Vue項目NodeJs啟動報錯處理

文章目錄 背景一、npm啟動報錯報錯信息定位原因處理方案第一步、下載安裝高版本 二、node 無法識別報錯信息處理方案定位原因第一步、檢測環境變量第二步、重新開啟界面 背景 使用Vscode開發Vue項目&#xff0c;使用到NodeJs&#xff0c;記錄出現的問題及處理方案&#xff0c;…

破局遺留系統!AI自動化重構:從靜態方法到Spring Bean注入實戰

在當今快速發展的軟件行業中,許多企業都面臨著 Java 遺留系統的維護和升級難題。這些老舊系統往往采用了大量靜態方法,隨著業務的不斷發展,其局限性日益凸顯。而飛算 JavaAI 作為一款強大的 AI 工具,為 Java 遺留系統的重構提供了全新的解決方案,能夠實現從靜態方法到 Spring B…

2025媽媽杯數學建模C題完整分析論文(共36頁)(含模型建立、可運行代碼、數據)

2025 年第十五屆 MathorCup 數學建模C題完整分析論文 目錄 摘 要 一、問題分析 二、問題重述 三、模型假設 四、 模型建立與求解 4.1問題1 4.1.1問題1思路分析 4.1.2問題1模型建立 4.1.3問題1代碼&#xff08;僅供參考&#xff09; 4.1.4問題1求解結果&#xff08;僅…

【Python爬蟲詳解】第一篇:Python爬蟲入門指南

什么是網絡爬蟲&#xff1f; 網絡爬蟲&#xff08;Web Crawler&#xff09;是一種自動獲取網頁內容的程序。它可以訪問網站&#xff0c;抓取頁面內容&#xff0c;并從中提取有價值的數據。在信息爆炸的時代&#xff0c;爬蟲技術可以幫助我們高效地收集、整理和分析互聯網上的海…

【JavaWeb后端開發02】SpringBootWeb + Https協議

課程內容&#xff1a; SpringBootWeb 入門 Http協議 SpringBootWeb案例 分層解耦 文章目錄 1. SpringBootWeb入門1.1 概述1.2 入門程序1.2.1 需求1.2.2 開發步驟1.2.3 常見問題 1.3 入門解析 2. HTTP協議2.1 HTTP概述2.1.1 介紹2.1.2 特點 2.2 HTTP請求協議2.2.1 介紹2.2.2…

MATLAB 控制系統設計與仿真 - 37

范數魯棒控制器的設計 魯棒控制器的設計 根據雙端子狀態方程對象模型結構&#xff0c;控制器設計的目標是找到一個控制器K(s),它能保證閉環系統的范數限制在一個給定的小整數下&#xff0c;即 這時控制器的狀態方程為&#xff1a; 其中X與Y分別為下面兩個代數Riccati方程的解…

依賴沖突,缺失插件導致無法啟動項目 強制安裝命令(npm install --legacy-peer-deps)

小白終成大白 文章目錄 小白終成大白前言總結 前言 運維工程師說搞一個自動化打包流程 在服務器裝了hbuilder 找前端來啟動項目 我沒啟動起來 … 啟動報錯 failed to load config from D:\zhuque-uniapp\vite.config.js 16:17:31.601 error when starting dev server: 16:17:3…