探究高空視頻全景AR技術的實現原理

1. 引言

筆者認為現階段AR技術的應用是還是比較坑爹的,大都是噱頭多但是實用的成分少,拿出來做做DEMO是可以,但是難以在實際的項目中落地產生實際的經濟價值。一方面是很難在業務上難以找到合適的應用場景(可能管線相關的項目算一個),另一方面技術上也存在一些難以突破的問題。不管是手持設備還是AR眼鏡,這些比較適合AR的硬件性能還是太弱了,導致其重建的空間信息與現實部分的空間信息存在較大的差距,這樣的話就談不上對現實的增強了。

不過筆者最近遇到了一個高空視頻全景AR的項目,感覺具有不錯的應用價值。具體可以參看這個案例:【數智實踐】AR云景全局掌控,為園區裝上“智慧之眼”,其中一張操作演示的的動態圖如下:

圖1 高空視頻全景AR項目演示圖
這個案例看起來與我們經常碰到的AR應用有所不同,不過筆者認為盡管這個案例可能沒有用到像AR Core/AR Kit這樣的AR組件,也不是這些組件提供的功能點,但也是AR技術的應用案例。所謂AR(Augmented Reality,增強現實),指的就是虛實結合,以達到對現實增強的效果。在這個案例中,“實”的部分就是高空攝像頭視頻畫面,“虛”的部分就是點的地理位置標注;更關鍵的地方在于,這些注記隨著攝像頭畫面的移動和縮放而移動,并不是固定在某個像素位置。從GIS的角度上來看,這似乎在操作一張地圖,這張地圖還是動態的。

在AR Core中,像這樣的功能被稱為運動追蹤,通常通過SLAM(simultaneous localization and mapping,實時定位和地圖構建)技術來實現。SLAM主要解決這樣的問題:一個機器人在未知環境中,通過計算機視覺等技術讓機器人知道自己的具體位置,進而描繪出此環境完全的地圖。但是筆者認為這個案例中應該用不到這種比較復雜的技術,基礎的GIS+測繪+計算機視覺技術足應該以實現這種效果。

2. 詳論

需要事先聲明的是,由于高空視頻全景AR的案例需要很多硬件上的操作和支持,筆者并沒有條件具體實現其中的功能,更多的是從理論上探究其中的實現原理,如果哪里說的不太對,也請讀者進行斧正。

2.1 靜止畫面

首先將這個問題簡化成最基本的場景,也就是無操作畫面靜止的情況(不是畫面中的視頻不會動,指的是拍攝的位置不會變化)。在這種情況下,注記實際代表的地理位置(物方坐標)是不會變化的,像素的位置(相方坐標)也不會變化,那么我們只需要關心注記的位置如何投射到視頻畫面中。很顯然,這個過程與相機標定的過程非常相似,已知一組點的物方坐標和像方坐標,那么可以標定出相機的內參和外參。具體可以參考筆者的這篇文章《一次實踐:給自己的手機攝像頭進行相機標定》。

在這個案例中,物方坐標可以通過GPS采集得到。不過GPS采集的點是WGS84地理坐標系的點。WGS84地理坐標系坐標是經緯度坐標,需要將其轉換成笛卡爾坐標,也就是ECEF(地心地固直角坐標系)坐標。ECEF坐標的值很大,最好進一步將其轉換成ENU(東北天站心坐標系)坐標,具體可參看筆者這篇文章《地心地固坐標系(ECEF)與站心坐標系(ENU)的轉換》。理論上使用投影坐標系也可以,不過筆者認為還是ENU坐標系更加嚴密一點。另一方面,像方坐標可以在視頻畫面中刺點得到。由于獲取像方點比較容易有誤差,因此最好選取一些有明顯特征的位置作為控制點來獲取物方坐標和像方坐標。

經過筆者驗證,即使獲取了一些控制點的物方坐標和像方坐標,仍然不能像《一次實踐:給自己的手機攝像頭進行相機標定》這篇文章一樣直接使用calibrateCamera接口計算出攝像頭的內參和外參。這個接口要求對于非平面標定,需要一個初始的相機內參矩陣作為輸入。因為標定解算是一個非線性方程組迭代求解的過程,初始值差距太大就有很大概率求解失敗。因此,內參不能在這里進行聯合解算,還是要先進行預先解算,將攝像頭的內參標定好。

