相機和輸入擴展
本文介紹物理相機的相機模型、參數和一些其他使用上的注意點,以及使用自定義相機的方式進行輸入擴展。

輸入幀
輸入幀(Input Frame)是 AR 中的基本數據單元,它表示一次從攝像頭或其他數據源捕獲的幀的所有相關資訊。一個輸入幀通常包含:
- 原始圖像數據(camera image)
- 相機參數(如內參)
- 時間戳
- 相機在世界坐標中的變換矩陣
- 跟蹤狀態(tracking status)
這些資訊為 AR 演算法提供定位、跟蹤、渲染等所需的時空上下文數據。
物理相機
目前電子設備上使用的攝像頭,通常由多片透鏡和反射鏡組成。但一般不使用實際的光學結構來構建相機模型,而是使用一些簡化的模型。
針孔相機模型

這是通常使用的最簡單的模型,光通過一個小孔成一個旋轉 180 度的像。但相機輸出的數據中會將像正過來。需要六個參數來描述這個模型,像素寬高 \(w, h\) ,像素焦距 \(f_x, f_y\) ,主點像素位置 \(c_x, c_y\) 。可以注意到如果像素寬高縮放時,像素焦距和主點像素位置也對應縮放,可以保持像的位置不變。
OpenCV 相機模型
有些相機會存在顯著的徑向畸變和切向畸變,OpenCV 相機模型在針孔相機模型上的基礎上增加了高次參數來描述徑向畸變和切向畸變。徑向畸變使用 \(k_1, k_2, k_3, \cdots\) 來描述。切向畸變使用 \(p_1, p_2\) 來描述。
附註
有一些跟蹤器不支援 OpenCV 相機模型。
OpenCV 魚眼相機模型
魚眼相機通過透視投影以將大視角內容壓縮到較小的成像面積內。OpenCV 魚眼相機模型不帶畸變矯正,在針孔相機模型 6 個參數的基礎上,使用 \(k_1, k_2, k_3, k_4, \cdots\) 來描述。
附註
有一些跟蹤器不支援 OpenCV 魚眼相機模型。

相機朝向與圖像朝向
在手機上,通常橫向拿(從正常豎向拿逆時針旋轉 90 度)且螢幕顯示方向也是橫向的時候,後置攝像頭輸出的圖像在螢幕上顯示時的方向和真實場景一致。不改變螢幕物理方向只改變螢幕顯示方向不會改變物理相機輸出的圖像方向。當正常豎向拿且螢幕顯示方向也是正常豎向的時候,後置攝像頭輸出的圖像需要順時針旋轉 90 度後顯示到螢幕上,才和真實場景一致。當螢幕顯示方向旋轉時,渲染相機圖像需要進行反向的旋轉補償,才能和真實場景一致。
相機朝向和圖像朝向,通常都是相對於設備的自然方向來定義的:
手機
Android
Android 定義了一個自然方向,是指正常豎向拿手機的方向,慣性感測器單元(IMU)也是以這個方向為基準。相機輸出圖像相對於這個方向的旋轉角度,作為相機的參數,可以獲得。
iOS
iOS 上,雖然未明確定義自然方向,但慣性感測器單元也是使用的和 Android 一樣的基準。
平板
平板的自然方向,有一些是橫向拿的方向,有些和手機一樣是正常豎向拿的方向。
眼鏡
眼鏡的自然方向,通常是橫向拿的方向。
渲染相機圖像時,會綜合相機朝向和螢幕朝向進行渲染。
相機類型與相機翻轉
手機上一般有後置攝像頭和前置攝像頭。前置攝像頭輸出的圖像,需要進行左右翻轉後再顯示到螢幕上,模擬一面鏡子。如果不進行左右翻轉,看起來會很不習慣。
輸入擴展
EasyAR 支援使用自定義相機的方式進行輸入擴展。自定義相機可以支援從外部獲得輸入幀傳輸到 AR 系統中,供跟蹤器使用。自定義相機可以由您自行實現圖像數據獲取。
平台專用指南
攝像頭和輸入擴展的使用與平台緊密相關。請根據您的目標平台,參考以下指南進行開發: