ORB-SLAM2源碼學習(六):相機跟蹤(局部地圖跟蹤和關鍵幀創建)

目錄

1.局部地圖跟蹤

1.1?更新局部關鍵幀UpdateLocalKeyFrames

1.2 更新局部地圖點(來自局部關鍵幀)UpdateLocalPoints()

1.3 投影匹配

2. 對比四種跟蹤方式以及使用的投影匹配

3.關鍵幀創建

3.1 判斷是否需要創建新關鍵幀: NeedNewKeyFrame()

3.2 關鍵幀的創建CreateNewKeyFrame()


1.局部地圖跟蹤

初始位姿估計成功(參考關鍵幀來跟蹤、恒速模型跟蹤、重定位跟蹤跟蹤成功)后需要進行局部地圖跟蹤TrackLocalMap()

初始位姿估計只是跟蹤一幀得到初始位姿,局部地圖跟蹤搜索局部關鍵幀、局部地圖點,和當前幀進行投影匹配,得到更多匹配的MapPoints后進行位姿優化。

bOK = TrackLocalMap();  

具體流程

  1. 更新局部地圖,包括局部關鍵幀和地圖點;UpdateLocalKeyFrames()?UpdateLocalPoints()
  2. 對局部MapPoints進行投影匹配?SearchLocalPoints()
  3. BA優化位姿(和初始位姿估計調用優化函數相同)

1.1?更新局部關鍵幀UpdateLocalKeyFrames

  • 一級共視關鍵幀:KF1、KF2是F的一級共視關鍵幀
  • 二級共視關鍵幀:KF1、KF2的共視關鍵幀(虛線框內)是F的二級共視關鍵幀
  • 當前幀:mCurrentFrame
  • 參考關鍵幀: 與當前幀共視程度最高的關鍵幀作為參考關鍵幀,mCurrentFrame.mpReferenceKF 在KeyFrame::UpdateConnections() 里確定關鍵幀的父子關系
  • 父關鍵幀:和當前關鍵幀共視程度最高的關鍵幀
  • 子關鍵幀:是上述父關鍵幀的子關鍵幀

局部關鍵幀的組成

  1. 當前地圖點的所有共視關鍵幀(鄰居)。
  2. 1中所有關鍵幀共視關系前10大的共視關鍵幀(鄰居的鄰居)。
  3. 1中所有關鍵幀的父子關鍵幀(鄰居的父母和孩子)。

最后將與當前幀共視關系最強的關鍵幀設為參考關鍵幀mpReferenceKF

1.2 更新局部地圖點(來自局部關鍵幀)UpdateLocalPoints()

局部關鍵幀能夠觀測到的所有地圖點,稱為局部地圖點。

1.3 投影匹配

將局部地圖點進行投影匹配,得到更多的匹配關系(目的)。注意,局部地圖點中已經是當前幀地圖點的不需要再投影,只需要將此外的并且在視野范圍內的點和當前幀進行投影匹配。