在獲取正確的內參之后,這個問題就簡化成了PnP(Perspective-n-Points)問題:通過世界空間的一組點(最少3個)的物方坐標和像方坐標,計算出攝像頭的外參(位置+姿態)。這個問題可以通過OpenCV的cv::solvePnP接口來解決。實際上,這個過程就是《攝影測量學》中的后方交會。通過攝像機內參加上一組點的物方坐標和像方坐標,可以得到攝像機的外參,通常是三個旋轉參數,三個平移參數。

總結下來就是,對于不用操作攝像頭的靜止畫面,需要預先標定一次內參,然后通過實際的控制點標定一次外參。

2.2 縮放畫面

攝像頭靜止不動的單幅畫面比較好解決,但現在即使是一個普通的監控攝像頭,也具備調焦和旋轉角度的能力,當進行這些操作的時候,畫面的注記是如何隨著攝像頭的動作而移動呢?

如果我們知道一點三維可視化的知識就知道,三維場景中如果要放大一個區域,有兩種方式,一種是移動攝像頭,將其與物體靠近;另外一種就是調整攝像頭的焦距。調整焦距更加符合現實攝像頭的操作,一般來說,將焦距調的越長,能看清的場景就可以越遠,視場角也就會越小,就會產生畫面放大的效果。基于這個思想,我們只需要實時獲取在畫面縮放時的焦距,加上其他內參和外參,就可以解算出注記點物方坐標對應的相方坐標,并在畫面上做出調整即可。

話是這樣說,不過另外一個問題在于前面我們說到攝像頭的包括焦距的內參是通過相機標定的操作來實現的。我們要知道攝像頭執行了調焦操作,必須使用接入攝像頭對應的SDK,SDK會傳出具體的焦距嗎?傳出的焦距與我們標定的焦距不一致該怎么辦?對于專業相機,可能會提前將相機標定做好,會在SDK中傳出具體的內參包括焦距值。但是對于普通相機,可能就還是需要自己進行標定了。

根據筆者的設想,調整焦距的操作并不是線性調整而是調整到幾個固定的值,例如相機參數中經常可以看到的x0.5,x1.0,x2.0,x4.0這些值。也就是說,我們只需要在這些具體的調焦值時候進行相機標定,得到具體的攝像頭內參;然后通過SDK獲取這些調焦值,將其與攝像頭內參關聯上,就可以解算出正確的相方坐標,從而實現注記隨縮放的動態移動。

總結:對于進行實時調焦的攝像頭,要保證視頻畫面中的注記隨著畫面縮放而移動,需要預先進行有限次數的內參標定,然后通過實際的控制點標定一次外參。

2.3 縮放+旋轉

內參的問題比較好解決,最多預先在不同情況下標定內參的值就可以了。但是如果要實現旋轉就有點麻煩了,因為旋轉參數是外參,是無法事先進行標定的。另外,旋轉參數的獲取也很麻煩,要知道攝像頭旋轉了必須通過攝像頭SDK來獲取,但是SDK獲取的就一定的是我們想要的旋轉參數嗎?甚至我很懷疑是否能提供旋轉參數。

在接著進行論述之前,筆者需要先介紹一下線性代數的理論知識。在線性代數的觀點下,矩陣其實就是向量的張成空間。例如旋轉變換決定的旋轉矩陣,它的三個列向量這個三維坐標空間的三個基向量也就是基向量。旋轉矩陣可以看成是這樣的一個三維空間,一個X軸(1,0,0)、Y軸(0,1,0)、Z軸(0,0,1)標準笛卡爾坐標系經過旋轉變換后形成的坐標系空間,旋轉矩陣的三個列向量X、Y、Z軸的軸向量。

為了實時知道攝像頭是否旋轉了以及具體的旋轉量,我們假設攝像頭SDK一定會提供旋轉參數,通常是是類似于“左右旋轉-160度到+160度,上下旋轉-75度到+75度”之間這樣描述的數值。雖然我們并不知道這個攝像頭給出的旋轉決定的三維空間坐標系(相機坐標系)是如何描述的,但是我們可以將其復位到單位矩陣,也就是“左右旋轉0度,上下旋轉0度的位置”。在這個姿態下標定一次外參,令這個外參決定的旋轉矩陣為 R a R_a Ra?。接下來,攝像頭旋轉到任意位置的旋轉參數都可以基于這個 R a R_a Ra?來計算,因為在這種情況下,相當于是從世界坐標系通過旋轉變換到了相機坐標系,世界坐標系下的 R a R_a Ra?就是相機坐標系的單位矩陣。

如果“左右旋轉X度,上下旋轉Y度的位置”得到了一個旋轉矩陣為 R b R_b Rb?,那么攝像頭在任意旋轉姿態的旋轉矩陣就是:

R = R b ? R a R = R_b \cdot R_a R=Rb??Ra?

注意這里使用的右乘,先變換的變換在矩陣級聯的右邊。并且忽略了一些細節,比如左右手坐標系,坐標系的X、Y、Z軸的軸對應關系。

總結:對于攝像頭縮放+旋轉的情況,需要預先進行有限次數的內參標定,然后通過實際的控制點在相機坐標系原點位置標定一次相對外參標定,從而得到任意姿態的絕對外參。

2.3 移動+旋轉+縮放畫面

雖然筆者討論了只存在攝像頭旋轉的情況,但是筆者很懷疑一般的相機攝像頭是不是能做到只旋轉而不移動位置。傳感器是非常精密的設備,即使從外觀上看攝像機是旋轉了角度,但是很可能傳感器的成像中心已經產生了偏移。其實高空攝像頭可能會搭配專門的移動和旋轉的裝置,也就是所謂的“云臺”,可以通過電機驅動實現攝像頭的移動、旋轉、傾斜和俯仰。這樣的話,外參的平移量也需要我們自己進行標定了。

我們還是假設高空云臺相機的SDK能提供旋轉參數和平移參數,因為畢竟你要知道攝像頭動起來,就必須從攝像頭的SDK獲取參數。不過很顯然了,從攝像頭的SDK獲取參數不是攝像頭真正的外參,這里的外參應該是相對于整個高空云臺相機局部坐標系的參數。在這種情況與只旋轉的解法也比較相似,只不過計算要復雜一點。在平移參數為0,旋轉參數為0的位置標定外參,假設得到的結果是平移量決定的平移矩陣 T a T_a Ta?,旋轉量決定的旋轉矩陣 R a R_a Ra?。之后通過云臺移動相機,得到相對平移矩陣 T b T_b Tb?,相對旋轉矩陣 R b R_b Rb?,那么攝像頭在任意位置姿態的外參矩陣就是:

M = T b ? R b ? T a ? R a M ={T_b} \cdot {R_b} \cdot {T_a} \cdot {R_a} M=Tb??Rb??Ta??Ra?

其實這里有個問題,這里SDK提供的相對外參 T b T_b Tb? R b R_b Rb?怎么來的呢?其實也是要通過預先標定得到,不過相對外參的標定就有點復雜了,有時間再研究一下。

總結:對于攝像頭移動+旋轉+縮放的情況,需要預先進行有限次數的內參標定,然后通過實際的控制點在高空云臺相機局部坐標系的原點位置標定一次相對外參標定,從而得到任意位態的絕對外參。

3. 總結

從本文提供的解決思路可以看到,這個技術方案與攝像頭硬件的關系很大,不是純軟件能夠搞定的事情。因此最好能使用專業的工業級相機與計算機視覺相機,能夠通過SDK提供的API動態獲取這些內參和外參,它們分別是:

  1. 內參:焦距、主點、像素尺寸、畸變系數。
  2. 外參:三個位置參數,三個姿態參數。通常是相對于局部的相機坐標系的外參。

