Table of Contents

平面圖像跟蹤簡介

平面圖像跟蹤(Planar Image Tracking)用於檢測與跟蹤日常生活中有紋理的平面物體。所謂「平面」的物體,可以是一本書、一張名片或一幅海報這樣的小物體,也可以是一面塗鴉牆這樣的大型目標。這類物品或事物具有平坦表面、豐富且不重複的紋理。

本篇將概述平面圖像檢測與跟蹤的基本原理、預期效果及平台適配方案,幫助您快速理解功能邊界與開發要點。

基本原理

理解這些原理有助於開發者優化識別效果並規避常見問題。

核心流程

  1. 加載預處理階段

    • 系統加載目標圖像,從中提取大量視覺特徵點,生成該圖像的特徵描述並插入到特徵庫中。
    • 紋理越豐富的圖像越容易識別與跟蹤,您可以借助 目標圖檢測工具 提前檢查您的目標圖像的可識別度。

    參考圖左:紋理豐富易識別(5 星);參考圖右:元素簡單、缺少紋理,不易識別(1星)。
    我們推薦達到 4~5 星質量的圖像作為您的目標圖像。

  2. 實時檢測跟蹤階段

    • 相機捕獲畫面後,系統會分析當前畫面的特徵點,與目標圖像的特徵庫進行特徵匹配。
    • 通過 PnP(Perspective-n-Point)算法計算圖像在 3D 空間中的位姿(位置+旋轉)。
    • 一旦目標檢測成功,系統就會進入跟蹤模式。此時系統會對比連續幀的畫面並分析幀與幀之間的運動,從而實現實時的跟蹤過程。
  3. 優化機制

    • 跟蹤丟失恢復:短暫遮擋或快速運動模糊後,系統自動重新檢測目標。
    • 多目標同時跟蹤:通過 Simultaneous Number 參數控制單個 Tracker 的併發數量,實現一個 Tracker 調用就可以同時跟蹤多個目標。

技術限制

  • 僅支援平面圖像(非 3D 物體或動態內容)。
  • 依賴環境光照,過暗或過曝會導致檢測困難或跟蹤易丟失。
  • 檢測時相機不能距離目標過遠,保證畫面中目標圖像在畫面中的比例至少有 30%。
  • 多目標跟蹤受限於設備性能,通常 PC 端可以同時跟蹤 10 個以上目標,移動端可以同時跟蹤 4~6 個平面目標。

效果與預期結果

理解了圖像檢測與跟蹤的工作機制與技術限制之後,您還需要對該功能所能達到的效果有個了解。明確這些效果有助於您在開發過程中設定合理的測試標準。

理想效果

  • 精準疊加:虛擬物體與圖像邊緣對齊。
  • 快速檢測:從應用加載到檢測成功超低延遲。
  • 穩定跟蹤:圖像旋轉、移動、部分遮擋下仍可維持跟蹤。

不理想情況與應對

現象 原因 使用者感知 解決方案預覽(詳見後續章節)
無法識別 圖像紋理不足、過小 虛擬物體不出現 優化目標圖像,使用工具檢測可識別度
跟蹤抖動 目標畫面佔比過小,可跟蹤點不足 虛擬物體晃動明顯 避免過於遠離目標圖像,跟蹤模式設定 PreferQuality
頻繁丟失 圖像快速移動或完全遮擋 虛擬物體閃爍/消失 穩定移動設備/目標圖像,或增大目標尺寸
多圖目標缺失 受硬體性能影響 部分目標圖像無法跟蹤 權衡運行性能設定合理的 Simultaneous Number 參數

預期結果驗證方法

  • 開發階段:使用 PC 鏡頭通過 Unity 編輯器 Play 模式預覽。
  • 測試階段:使用官方 Sample 場景或自建測試圖像,覆蓋不同光照/角度/距離條件。

目標圖像最佳實踐

平面圖像跟蹤的效果非常依賴於目標圖像的質量。為了保證識別成功率,建議在準備目標圖像時遵循以下準則。

根據使用場景不同,您可以通過多種方式準備目標圖像:直接用相機正視角度拍攝目標物體,或先設計圖案再打印生產。無論是照片還是設計稿,都可作為模板圖片。

基礎要求

  • 圖像格式:建議為 JPG 或 PNG。
  • 透明通道處理:如果圖像帶有透明通道,系統會按白色背景處理。若非預期效果,請避免使用透明通道。

核心優化點

  1. 確保豐富的紋理細節
    模板圖片應具有足夠的細節和邊緣變化,避免純色或簡單圖形。

    參考圖左:紋理豐富的圖像可被檢測;參考圖右:純色圖像無法檢測

  2. 避免重複性模式
    遵循重複規律的圖案(如棋盤格、條紋)會降低特徵點的唯一性。

    參考圖:重複模式圖像無法被跟蹤

  3. 內容充滿畫面
    主體應盡可能佔據整個畫面,減少空白區域。

    參考圖:左側主體飽滿的圖像比右側留白過多的圖像更容易檢測和跟蹤

  4. 控制長寬比例
    圖像不宜過於狹長,短邊長度至少應達到長邊的 20%。

    參考圖:狹長圖像難以跟蹤

  5. 選擇合適的解析度
    推薦範圍:SQCIF(128×96) 到 QVGA(1280×960) 之間。
    過小:特徵點不足,識別率下降。
    過大:生成 Target 數據時帶來不必要的內存開銷增長、計算時間增多。