具體流程

  1. 遍歷當前幀的地圖點,標記這些地圖點不參與之后的投影搜索匹配;
  2. 判斷所有局部地圖點中除當前幀地圖點外的點,是否在當前幀視野范圍內;(是否在視野范圍內有個單獨函數 isInFrustum()
  3. 如果需要進行投影匹配的點的數目大于0,就進行投影匹配,增加更多的匹配關系。SearchByProjection()

2. 對比四種跟蹤方式以及使用的投影匹配

參考關鍵幀跟蹤

通過詞袋模型計算參考關鍵幀和當前幀的匹配特征點沒有用投影匹配,上一幀的位姿作為當前幀的初始位姿,然后進行BA求兩幀之間的位姿變換。

應用場景:沒有速度信息的時候、剛完成重定位、或者恒速模型跟蹤失敗后使用,大部分時間不用。只利用到了參考幀的信息(本質上是嘗試和最近一個關鍵幀去做匹配)。

②恒速模型跟蹤

首先根據上上幀到上一幀的位姿,把上一幀的特征點像素坐標映射到當前幀,然后在映射后結果坐標周圍進行搜索,找到與之匹配的特征點;根據速度得到當前幀的初始位姿,然后進行BA求兩幀之間的位姿變換。

使用了投影匹配,由于恒速模型可以計算當前幀相對于上一幀的平移向量,根據相機的前進/后退來約束搜索尺度范圍(在投影點多大的范圍內進行匹配)。此外它是對上一幀的有效地圖點(過濾外點)進行投影的。

投影匹配流程:1. 計算幀間平移 → 2. 投影上一幀地圖點 → 3. 運動方向約束搜索尺度 → 4. 匹配并記錄角度差 → 5. 旋轉直方圖剔除

尺度范圍

在進行投影匹配的時候會給定特征點的搜索范圍,考慮到處于不同尺度(也就是距離相機遠近,位于圖像金字塔中不同圖層)的特征點受到相機旋轉的影響不同,因此會希望距離相機近的點的搜索范圍更大一點,距離相機更遠的點的搜索范圍更小一點,所以要在這里,根據點到關鍵幀/幀的距離來估計它在當前的關鍵幀/幀中,會大概處于哪個尺度。

應用場景

大部分時間都用這個跟蹤,只利用到了上一幀的信息。

③重定位

當TrackWithMotionModel 和 TrackReferenceKeyFrame 都沒有跟蹤成功,位置丟失后,需要在之前的關鍵幀中匹配相近的關鍵幀,然后使用3D-2D匹配點的 EPnP算法求初始位姿,之后再使用BA來優化位姿。

具體而言:用詞袋找到與當前幀相似的候選關鍵幀(可能找到多個),再然后通過BoW加速計算每一個候選關鍵幀和當前幀的匹配特征點(這個過程和?參考關鍵幀跟蹤中當前幀和參考幀匹配特征點一樣),使用EPnP依次求初始位姿每個位姿結果使用BA優化,選擇內點數量大于50的作為初始位姿。

如果內點數量不夠多呢?就通過投影匹配方式對之前未匹配的點進行匹配,再進行BA優化求解。由于進行重定位,上一幀沒有意義,基于地圖點距離預測尺度范圍

投影匹配流程:1. 遍歷局部關鍵幀地圖點 → 2. 過濾已匹配點 → 3. 投影并預測尺度 → 4. 多層級搜索 → 5. 最佳匹配篩選 → 6. 旋轉直方圖剔除

④局部地圖跟蹤

搜索局部關鍵幀、局部地圖點,和當前幀進行投影匹配,得到更多匹配的地圖點后進行位姿優化,初始位姿根據前面三種方法計算的到。

具體而言:根據當前幀的地圖點來找能觀測到當前幀的一級共視關鍵幀,將這些一級共視關鍵幀的二級關鍵共視幀、子關鍵幀、父關鍵幀一起作為局部關鍵幀;局部關鍵幀中所有的地圖點作為局部地圖點;局部地圖點(去掉當前幀的地圖點 和 不在當前幀視野范圍內無效的地圖點)投影到當前幀進行特征點匹配,匹配結果進行BA優化。

投影匹配的時候通過視角余弦(RadiusByViewingCos)和預測尺度(nPredictedLevel)調整搜索尺度范圍。

總結

四種跟蹤方式對比

相同點:本質上都是計算匹配點對以及初始位姿,然后使用BA進行位姿優化。

不同點:求解匹配特征點方法當前幀的初始位姿設置不同

  • 參考關鍵幀跟蹤通過BoW計算當前幀和參考關鍵幀的匹配點對;初始位姿使用上一幀的位姿;
  • 恒速運動模型通過投影匹配計算匹配點對;初始位姿通過速度(這里的速度是上一幀到當前幀的位姿Tcl)確定;
  • 重定位 通過BoW計算每一個相似關鍵幀和當前幀 的匹配點對;初始位姿通過EPnP計算;
  • 局部地圖跟蹤是將 局部地圖點(來自局部關鍵幀)投影到當前幀計算匹配點對;初始位姿由前面三種方法確定。

3.關鍵幀創建

關鍵幀是取局部相近幀中最有代表性的一幀

選取的指標主要有:

  1. 距離上一關鍵幀的幀數是否足夠多(時間)。比如我每隔固定幀數選擇一個關鍵幀,這樣編程簡單但效果不好。比如運動很慢的時候,就會選擇大量相似的關鍵幀,冗余,運動快的時候又丟失了很多重要的幀。
  2. 距離最近關鍵幀的距離是否足夠遠(空間)/運動。比如相鄰幀根據pose計算運動的相對大小,可以是位移也可以是旋轉或者兩個都考慮,運動足夠大(超過一定閾值)就新建一個關鍵幀,這種方法比第一種好。但問題是如果對著同一個物體來回掃就會出現大量相似關鍵幀。
  3. 跟蹤局部地圖質量(共視特征點數目)。記錄當前視角下跟蹤的特征點數或者比例,當相機離開當前場景時(雙目或比例明顯降低)才會新建關鍵幀,避免了第2種方法的問題。缺點是數據結構和邏輯比較復雜。
if(NeedNewKeyFrame())CreateNewKeyFrame();

3.1 判斷是否需要創建新關鍵幀: NeedNewKeyFrame()

是否生成關鍵幀,需要考慮以下幾個方面:

  1. 最近是否進行過重定位,重定位后位姿不會太準,不適合做參考幀;
  2. 當前系統的工作狀態: 如果LocalMapping線程還有很多KeyFrame沒處理的話,不適合再給它增加負擔了;
  3. 距離上次創建關鍵幀經過的時間: 如果很長時間沒創建關鍵幀了的話,就要抓緊創建關鍵幀了;
  4. 當前幀的質量: 當前幀觀測到的地圖點要足夠多,同時與參考關鍵幀的重合程度不能太大。

3.2 關鍵幀的創建CreateNewKeyFrame()

:雙目和RGBD創建新的地圖點,單目不會(單幀沒有尺度)

具體流程

  1. 將當前幀構造成關鍵幀;
  2. 將當前關鍵幀設置為當前幀的參考關鍵幀;
  3. 對于雙目或rgbd攝像頭,為當前幀生成新的地圖點;單目無操作;
  4. 關鍵幀插入到鏈表 mlNewKeyFrames中,等待local mapping線程處理

思維導圖

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

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

相關文章

PostgreSQL時間計算大全:從時間差到時區轉換(保姆級教程)

一、時間計算的三大核心場景 當你遇到這些需求時,本文就是你的救星🌟: 倒計時功能:計算活動剩余天數 用戶行為分析:統計操作間隔時間 跨國系統:多時區時間統一管理 報表生成:自動計算同比/環…

Qt6.8.2創建WebAssmebly項目使用FFmpeg資源

Qt6新出了WebAssmebly功能,可以將C寫的軟件到瀏覽器中運行,最近一段時間正在研究這方便內容,普通的控件響應都能實現,今天主要為大家分享如何將FFmpeg中的功能應用到瀏覽器中。 開發環境:window11,Qt6.8.2…

DeepSeek V3 源碼:從入門到放棄!

從入門到放棄 花了幾天時間,看懂了DeepSeek V3 源碼的邏輯。源碼的邏輯是不難的,但為什么模型結構需要這樣設計,為什么參數需要這樣設置呢?知其然,但不知其所以然。除了模型結構以外,模型的訓練數據、訓練…

【leetcode hot 100 240】搜索二維矩陣Ⅱ

解法一&#xff1a;直接查找 class Solution {public boolean searchMatrix(int[][] matrix, int target) {for(int i0; i<matrix.length; i){for(int j0; j<matrix[0].length; j){if(matrix[i][j]>target){break;}if(matrix[i][j]target){return true;}}}return fal…

UE4 組件 (對話組件)

制作一個可以生成對話氣泡&#xff0c;顯示對話臺詞的簡單組件。這個組件要的變量&#xff1a;臺詞&#xff08;外部傳入&#xff09;。功能&#xff1a;開始對話&#xff08;生成氣泡UI&#xff09; &#xff0c;結束對話。 一、對話組件創建 二、開始對話事件 1、注意這里獲…

自動化同步多服務器數據庫表結構

當項目每次進行版本升級的時候&#xff0c;如果在這次迭代中涉及表結構變更&#xff0c;需要將不同的生產環境下&#xff0c;都需要同步表結構的DDL語句&#xff0c;比較麻煩&#xff0c;而且還有可能忘記同步腳本&#xff0c;導致生產環境報錯.... 該方案采用SpringBootMybat…

DeepSeek安全:AI網絡安全評估與防護策略

&#x1f345; 點擊文末小卡片 &#xff0c;免費獲取網絡安全全套資料&#xff0c;資料在手&#xff0c;漲薪更快 本文基于現有的公開資料&#xff0c;從企業資深網絡安全專家的視角&#xff0c;系統梳理DeepSeek技術在網絡安全領域的潛在貢獻與核心風險&#xff0c;并結合中國…

【論文筆記】Attentive Eraser

標題&#xff1a;Attentive Eraser: Unleashing Diffusion Model’s Object Removal Potential via Self-Attention Redirection Guidance Source&#xff1a;https://arxiv.org/pdf/2412.12974 收錄&#xff1a;AAAI 25 作者單位&#xff1a;浙工商&#xff0c;字節&#…

【powerjob】 powerjobserver注冊服務IP錯誤

1、問題&#xff1a;powerjobserver 4.3.6 的服務器上有多個網卡對應多個ip,示例 eth0 :IP1 &#xff0c;docker0:IP2 和worker 進行通信時 正確的應該時IP1 但是注冊顯示獲取的確實IP2,導致 worker 通過ip2和server通信&#xff0c;網絡不通&#xff0c;注冊不上 2、解決方案 …

視頻錄像機視頻通道是指什么

視頻錄像機的視頻通道是指攝像機在監控矩陣或硬盤錄像機設備上的視頻輸入的物理位置。 與攝像頭數量關系&#xff1a;在視頻監控系統中&#xff0c;有多少個攝像頭就需要多少路視頻通道&#xff0c;通道數量決定了視頻錄像機可接入攝像頭的數量&#xff0c;一般硬盤錄像機有4路…

面試150,數組 / 字符串

27. 移除元素 class Solution:def removeElement(self, nums: List[int], val: int) -> int:# 把不等于 val 的值移動到前面n len(nums)left 0for right in range(n):if nums[right] ! val:nums[left] nums[right]left 1return left26. 刪除有序數組中的重復項 只保留 1…

【江科大STM32】TIM輸入捕獲模式PWMI模式測頻率

一、輸入捕獲測頻率 接線圖&#xff1a; 測信號的輸入引腳為PA6&#xff0c;信號從PA6進來&#xff0c;待測的PWM信號也是STM32自己生成的&#xff0c;輸出引腳是PA0&#xff0c;所以接線這里直接用一根線將PA0引到PA6就可以了。 如果有信號發生器的話&#xff0c;也可以設置成…

湖倉一體化及冷、熱、實時三級存儲

一、湖倉一體化&#xff08;Lakehouse&#xff09; 湖倉一體化&#xff08;Lakehouse&#xff09;是數據湖&#xff08;Data Lake&#xff09;與數據倉庫&#xff08;Data Warehouse&#xff09;的結合&#xff0c;旨在解決傳統數據架構中數據孤島、存儲冗余、計算性能不足等問…

go切片定義和初始化

1.簡介 切片是數組的一個引用&#xff0c;因此切片是引用類型&#xff0c;在進行傳遞時&#xff0c;遵守引用傳遞的機制。切片的使用和數組類似&#xff0c;遍歷切片、訪問切片的元素和切片的長度都一樣。。切片的長度是可以變化的&#xff0c;因此切片是一個可以動態變化的數…

游戲引擎學習第138天

倉庫:https://gitee.com/mrxiao_com/2d_game_3 資產&#xff1a;game_hero_test_assets_003.zip 發布 我們的目標是展示游戲運行時的完整過程&#xff0c;從像素渲染到不使用GPU的方式&#xff0c;我們自己編寫了渲染器并完成了所有的工作。今天我們開始了一些新的內容&#…

畢業項目推薦:基于yolov8/yolov5/yolo11的暴力行為檢測識別系統(python+卷積神經網絡)

文章目錄 概要一、整體資源介紹技術要點功能展示&#xff1a;功能1 支持單張圖片識別功能2 支持遍歷文件夾識別功能3 支持識別視頻文件功能4 支持攝像頭識別功能5 支持結果文件導出&#xff08;xls格式&#xff09;功能6 支持切換檢測到的目標查看 二、數據集三、算法介紹1. YO…

docker中kibana啟動后,通過瀏覽器訪問,出現server is not ready yet

問題&#xff1a;當我在瀏覽器訪問kibana時&#xff0c;瀏覽器給我報了server is not ready yet. 在網上試了很多方法&#xff0c;都未能解決&#xff0c;下面是我的方法&#xff1a; 查看kibana日志&#xff1a; docker logs -f kibana從控制臺打印的日志可以發現&#xff…

在 Docker 中,無法直接將外部多個端口映射到容器內部的同一個端口

Docker 的端口映射是一對一的&#xff0c;即一個外部端口只能映射到容器內部的一個端口。 1. 為什么不能多對一映射&#xff1f; 端口沖突&#xff1a; 如果外部多個端口映射到容器內部的同一個端口&#xff0c;Docker 無法區分外部請求應該轉發到哪個內部端口&#xff0c;會…

游戲引擎學習第120天

倉庫:https://gitee.com/mrxiao_com/2d_game_3 上次回顧&#xff1a;周期計數代碼 我們正在進行一個項目的代碼優化工作&#xff0c;目標是提高性能。當前正在優化某個特定的代碼片段&#xff0c;已經將其執行周期減少到48個周期。為了實現這一目標&#xff0c;我們設計了一個…

C++中的.h文件一般是干什么的?

在C中&#xff0c;.h 文件通常是 頭文件&#xff08;Header File&#xff09;&#xff0c;它們的主要作用是聲明類、函數、常量、宏以及其他在多個源文件&#xff08;.cpp文件&#xff09;之間共享的元素。頭文件提供了一個接口&#xff0c;使得不同的源文件能夠訪問這些共享的…