如果是普通相機,需要做的工作就多了,主要是:

  1. 進行內參和外參標定。
  2. 開發SDK輸出標定的內參和外參。
  3. 項目部署前在局部的相機坐標系的原點位置,通過一組控制點進行一次相對外參標定。
  4. 得到任意位態的絕對外參,加上內參實時計算出任意注記點的像素坐標。

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

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

相關文章

深度解析 | 2025 AI新突破,物理信息神經網絡(PINN):Nature級頂刊的「科研加速器」,70份源碼論文速取!

🔥 為什么全球頂尖實驗室都在押注PINN? 過去一年,物理信息神經網絡(PINN,Physics-Informed Neural Networks)以「現象級」姿態席卷科研圈:不僅在NeurIPS、ICML等頂會橫掃15%相關論文&#xff0c…

0基礎學前端---品優購項目Day14

0基礎學前端—品優購項目Day14 視頻參考:B站Pink老師 本節重點:all 項目鏈接:完整的項目已放到 品優購完整項目 大家可以自行下載 強調內容 這里主要強調兩個知識點: (1) 網站TDK三個標簽SEO優化 (2) logo SEO優化 網站TDK三個…

LeetCode熱題100JS(37/100)第七天|排序鏈表|合并K個升序鏈表|LRU緩存|二叉樹的中序遍歷|二叉樹的最大深度|對稱二叉樹

