python ar 四種AR的實現方式

2021-10-11 22:36:11 字數 1809 閱讀 4425

我們在實現ar效果時,為了大大減少我們的工程量,我們可以借助一些主流的ar sdk,比如easyar ,vuforia,太虛ar等等,當然,作為ar技術的狂熱愛好者,我們的追求遠遠不止於此。所以了,我今天給大家介紹了幾種「底層」實現ar的方式。

opencv和c++ 實現

大概思路是opencv實現對marker的識別和定位,然後通過opengl將虛擬物體疊加到攝像頭影象下,實現增強現實。具體思路是:

使用sift演算法進行識別(特徵點的提取並用特徵向量對特徵點描述,接著當前檢視的特徵向量與目標物件的特徵向量進行匹配)

根據識別出來的原目標和幀影象匹配關係得到變化矩陣,來顯示三維物體(使用opengl來繪製),實現跟蹤。

對於基於標記的ar的opencv實現,我們常常用到marker:

黑色邊框中是編碼資訊,白色為1,黑色為0,將每一行作為乙個字,那麼每個字有5bits。其中,1、3、5位為校驗位,2、4位為資訊位。接下來用opencv實現,其具體思路為:

對輸入影象幀進行標記檢測,灰度化,找到影象中輪廓,檢測和解碼標記,

估計標記的三維姿態,這裡包括提前對攝像機進行相機標定,獲取相機內引數和失真係數,根據這個計算出標記的旋轉矩陣和平移矩陣,

由相機內引數和標記的旋轉矩陣和平移矩陣,用opengl進行渲染三維物體。

書籍:深入理解opencv 實用計算機視覺專案解析

文章:opengl與opencv實現增強現實

(鏈結python 實現ar效果

python是世界上最優雅的語言,目前的計算機視覺專案大都用python來實現,當然用python的cv庫也可以很輕鬆的實現ar效果。

用python來實現ar效果,我們首先運用到兩個工具包----pygame與pyopengl。pygame是非常流行的遊戲開發工具包,它可以非常簡單的處理顯示視窗,輸入裝置,事件以及其他內容。pygame是開源的(是opengl圖形煸炒的python繫結介面。並且它也是開源的(在實現的過程中,我們需要獲取照相機矩陣並轉換到opengl格式,並以平面和標記物進行姿態估計,然後在影象中放置虛擬物體。

當然,這裡也有乙個很好的python ar框架bar4py,它是由百曉通客棧×創客專案群著手開發的「增強現實(ar)」的 python 開發庫。

特點:基於 opencv,以及 python 的數學庫;

跨平台,可拓展,免費、開源;

支援簡單的 mark 標記物以及複雜的影象標記;

使用遺忘佇列結構動態更新相機標定;

可以看看他們的測試效果:

ar+slam

slam主要用於地圖重建,在ar中,我們主要運用slam演算法來獲取camera pose(slam的結果是基於feature的點雲,提前重建後可以remap拿到較好的camera pose)。

slam開發資源彙總:

ptam-ar:

opencv-marker-less-ar:

stereo_slam_ar(基於orb-slam):

效果:opencv-markerless-ar-mobile:

artoolkit

這是乙個老牌的ar工具包,artoolkit 它是乙個c/c++ 語言編寫的庫。對於開發乙個ar程式來說,最困難的部分在於實時的將虛擬影象覆蓋到使用者視口,並且和真實世界中的物件精確對齊。artoolkit使用影象技術計算攝像機和標記卡之間的相對位置,從而使程式設計師能夠將他們的虛擬物件覆蓋到標記卡上面。artoolkit 提供的快速和準確的標記跟蹤,能夠讓你快速的開發出許多更新更有趣的ar程式。

目前artoolkit支援以下系統:

artoolkit官網:

artooklit優秀文章:

下次了,會出乙個artoolkit 與 unity 結合的開發教程。

多型的四種實現

多型分為兩種 通用的多型和特定的多型。兩者的區別是前者對工作的型別不加限制,允許對不同型別的值執行相同的 後者只對有限數量的型別有效,而且對不同型別的值可能要執行不同的 通用的多型又分為引數多型 parametric 和包含多型 inclusion 特定的多型分為過載多型 overloading 和...

ADT Queue 四種實現

講四種實現 普通陣列模擬佇列實現不講,很輕便也很實用,不難自己隨意寫寫就行 佇列和棧在使用時,即使運算元很多,但一般實時儲存在其中的資料並不多,於是我們採用迴圈佇列的方式來節省空間。那迴圈佇列其實就是,當佇列中申請好的連續空間中已經填滿資料時 並不是指佇列已滿,佇列是只夾在front和rear之間的...

實現ORM的四種方案

正如orm名稱所指示的,實現orm的關鍵點在於解決 物件 關係 之間的對映,例如,如何將乙個datarow轉換為乙個entity object,又如何將乙個對某entity object的操作對映到乙個idbcommand,等等。我們以datarabbit為例,public inte ce tent...