JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

在影像中尋找並匹配地標

機器人如何在一張圖裡挑出有辨識度的點,並在不同畫面中認出同一個點——這是追蹤、拼接和 SLAM 背後的黏合劑。

匹配問題

把手機相機對著一張桌子拍一張照片,然後向旁邊走半公尺再拍一張。對你來說,這兩張圖顯然拍的是同一張桌子。可對機器人而言,它們只是兩片看起來完全不同的亮度數字網格——每個像素都移動了,光照變了,桌角落在了新的座標上。那麼機器到底怎樣判斷照片 A 裡那個深色桌角,就是照片 B 裡那個同一個真實桌角呢?

這一個問題——「這裡的哪個點和那裡的哪個點是同一個?」——支撐著大量的機器人技術。全景拼接需要它,在影片裡追蹤一個物體需要它,估計機器人在兩幀之間移動了多遠(即里程計)需要它,建立一間陌生房間的地圖同樣需要它。一旦拿到可靠的點對點對應關係,許多原本困難的問題,突然就能用幾何方法解出來了。

最樸素的想法——把照片 A 裡的一小塊圖塊在照片 B 的每個位置上滑動,找出匹配最好的地方——幾乎能用,但它既慢又脆弱。一面空白的白牆,幾乎在任何位置都同樣匹配得上,於是你什麼也學不到。解決辦法是「挑剔兩次」:先只挑那些真正有辨識度的點,再把每個點描述得足夠緊湊,讓兩個點之間的比較既快又穩。這兩個想法就是關鍵點與描述子,本指南剩下的部分都在把它們一步步搭起來。

關鍵點:哪些點值得留下

影像關鍵點是系統認定足夠有辨識度、值得追蹤的某個像素位置。經典的贏家是角點——也就是亮度在兩個不同方向上同時急劇變化的地方,比如窗框兩條邊相交的拐角。斑點(小而圓的暗點或亮點)也算。要避開的,是那些沿著一條線方向模稜兩可的位置。

對於角點為何特殊,有一個很簡潔的直覺。想像把一個小視窗在影像上滑動,問問下面的圖塊變化了多少。在一面平牆上,往任何方向滑都沒有變化——沒用。在一條直邊上,沿著邊滑動毫無變化,所以你分不清自己在邊上的哪個位置——這就是孔徑問題。只有在角點處,往任意方向滑動都會讓圖塊改變,於是位置在 x 和 y 兩個方向上都被釘死了。角點偵測器,不過是對這種「兩個方向都敏感」特性的快速檢驗罷了。

從一張照片裡,偵測器可能會回傳幾百到幾千個關鍵點。這本身已是巨大的勝利:機器人不必再拿每個像素和每個像素去比,而只需對一組稀疏、可信賴的地標進行推理。但僅有一個 (x, y) 位置還不足以拿來匹配——兩個不同的角點,作為座標看起來完全一樣。每個關鍵點都還需要一枚指紋。

描述子,以及匹配究竟怎樣進行

特徵描述子就是那枚指紋:一串緊湊的數字,由關鍵點周圍的小圖塊算出,用來刻畫它的鄰域長什麼樣。一種常見做法是,在一格格子區裡記錄亮度增加的方向(即局部梯度),再把它們打包成一個比如 128 維的向量。巧妙之處在於:要讓同一塊圖塊,即使經過旋轉、輕微縮放或亮度變化,仍能得出幾乎相同的向量——描述子的目標,是對那些與「它是哪個點」無關的干擾因素保持不變。

一旦每個關鍵點都帶上了描述子,匹配就變成了尋找「近似雙胞胎」。對照片 A 裡的某個關鍵點,你在照片 B 中找出數值上最接近的那個描述子——它的最近鄰——並把這一對提出來作為一組匹配。如果兩個描述子的數字列表之間的距離很小,就說它們「接近」。

  1. 在兩張圖裡都偵測關鍵點,並為每個關鍵點計算一個描述子。
  2. 對圖 A 裡的每個描述子,按描述子距離在圖 B 中找出它的最近鄰。
  3. 施加比值檢驗:只有當最近鄰明顯比次近鄰更近時才保留這組匹配,從而剔除模稜兩可的配對。
  4. 進行外點剔除(例如 RANSAC):擬合一個真匹配必須共同滿足的幾何模型,再丟棄任何違背它的配對。

第三步和第四步,比初學者想像的更重要。即便是好的描述子也會產出錯誤匹配——重複紋理(一排一模一樣的磚)和雜亂背景,注定讓某些配對純屬張冠李戴。比值檢驗會在最佳與次佳候選幾乎打平時丟掉這組匹配,因為「幾乎打平」意味著系統其實分不清它們。隨後外點剔除來強加大局約束:剛性場景兩個視角之間所有正確的匹配,都必須服從同一個一致的相機運動,於是像 RANSAC 這樣的方法會悄悄地猜出那個運動,數一數有多少匹配與之相符,再把其餘的投票淘汰掉。判定哪個偵測對應哪個,正是困擾每個感知系統的資料關聯問題。

稀疏匹配與稠密光流

到目前為止的一切都是稀疏的:幾百個地標,在時間或視角上可能相隔很遠的影像之間進行匹配。對於相反的情形,還有一種互補的方法——兩個連續的影格,相差僅幾毫秒,幾乎什麼都沒怎麼動。這時你可以稠密地追蹤運動,估計出每一個像素都跑到了哪裡。那一整片逐像素運動向量的場,就是光流。

光流依賴一個簡單的假設:一小塊圖塊從這一幀到下一幀亮度保持不變,只是稍微挪動了一點。正因為挪動極小,這種方法根本不需要抗旋轉的指紋——它只是把每塊圖塊推到下一幀裡亮度對得上的地方。這讓光流非常擅長平滑追蹤和運動估計,但一旦出現大跳變、快速運動或場景突變,「小位移」假設崩塌,它就失效了。注意,孔徑問題在這裡又回來了:在一條長直邊內部,光流能感知到跨邊的運動,卻感知不到沿邊的運動。

兩條路最終都匯向同一份回報。一旦你知道匹配的點在兩個相機視角之間是怎麼移動的,幾何就會把相機自身的運動交到你手上——這正是視覺里程計的核心;再與慣性感測器融合,它就成了視覺慣性里程計。把這些地標累積成一張持久的地圖,並在重訪某地時再次認出它們,你就跨進了 SLAM 的領域:匹配到的特徵,正是把漂移的地圖重新對齊的迴環閉合線索。把同樣的對應關係推廣到一處靜態場景的許多張照片上,你就能重建出它的三維形狀——這是運動恢復結構要幹的活。那個不起眼的匹配點,正是這一切的種子。