148. 排序鏈表 題目鏈接:???????148. 排序鏈表 難度:中等 刷題狀態:1刷 新知識: - dic.reduceRight((t,c)>(c.nextt,c),null) 方法從數組的末尾開始執行 解題過程 思考 示例 1: 輸入:head […

課程2. 機器學習方法論

課程2. 機器學習方法論 訓練算法并評估其質量將樣本分成訓練和測試。分層 交叉驗證方法sklearn 接口算法模型訓練模型的應用質量評估 數據預處理標準縮放Violinplot 數據集使用模型Pipeline 在上一講中,我們討論了機器學習專家面臨的挑戰。無論解決的問題類型和解決…

六足仿生機器人地形自適應步態規劃研究

六足仿生機器人地形自適應步態規劃研究 第1章 緒論第2章 機器人系統建模第3章 地形感知與建模第4章 自適應步態生成算法第5章 動力學仿真與實驗第6章 驅動代碼設計與實現源碼&文檔鏈接 第1章 緒論 1.1 研究背景與意義 1.2 國內外研究現狀 1.2.1 多足機器人步態規劃 1.2.2 …

mysql表分區

本文簡述了mysql表分區的作用和特點,又演示了mysql表分區的創建過程,詳細演示了指定不同分區目錄時的處理辦法。由于表分區對crud操作是透明的,對于普通開發同學其實不用過多關注,但是本著學習的態度,在分庫分表等高大…

Nessus安裝

Nessus:https://pan.quark.cn/s/f5fb09b6d4fb 1.軟件安裝 點擊安裝,剩下的下一步即可。 直接下一步安裝即可 2.Web端安裝 會彈出一個web窗口 開始初始化 創建用戶 開始初始化 3.Cracker 會彈一個黑窗口 運行完,回車即可。訪問https://loc…

26-小迪安全-模塊引用,mvc框架,渲染,數據聯動0-rce安全

先創建一個新聞需要的庫 這樣id值可以逐級遞增 然后隨便寫個值,讓他輸出一下看看 模板引入 但是這樣不夠美觀,這就涉及到了引入html模板 模板引入是html有一個的地方值可以通過php代碼去傳入過去,其他的html界面直接調用,這樣頁…

第十三屆藍橋杯大賽軟件賽決賽C/C++ 大學 B 組

A 【2022——暴力DP / 優雅背包】-CSDN博客 B 【鐘表——類日期問題】-CSDN博客 C 【卡牌——二分】-CSDN博客 D 【最大數字——DFS】-CSDN博客 E 【出差——Dijkstra】-CSDN博客 F 【費用報銷——01背包】-CSDN博客 G 【故障——條件概率】-CSDN博客 H 【機房—…

樹莓集團最新現狀更新:南京園區業務的創新與突破

樹莓集團在南京的園區業務呈現出蓬勃發展的態勢,不斷實現創新與突破。 在產業布局方面,南京園區進一步優化了產業結構。除了繼續鞏固數字影像、數字娛樂等傳統優勢領域外,還積極拓展了數字金融、數字教育等新興領域。吸引了一批知名的數字金融…

Linux網絡編程(20250301)

網絡通信:進行不同主機的進程間通信 解決硬件與軟件的互聯互通 主機-->交換機-->路由器-->廣域網-->路由器-->交換機-->主機 IP地址:區分不同主機 MAC地址:計算機硬件地址 端口號:區分主機上的不同進程 1…

【JavaScript】《JavaScript高級程序設計 (第4版) 》筆記-附錄B-嚴格模式

附錄B、嚴格模式 嚴格模式 ECMAScript 5 首次引入嚴格模式的概念。嚴格模式用于選擇以更嚴格的條件檢查 JavaScript 代碼錯誤,可以應用到全局,也可以應用到函數內部。嚴格模式的好處是可以提早發現錯誤,因此可以捕獲某些 ECMAScript 問題導致…

藍橋試題:混境之地(記憶化搜索)

一、問題描述 小藍有一天誤入了一個混境之地。 好消息是:他誤打誤撞拿到了一張地圖,并從中獲取到以下信息: 混境之地是一個n?m 大小的矩陣,其中第 i 行第 j 列的的點 h i j? 表示第 i 行第 j 列的高度。他現在所在位置的坐標…

CC++鏈接數據庫(MySQL)超級詳細指南

C/C鏈接數據庫(MySQL)超級詳細指南 在C/C編程中,與數據庫進行交互是一項常見的任務。MySQL作為一個廣泛使用的開源關系型數據庫管理系統,提供了豐富的API供C/C開發者使用。本文將詳細介紹如何在C/C程序中鏈接MySQL數據庫&#xf…

基于EM期望最大化算法的GMM參數估計與三維數據分類系統python源碼

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 4.1 EM算法 E步:期望步 M步:最大化步 4.2 GMM模型 5.算法完整程序工程 1.算法運行效果圖預覽 (完整程序運行后無水印) 2.算法運行軟件版本 程序運行配置環境: 人工智能算法…

制服小程序的“滑手”:禁用頁面左右滑動全攻略

哈哈,看來你已經很聰明地發現了小程序中左右滑動的“頑皮”行為!😄 沒錯,我們可以通過設置 disableScroll 屬性來“管教”它,同時結合 CSS 樣式讓頁面既禁得住橫向“亂跑”,又能順暢地上下滾動。你的方案已…

docker學習筆記(1)從安裝docker到使用Portainer部署容器

docker學習筆記第一課 先交代背景 docker宿主機系統:阿里云ubuntu22.04 開發機系統:win11 docker鏡像倉庫:阿里云,此阿里云與宿主機系統沒有關系,是阿里云提供的一個免費的docker倉庫 代碼托管平臺:github&…

stable-diffusion-webui 加載模型文件

背景 stable-diffusion-webui 安裝完畢后,默認的模型生成的效果圖并不理想,可以根據具體需求加載指定的模型文件。國內 modelscope 下載速度較快,以該站為例進行介紹 操作步驟 找到指定的模型文件 在 https://modelscope.cn/models 中查找…

kotlin高級用法總結

Kotlin 是一門功能強大且靈活的編程語言,除了基礎語法外,它還提供了許多高級特性,可以幫助你編寫更簡潔、高效和可維護的代碼。以下是 Kotlin 的一些高級用法,涵蓋了協程、擴展函數、屬性委托、內聯類、反射等內容。 協程&#x…

Linux網絡 NAT、代理服務、內網穿透

NAT 技術 IPv4 協議中存在 IP 地址數量不充足的問題,而 NAT 技術是當前解決 IP 地址不夠用的主要手段 , 是路由器的一個重要功能。NAT 能夠將私有 IP 對外通信時轉為全局 IP,也就是就是一種將私有 IP 和全局 IP 相互轉化的技術方法。 這可以讓很多學…