Opencv計算機視覺編程攻略-第九節 描述和匹配興趣點

? ? ? ?一般而言,如果一個物體在一幅圖像中被檢測到關鍵點,那么同一個物體在其他圖像中也會檢測到同一個關鍵點。圖像匹配是關鍵點的常用功能之一,它的作用包括關聯同一場景的兩幅圖像、檢測圖像中事物的發生地點等等。

1.局部模板匹配

? ? ? ? 憑單個像素就判斷兩個關鍵點的相似度顯然是不夠的,因此要在匹配過程中考慮每個關鍵
點周圍的圖像塊,
對圖像塊中的像素進行逐個比較,但是并不是最可靠的。

? ? ? 第一步,使用FAST 檢測器進行關鍵點提取:

// 定義特征檢測器
cv::Ptr<cv::FeatureDetector> ptrDetector; // 泛型檢測器指針
ptrDetector= // 這里選用FAST 檢測器
cv::FastFeatureDetector::create(80);
// 檢測關鍵點
ptrDetector->detect(image1,keypoints1);
ptrDetector->detect(image2,keypoints2);

? ? ? 第二步,定義匹配框,在每個圖像對的關鍵點之間進行匹配,這里使用逐像素相差匹配:

// 在第二幅圖像中找出與第一幅圖像中的每個關鍵點最匹配的
cv::Mat result;
std::vector<cv::DMatch> matches;
// 針對圖像一的全部關鍵點
for (int i=0; i<keypoints1.size(); i++) {// 定義圖像塊neighborhood.x = keypoints1[i].pt.x-nsize/2;neighborhood.y = keypoints1[i].pt.y-nsize/2;// 如果鄰域超出圖像范圍,就繼續處理下一個點if (neighborhood.x<0 || neighborhood.y<0 ||neighborhood.x+nsize >= image1.cols ||neighborhood.y+nsize >= image1.rows)continue;// 第一幅圖像的塊patch1 = image1(neighborhood);// 存放最匹配的值cv::DMatch bestMatch;// 針對第二幅圖像的全部關鍵點for (int j=0; j<keypoints2.size(); j++) {// 定義圖像塊neighborhood.x = keypoints2[j].pt.x-nsize/2;neighborhood.y = keypoints2[j].pt.y-nsize/2;// 如果鄰域超出圖像范圍,就繼續處理下一個點if (neighborhood.x<0 || neighborhood.y<0 ||neighborhood.x + nsize >= image2.cols ||neighborhood.y + nsize >= image2.rows)continue;// 第二幅圖像的塊patch2 = image2(neighborhood);// 匹配兩個圖像塊cv::matchTemplate(patch1,patch2,result, cv::TM_SQDIFF);// 檢查是否為最佳匹配if (result.at<float>(0,0) < bestMatch.distance) {bestMatch.distance= result.at<float>(0,0);bestMatch.queryIdx= i;bestMatch.trainIdx= j;}}// 添加最佳匹配matches.push_back(bestMatch);}

? ? ? 第三步,選擇置信度最高的一些點,進行展示:

// 提取25 個最佳匹配項
std::nth_element(matches.begin(),matches.begin() + 25,matches.end());
matches.erase(matches.begin() + 25,matches.end());// 繪制圖像
cv::Mat matchImage;
cv::drawMatches(image1,keypoints1, // 第一幅圖像image2,keypoints2, // 第二幅圖像matches, // 匹配項的向量cv::Scalar(255,255,255), // 線條顏色cv::Scalar(255,255,255)); // 點的顏色

? ? ? ? 上述方法使用圖塊之間相似度進行評估,也可以使用opencv中的區域模板匹配方法進一步增大搜索精確度:

// 定義搜索區域
cv::Mat roi(image2, // 這里用圖像的上半部分
cv::Rect(0,0,image2.cols,image2.rows/2));
// 進行模板匹配
cv::matchTemplate(roi, // 搜索區域
target, // 模板
result, // 結果
cv::TM_SQDIFF); // 相似度
// 找到最相似的位置
double minVal, maxVal;
cv::Point minPt, maxPt;
cv::minMaxLoc(result, &minVal, &maxVal, &minPt, &maxPt);
// 在相似度最高的位置繪制矩形
// 本例中為minPt
cv::rectangle(roi, cv::Rect(minPt.x, minPt.y,
target.cols, target.rows), 255);

2.描述并匹配局部強度值模式

? ? ? ?在圖像分析中,可以用鄰域包含的視覺信息來標識每個特征點,以便區分各個特征點。特征描述子通常是一個N 維的向量,在光照變化和拍攝角度發生微小扭曲時,它描述特征點的方式不會發生變化,?通常可以用簡單的差值矩陣來比較描述子,例如用歐幾里得距離等

? ? ? ?基于特征的方法都包含一個檢測器和一個描述子組件,與cv::Feature2D 相關的類也一樣,它們都有一個檢測函數(用于檢測興趣點)和一個計算函數(用于計算興趣點的描述子)cv::SURF
和cv::SIFT,檢測流程和上述一致。

// 1. 定義關鍵點的容器
std::vector<cv::KeyPoint> keypoints1;
std::vector<cv::KeyPoint> keypoints2;// 2. 定義特征檢測器
cv::Ptr<cv::Feature2D> ptrFeature2D =
cv::xfeatures2d::SURF::create(2000.0);// 3. 檢測關鍵點
ptrFeature2D->detect(image1,keypoints1);
ptrFeature2D->detect(image2,keypoints2);// 4. 提取描述子
cv::Mat descriptors1;
cv::Mat descriptors2;
ptrFeature2D->compute(image1,keypoints1,descriptors1);
ptrFeature2D->compute(image2,keypoints2,descriptors2);// 5. 構造匹配器
cv::BFMatcher matcher(cv::NORM_L2);cv::BFMatcher matcher2(cv::NORM_L2, // 度量差距
true); // 可以開啟 交叉檢查標志// 匹配兩幅圖像的描述子
std::vector<cv::DMatch> matches;
matcher.match(descriptors1,descriptors2, matches);

? ? ? 好的特征描述子不受照明和視角微小變動的影響,也不受圖像中噪聲的影響,因此它們通常
基于局部強度值的差值,SURF 描述子在關鍵點周圍局部地應用下面的簡易內核:

? ? ? ? 第一個內核度量水平方向的局部強度值差值(標為dx),第二個內核度量垂直方向的差值(標為dy)。通常將用于提取描述子向量的鄰域尺寸定為特征值縮放因子的20 倍(即20σ)。然后把這個正方形區域劃分成更小的4×4 子區域。對于每個子區域,在5×5 等分的位置上(用尺寸為2σ的內核)計算內核反饋值(dx 和dy)。

? ? ?使用SURF 和SIFT 的特征和描述子可以進行尺度無關的匹配,能夠取得較好的效果。

3.用二值描述子匹配關鍵點

? ? ? ? 上述描述子是浮點數類型的向量,大小為64、128等,這導致對它們的操作將耗資巨大,為了減少內存使用、降低計算量,人們引入了將一組比特位(0 和1)組合成二值描述子的概念。這里的難點在于,既要易于計算,又要在場景和視角變化時保持魯棒性。

// 1. 定義特征檢測器/描述子
// Construct the ORB feature object
cv::Ptr<cv::Feature2D> feature = cv::ORB::create(60);
// 大約60 個特征點
// 檢測并描述關鍵點
// 2. 檢測ORB 特征
feature->detectAndCompute(image1, cv::noArray(),
keypoints1, descriptors1);
feature->detectAndCompute(image2, cv::noArray(),
keypoints2, descriptors2);// 3. 構建匹配器
cv::BFMatcher matcher(cv::NORM_HAMMING); // 二值描述子一律使用Hamming 規范】// 4.匹配兩幅圖像的描述子
std::vector<cv::DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);

? ? ? ?ORB 算法在多個尺度下檢測特征點,這些特征點含有方向。基于這些特征點,ORB 描述子通過簡單比較強度值,提取出每個關鍵點的表征,在BRIEF 描述子的基礎上構建的,然后在關鍵點周圍的鄰域內隨機選取一對像素點,創建一個二值描述子。

? ? ? ?比較這兩個像素點的強度值,如果第一個點的強度值較大,就把對應描述子的位(bit)設為1,否則就設為0。對一批隨機像素點對進行上述處理,就產生了一個由若干位(bit)組成的描述子,通常采用128 到512 位(成對地測試)。

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

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

相關文章

C++內存管理優化實戰:提升應用性能與效率

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開發技術&#xff0c;能熟練應用常用數據庫SQL server,Oracle…

17-產品經理-創建發布

點擊“發布”-“創建發布”。 填寫發布名稱&#xff0c;選擇測試的版本。還可以設置此次發布是否為“里程碑”。 點擊“保存”后&#xff0c;進入該發布詳情頁面。需要為此次發布關聯需求、已解決BUG、以及遺留BUG。可以通過設置條件&#xff0c;進行“搜索”&#xff0c;然后批…

Axure RP9.0教程 | 內聯框架 對應html 元素中的iframe標簽 (打開內部頁面和外部網址)

文章目錄 引言I 打開內部頁面II 打開外部網址操作效果引言 應用場景: 選擇右側不同欄目,左側內容發生變化 I 打開內部頁面 在公用元件庫中找到內聯框架圖標,將其拖到畫布中,設置其寬、高;在右側添加三個按鈕,分別用來跳轉三個不同的頁面;在內部框架中,添加三個子頁面,…

在1panel中安裝WebUI

如果需要建站&#xff0c;那得選安裝Openresty。點擊應用商店&#xff0c;安裝 Openresty 接下來安裝Ollama&#xff0c;可以部署本地模型提供給WebUi平臺使用 最后是安裝 WebUi&#xff0c;安裝時需要填寫Ollama的地址: 容器地址&#xff1a;30000 這些安裝都很方便&#xf…

項目難點亮點

Vue項目 RBAC設計 用戶權限設置 WebSocket 消息處理 BPMN擴展 跨語言模型的調用 大片文件(影像,模型等,數據-模型集成) 組件&指令封裝 低代碼表單構建、BPMN編輯器集成與實現 通用參考點 若依(RuoYi)是一個基于 Vue.js 和 Spring Boot 的前后端分離權限管理系…

JVM生產環境調優實戰

案例三&#xff1a;JVM頻繁Full GC優化 1. 項目背景&#xff08;Situation&#xff09; 在云中萬維跨境支付的反洗錢系統中&#xff0c;我們負責對海量交易數據進行實時規則校驗&#xff0c;以確保符合監管要求。系統日均處理交易量超過500萬筆&#xff0c;峰值QPS達到3000&a…

ASP.NET Web 中進行 GET/POST 提交并接收返回數據的幾種方案

在 ASP.NET Web 應用程序中進行 GET 請求并接收返回數據可以通過多種方式實現&#xff0c;以下是幾種常見的方法&#xff1a; 1. 使用 WebClient 類&#xff08;簡單方式&#xff09; using System.Net; using System.IO;public string GetDataFromUrl(string url) {using (W…

Springboot--Kafka客戶端參數關鍵參數的調整方法

調整 Kafka 客戶端參數需結合生產者、消費者和 Broker 的配置&#xff0c;以實現性能優化、可靠性保障或資源限制。以下是關鍵參數的調整方法和注意事項&#xff1a; 一、生產者參數調整 ?max.request.size? ?作用?&#xff1a;限制單個請求的最大字節數&#xff08;包括消…

Android學習總結之service篇

引言 在 Android 開發里&#xff0c;Service 與 IntentService 是非常關鍵的組件&#xff0c;它們能夠讓應用在后臺開展長時間運行的操作。不過&#xff0c;很多開發者僅僅停留在使用這兩個組件的層面&#xff0c;對其內部的源碼實現了解甚少。本文將深入剖析 Service 和 Inte…

ExternalProject_Add 使用手冊與文檔詳解

一、基本概念與語法 ExternalProject_Add 是 CMake 的一個核心命令&#xff0c;用于在構建過程中集成和管理外部項目&#xff08;如第三方庫&#xff09;。它支持完整的生命周期管理&#xff0c;包括下載、配置、構建、安裝和測試。 語法&#xff1a; ExternalProject_Add(&l…

低延遲云網絡的核心技術

低延遲云網絡通過架構優化、協議創新、硬件加速等多維度技術手段,將數據傳輸延遲降低至毫秒級甚至微秒級。 1. 網絡架構優化 1.1 扁平化網絡Leaf-Spine 架構 減少網絡層級,縮短數據轉發路徑(如數據中心內部一跳可達)。 扁平化網絡Leaf-Spine(葉子-脊椎)架構是一種現代…

網絡安全法規與入門指南

在當今數字化時代&#xff0c;網絡安全已成為保障個人隱私、企業利益和國家安全的關鍵領域。隨著網絡攻擊的日益復雜和頻繁&#xff0c;了解和遵守網絡安全法規變得尤為重要。本文將深入探討網絡安全相關法規&#xff0c;并為想要進入這一領域的讀者提供實用的入門指南。 一、…

硬盤分區格式方案之 MBR(Master Boot Record)主引導記錄的 主分區 和 擴展分區 筆記250407

硬盤分區格式方案之 MBR&#xff08;Master Boot Record&#xff09;主引導記錄的 主分區 和 擴展分區 筆記250407 一、主分區&#xff08;Primary Partition&#xff09; 1. 定義與功能 直接引導操作系統&#xff1a;主分區是獨立的存儲單元&#xff0c;可直接安裝操作系統并…

【Proteus仿真】【32單片機-A007】PT100熱敏溫度檢測系統設計

目錄 一、主要功能 二、使用步驟 三、硬件資源 四、軟件設計 五、實驗現象 聯系作者 一、主要功能 1、LCD1602顯示當前檢測的溫度值以及溫度閾值 2、超過上限溫度&#xff0c;降溫模塊啟動? 3、PT100熱敏電阻測量-60C-135C 4、按鍵設置溫度閾值 5、超過閾值&#xff0…

pyqt SQL Server 數據庫查詢-優化2

1、增加導出數據功能 2、增加刪除表里數據功能 import sys import pyodbc from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QListWidget, QLineEdit, QPushButton, \QTableWidget, QTableWidgetItem, QLabel, QMessageBox from PyQt6.QtGui i…

Github 熱點項目 ChartDB AI自動導表結構+遷移腳本,3分鐘生成專業數據庫關系圖

ChartDB堪稱數據庫設計神器&#xff01;亮點①&#xff1a;動動手指輸入SQL&#xff0c;秒出結構圖&#xff0c;表關系一目了然&#xff0c;團隊評審時再也不用畫圖兩小時。亮點②&#xff1a;AI智能轉換超貼心&#xff0c;MySQL轉PostgreSQL只需點個按鈕&#xff0c;跨平臺遷移…

地質科研智能革命:當大語言模型“扎根”地質現場、大語言模型本地化部署與AI智能體協同創新實踐

在地質學邁向“深時數字地球”&#xff08;Deep-time Digital Earth&#xff09;的進程中&#xff0c;傳統研究方法正面臨海量異構數據&#xff08;地質圖件、遙感影像、地震波譜等&#xff09;的解析挑戰。大語言模型&#xff08;LLM&#xff09;與AI智能體的本地化部署技術&a…

DAPP實戰篇:使用web3.js連接合約

說明 本系列內容目錄:專欄:區塊鏈入門到放棄查看目錄 如果你還沒有創建好項目請先查看:《DApp實戰篇:先用前端起個項目》,如果你還不知道web3.js是什么請先查看:《DApp實戰篇:前端技術棧一覽》。 安裝 點此查看web3.js官方文檔 打開項目根目錄,并喚起終端: 鍵入w…

源代碼保密解決方案

背景分析 隨著各行各業業務數據信息化發展&#xff0c;各類產品研發及設計等行業&#xff0c;都有關乎自身發展的核心數據&#xff0c;包括業務數據、源代碼保密數據、機密文檔、用戶數據等敏感信息&#xff0c;這些信息數據有以下共性&#xff1a; — 屬于核心機密資料&…

dolphinscheduler單機部署鏈接oracle

部署成功請給小編一個贊或者收藏激勵小編 1、安裝準備 JDK版本:1.8或者1.8oracle版本&#xff1a;19Coracle驅動版本&#xff1a;8 2、安裝jdk 下載地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#java8 下載后上傳到/tmp目錄下。 然后執行下面命…