sfm演算法
㈠ C++怎麼調用openMVG庫
OpenMVG (open Multiple View Geometry):開源多視角立體幾何庫,這是一個cv屆處理多視角立體幾何的著名開源庫,信奉逗簡單,可維護地,提供了一套強大的介面,每個模塊都被測試過,盡力提供一致可靠的體驗。
地址:github
文檔:documents
openMVG能夠:
解決多視角立體幾何的精準匹配問題;
提供一系列SfM需要用到的特徵提取和匹配方法;
完整的SfM工具鏈(校正,參估,重建,表面處理等);
openMVG盡力提供可讀性性強的代碼,方便開發者二次開發,核心功能是盡量精簡的,所以你可能需要其它庫來完善你的系統。openMVG分成了幾個大的模塊:
核心庫:各個功能的核心演算法實現;
樣例:教你怎麼用;
工具鏈:也就是連起來用咯(亂序圖像集的特徵匹配,SfM,處理色彩和紋理);
#0. 安裝(win10+VS2013)
第一步當然是從github clone代碼,然後按照 BUILD 說明操作,需要注意的是:
template <class T> inline T operator|(T x, T y){
return static_cast<T>(static_cast<int>(x) | static_cast<int>(y));
};
建議和opencv一起編譯,方法是在CMakeLists.txt文件中修改相應選項為 ON,然後在cmake的GUI中添加一個叫OpenCV_DIR的入口,值就是你已經安裝好的opencv的路徑。
openMVG寫的非常不錯,對Windows也提供了良好的支持,所以cmake之後用VS打開生成的openMVG.sln解決方案就可以進行編譯了,編譯的時間稍久。我用的VS2013不支持C++新特性:constexpr,所以建議你使用VS2015或更新版本,如果一定要用VS2013,可以這樣做:在src/openMVG/cameras/Camera_Common.hpp文件中將有constexpr的地方直接去掉,或者改成模板函數也是可以的:
運行樣例,這里遇到一個坑:DenseStoraage.h line 86報錯:R6010 Assertion failed,這是一個斷言錯誤,在release模式下不會出現,但在debug模式下幾乎是必現。原因嘛,打開Eigen給出的網址可以明確:數據結構未對齊(unaligned arrays)。這個問題對於剛接觸openMVG的人來說還是很煩人的,openMVG代碼很優雅,很多數據類型都是從模板類或函數延伸,通過虛函數擴展各項具體方法,而且非常強烈的依賴Eigen這個庫,所以給定位問題帶來了阻礙。經過一天的攻堅,最後大概確認了原因:
regions.h這個文件中定義的Regions類包含了fixed-size vectorizable Eigen types的stl容器vector,按照Eigen提供的解決方法,需要做的是:
//原來
typedef std::vector<FeatureT> FeatsT;
//改成
typedef std::vector<FeatureT, Eigen::aligned_allocator<FeatureT>> FeatsT;
//其它類似的地方都要改,包括返回vector的函數,最好也加上 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
#1. 核心庫
#1.1 圖像
#Image Container
openMVG提供一個基本的類用作圖像容器:Image<T>,T代表像素類型,這個類可以處理灰度,RGB,RGBA或者自定義類型的圖像。用法很簡單:
// A 8-bit gray image:
Image<unsigned char> grayscale_image_8bit;
// Multichannel image: (use pre-defined pixel type)
// A 8-bit RGB image:
Image<RGBColor> rgb_image_8bit;
// 8-bit RGBA image
Image<RGBAColor> rgba_image_8bit;
Image<Rgba<unsigned char> > rgba_image2_8bit;
這里的 RGBColor,RGBAColor等是openMVG基於Eigen定義好的類型,具體是定義在pixel_types.hpp中。
#Image I/O
openMVG支持ppm/pgm,jpeg,png,tiff格式的圖片文件,例子:
Image<RGBColor> rgb_image_gray;
bool bRet = ReadImage("Foo.imgExtension", &rgb_image);
#Drawing operations
用於在圖像上畫圓,橢圓,直線等。
#1.2 數值
openMVG重新包裝了Eigen的基本類型和演算法,以便更簡單的調用。比如 Vec2代表一個二維點(char型)。
#1.3 特徵
這個模塊主要是提供特徵容器的封裝,包括特徵,特徵描述,關鍵點集等,基本都是模板類,比如頂一個sift特徵描述子可以這樣做:
// SIFT like descriptor
typedef Descriptor<float, 128> siftDescriptorData;
#1.4 相機
此模塊提供不同的相機模型的抽象類,包括:
#小孔相機模型
最簡單的相機模型,如圖: 相機模型包括內參和外參,關鍵詞也就是大家熟悉的幾樣:投影矩陣,旋轉、平移矩陣,焦距、主點等,具體參見說明。 看一個例子:openMVG提供的PinholeCamera類:
/// Pinhole camera P = K[R|t], t = -RC
struct PinholeCamera
{
//構造函數
PinholeCamera(
const Mat3 & K = Mat3::Identity(),
const Mat3 & R = Mat3::Identity(),
const Vec3 & t = Vec3::Zero())
: _K(K), _R(R), _t(t)
{
_C = -R.transpose() * t;
P_From_KRt(_K, _R, _t, &_P);
}
PinholeCamera(const Mat34 & P)
{
_P = P;
KRt_From_P(_P, &_K, &_R, &_t);
_C = -_R.transpose() * _t;
}
/// Projection matrix P = K[R|t]
Mat34 _P;
/// Intrinsic parameter (Focal, principal point)
Mat3 _K;
/// Extrinsic Rotation
Mat3 _R;
/// Extrinsic translation
Vec3 _t;
/// Camera center
Vec3 _C;
};
#1.5 多視角幾何
這部分是比較基礎和重要的模塊之一,包括了:
多視角集幾何中n(>=2)視角的求解演算法;
將這些求解演算法綜合起來以便進行魯棒估計的通用框架——Kernel;
文檔中講解了單應矩陣,本徵矩陣,本質矩陣,位置矩陣等的概念,講得非常好,建議仔細閱讀文檔。 簡單的解釋一下:
單應矩陣:描述兩個投影平面之間的關系;
本徵矩陣:同一個場景在兩個相機成像下的關系,也就是物體上的點A在兩個視角下成像位置的關系;
本質矩陣:基於本徵矩陣和內參矩陣建立,描述相機和本徵矩陣位置之間的相對關系;
位置矩陣:估計相機的絕對位置(被轉化為一個最小化問題求解);
Kernel:一個將求解器、數據、度量方案等結合起來的類,這個類將用於魯棒的估計以上的參數和矩陣;
#1.6 線性規劃
一個用於求解多視角幾何中線性優化(參數估計)的工具集,文檔。
#1.7 魯棒估計
提供一些列魯棒估計方法,比如:Max-Consensus,Max-Consensus,AC-Ransac A Contrario Ransac等。
#1.7 匹配
提供的介麵包括:NNS,K-NN,FLANN,KVLD,Cascade hashing Nearest Neighbor等。這些介面可用於在二維或三維點集,以及更高維的特徵描述集中。
#1.8 追蹤
多視幾何里的追蹤是指在一系列的圖片中找到對應的特徵點(同一點在不同視角下的位置)。
#1.9 sfm
openMVG提供的sfm模塊包含了處理SfM問題的一系列方法個數據存儲介面,例如相機位置估計,結構測量,BA等。 SfM_Data類包含了SfM所有的輸入:
struct SfM_Data
{
/// Considered views
Views views; // 包含圖像文件名,id_view,id_pose,id_intrinsic,image size。
/// Considered poses (indexed by view.id_pose)
Poses poses; // 相機的三維位置
/// Considered camera intrinsics (indexed by view.id_cam)
Intrinsics intrinsics; // 相機內參
/// Structure (3D points with their 2D observations)
Landmarks structure; // 二維視圖特徵關聯的3D點
}
下面是例子:
#1. features_siftPutativeMatches
這個樣例做了這么幾件事(直接翻譯官方):
分別提取兩張圖像的SIFT特徵(使用非免費的vlsift)並形成特徵描述;
根據特徵描述子匹配兩張圖像上的特徵點(BRUTE_FORCE_L2方法);
展示匹配結果;
剛開始的時候會遇到Assertion failed斷言錯誤,處理辦法見上一篇文章。運行成功項目目錄下會生成三個文件:00_images.jpg,01_features.jpg,02_siftMatches.svg。
#2. features_affine_demo
這個例子是圖像MSER(參考)和TBMR特徵提取的樣例,MSER(Maximally Stable Extremal Regions)最大極值穩定區域是一種對圖像灰度具有仿射變換不變性,也許也是這個樣例起名的原因。TBMR(tree-based Morse regions)這個演算法不是特別了解,具體可以在google學術中搜索。
#3. features_image_matching
這個樣例給出了利用Image_describer介面提取特徵描述子,並匹配和顯示結果的樣例。示例中可以選擇SIFT,AKAZE_MLDB或者AKAZE演算法,AKAZE介紹可看這里,是一種比SIFT更穩定的特徵檢測演算法。程序中關於解析輸入參數的部分可以注釋掉(如果你是用過VS2013 debug),直接修改sImage_describer_type這個值以測試。
#4. features_kvld_filter 和 features_repeatability
這兩個也是關於特徵提取和匹配的,kvld這個例子中由於之前更改了regions.h中的內容,所以有些函數介面也要做相應改變,具體也是在vector中增加對齊函數選項。
#5. multiview_robust_homography_guided 和 multiview_robust_fundamental_guided
這兩個樣例是估計單應矩陣和本徵矩陣的,並且能夠根據這些信息反過來確定匹配點。兩個樣例運行時間都很長(解析度教大時),第一個在用另外的照片時還遇到報錯,大概是在DoG時出錯,具體也沒有細究了·····
#6. exif_Parsing
提取EXIF信息,編譯後通過命令行執行,給出的參數格式:--imafile 你的照片路徑,路徑中使用/斜杠。
另一篇:learn openMVG-安裝和簡介
#7. multiview_robust_essential
估計本質矩陣並計算3D結構。這個例子可以直接運行,生成的點雲十分稀疏且不帶顏色信息。
㈡ ls-dyna演算法的詳細介紹
以前有這方面很詳細的資料,我簡單整理一下,用來回答你的問題
LS-DYNA中的接觸類型大體上可以分為五大類:
One-Way Contact (單向接觸)
Two-Way Contact( 雙向接觸)
Single Contact(單面接觸)
Entity
Tied Contac(固-連接觸)
在以上接觸類型中,前四種接觸類型的接觸演算法均採用罰函數法。
固-連接觸有的採用的罰函數法,有的採用動約束法,少部分採用分布參數法。
Tied Contac
(1)Translational DOF only, No Failure, No Offset
這種類型接觸採用動態約束演算法。
如下兩個命令是常用的固連接觸
*Contact_Tied_Nodes_To_Surface(6)
*Contact_Tied_Surface_To_Surface(2)
(2)Translational DOF only, No Failure, With Offset
這種接觸採用罰函數演算法,
與上述接觸類型2、6對應的為
*Contact_Tied_Nodes_To_Surface_OFFSET(O6)
*Contact_Tied_Surface_To_Surface_OFFSET(O2)
(3)Translational DOF & Rotational DOF, With Failure, No Offset
採用動態約束演算法。
(4)Translational DOF & Rotational DOF, With Failure, With Offset
罰函數法。
(5)Translational DOF Only, With Failure, With Offset
動態約束演算法。
作爆炸分析採用的是僅滑動接觸演算法,當炸葯和金屬的單元節點對應時不會出現節點穿透,可是這樣就限制了單元的劃分。當炸葯和金屬的單元節點不對應會出現穿透,而且增加接觸剛度的值也控制不了,這個時候還有其它控制穿透的辦法嗎?
下面僅滑動接觸關鍵字:
*CONTACT_SLIDING_ONLY
$ SSID MSID SSTYP MSTYP ***OXID MBOXID SPR MPR
2 1 0 0 0 0
$ FS FD DC VC VDC PENCHK BT DT
0.0 0.0 0.0 0.0 0.0 0 0.01.0000E+20
$ SFS SFM SST MST SFST SFMT FSF VSF
1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0
*CONTROL_CONTACT
$ SLSFAC RWPNAL ISLCHK SHLTHK PENOPT THKCHG ORIEN ENMASS
1.00 2 0 1 0 3 0
$ USRSTR USRFRC N***CS INTERM XPENE SSTHK ECDT TIEDPRJ
0 0 10 0 4.0 0 0 0
$ SFRIC DFRIC EDC VFC TH TH_SF PEN_SF
0.0 0.0 0.0 0.0 0.0 0.0 0.0
$ IGNORE FRCENG SKIPRWG OUTSEG SPOTSTP SPOTDEL
1 0 0 0 0 0
㈢ D3群在三維實空間中的矩陣表示是怎麼算的
MVS是一種從具有一定重疊度的多視圖視角中恢復場景的稠密結構的技術,傳統方法利用幾何、光學一致性構造匹配代價,進行匹配代價累積,再估計深度值。雖然傳統方法有較高的深度估計精度,但由於存在缺少紋理或者光照條件劇烈變化的場景中的錯誤匹配,傳統方法的深度估計完整度還有很大的提升空間。近年來卷積神經網路已經成功被應用在特徵匹配上,提升了立體匹配的精度。在這樣的背景下,香港科技大學Yaoyao等人,在2018年提出了一種基於深度學習的端到端深度估計框架——MVSNet。
多視圖立體匹配(Multi-view Stereo, MVS)是計算機領域中一個核心問題。重建多視圖立體匹配,可以認為是拍攝既定場景的一個逆過程。相機映射下,三維場景變換為二維,而多視圖立體匹配重建正好相反,其從這樣子。不同視點拍攝圖像,恢復出真實的三維場景。
傳統的方法使用手工設計的相似性度量指標和正則化方法計算場景的稠密對應關系(比如使用歸一化互相關Normalized Cross-Correlation和半全局匹配semi-global matching)。這些方法在非朗伯體表面、無弱紋理區域的場景可以達到很好的效果。但是在弱紋理區域,人工設計的相似性指標變得不可信,因此導致重建結果不完整。由MVS數據集的排行榜可知,這些方法具有很高的精度,然而在重建的完整度方法還有很大的空間可以提升。
卷積神經網路的研究的最新進展引發了人們完善立體匹配重建熱情。從概念看,基於學習演算法能夠捕獲全局的語義信息,比如基於高光和反射的先驗條件,便於得到更加穩健的匹配。目前已經探求一些兩視圖立體匹配,用神經網路替換手工設計的相似性度量或正則化方法。這些方法展現出更好的結果,並且逐步超過立體匹配領域的傳統方法。事實上,立體匹配任務完全適合使用CNN,因為圖像對是已經過修正過的,因此立體匹配問題轉化為水平方向上逐像素的視差估計。
與雙目立體匹配不同的是,MVS的輸入是任意數目的視圖,這是深度學習方法需要解決的一個棘手的問題。而且只有很少的工作意識到該問題,比如SurfaceNet事先重建彩色體素立方體,將所有像素的顏色信息和相機參數構成一個3D代價體,所構成的3D代價體即為網路的輸入。然而受限於3D代價體巨大的內存消耗,SurfaceNet網路的規模很難增大:SurfaceNet運用了一個啟發式的「分而治之」的策略,對於大規模重建場景則需要花費很長的時間。
㈣ AR必備一:AR雲技術(Cloud Anchor)
AR是增強現實,雲是指數據的存儲與計算。由於AR技術的特性,在雲端儲存的信息包括世界坐標信息、特徵點雲地圖等信息,然後被智能終端檢索,融合現實與虛擬世界信息的一種能力。
AR雲的共享,要求多名玩家共享世界坐標,每位玩家進入「共享」坐標系系統中,需要將自己的坐標系重定位到SLAM地圖中,並獲得正確的pose信息。接下來每一幀都要做坐標共享的事情,這種坐標同步及時發生,這個耗時即AR雲同步速率,反映在用戶設備上就是延遲。
例如你在廣場的雕塑上創作了一副AR塗鴉,想讓其他人也看到你的精美作品,就必須要用到AR雲的持久化、世界坐標共享的能力;如果需要協作完成AR作品,也離不開AR雲的坐標共享功能。圖是Google的Just a Line的多人協作玩法。
如果想解釋清楚AR雲,就一定繞不開重定位技術,多人共享世界坐標、AR內容持久化都用到的重定位技術。
SLAM技術具有World Tracking的能力,其結果是基於Feature的點雲,我們稱之為SLAM的地圖信息。重定位技術點核心是一種特殊的搜索方法。用戶的設備通過當前幀信息,搜索覆蓋的物理區域的SLAM地圖,以查找自己在SLAM地圖中的坐標位置。
這種搜索是耗時的,對普通用戶來說甚至要求有些苛刻。上傳的關鍵幀信息,都需要在AR雲端做必不可少的暴力運算,如果當前信息和SLAM的地圖信息差別較大,容易導致重定位失敗或不夠准確。當然也是有解決方案的,可以通過數據採集、深度學習的方法增重定位的寬容度,讓AR雲的能力更普世。
有兩種數據採集的模式:
這種方法一般是由供應商提前批量掃描,進行地圖數據收集並在雲端存儲,然後客戶再通過重定位技術獲得自己在地圖中的坐標。這種一般應用與展館、商場的室內導航,或者多人互動的營銷類項目。
人們活動的區域有限,通過每個用戶使用自己的攝像頭收集地圖信息,然後再進行重定位,這樣的結果就是世界地圖越來越大,總是來說是一種分而化之的方式。
AR雲一般指在重定位技術下實現的多人互動、持久化的技術載體,廣義的AR雲是指和雲存儲、計算相關的AR內容的一種表現形式,例如雲Marker,藉助雲端存儲Marker的patt信息,將Marker的識別放到雲端計算,可以突破Marker圖像庫的數量限制,在手機本地進行計算,中端手機Marker圖像庫一般不超過備鬧1000個,否則會有性能上的影響。當然也可以將Marker的跟蹤解析也放到雲端,這樣可以帶來更好的穩定性,跟蹤過程實時刷新,這個就要依賴網路的低延遲,5G的普及可以解決這一難題。
其他的AR雲形式還有SFM(從運動中恢復結構),即從一段運動中的遲滾殲視頻恢復出被拍攝主題的空間三維結構,由於計算量巨大,用戶上傳視頻到服務端進行解析,然後服務端再返回三維模型結果;這也是AR雲的一種應用方式。
AR雲的的使用規模比較小,基礎的AR雲地圖由用戶自己的採集。一般可以用來做多人互動的AR游戲,碼沖也能用來做類似ARNote類的應用,記錄、分享自己的生活。
AR雲所構建的地圖比較大,在雲端儲存了較多的信息,主辦方負責掃描場景並上傳雲端,使用者通過對環境的掃描,和雲端地圖比對,進行重定位。這種技術尺度級別一般用來做較大展館或商場的室內導航,或者多人協同合作的商場影響活動。
這種級別的AR雲,就能實現AR生活,無處不在的ARlog記錄生活點滴,高信息密度的AR信息,還有個性化的空間內容,平行宇宙不再只是出現在科幻小說中;比如站在樓頂可以看到城市街景,利用AR雲持久化的能力能看到城市的發展,歲月變遷、滄海桑田,盡收眼底。
持久化的能力能解決AR體驗的不可連續性,用戶使用智能設備創作的信息,被點雲地圖的形式保存起來,當用戶的智能設備再次掃描到相同的特徵點,通過重定位技術,可以再次開啟以往的創作內容,並且保留原內容的坐標、方向信息,這極大擴大了AR的應用場景,也是的眾包世界地圖信息成為可能,是一種能自激發自生長的能力。
所有參與AR體驗的用戶都會獲得同一世界坐標,即所有參與者可以從不同角度觀察同一AR物體。改變的AR玩法一直solo的局面,讓社交、互動可以融入AR的之中,為AR行業注入新的血液。在游戲類目中,新增了一種多人AR游戲這一類目。
在沒有GPS的情況下,依靠視覺信息定位(CPS)的一種方式。當AR信息與真實世界能嚴絲合縫的對齊,AR導航才有真實的應用價值,讓真實世界更准確和直觀的通航。
基於室內導航可做很多擴展,比如商場內的購物,門店的招牌廣告等,信息以一種密度的形式准確的疊加到真實世界,從而影響人與真實世界的交互行為。
這個能力特性可以讓AR雲用來做游戲體驗,比如Google發布的Just a Line游戲,多名玩家可以創作同一副AR作品;也可以在營銷運營類活動中使用,比如會場或商場的互動營銷活動。
AR雲導航的精確度高於GPS
fantasmo的示例
space的示例
dentreality的示例
YOUAR的示例
placenote的示例
上述了很多AR雲的技術特性,但自2017年各個技術公司或應用廠商都發布了在移動端的第一代產品,至今的產品在大眾用戶眼中,還都是技術嘗鮮,在好奇與獵奇心驅使下去嘗試,還沒能形成真正的產品使用習慣,也就是說AR雲還沒能真正解決用戶需求。
從技術層面上, AR雲的技術尚未成熟,比如在做室內導航技術上,很多用戶和開發者都表示想做地下車庫室內導航,但至今仍沒有規模化的產品可用,其中是有技術難題仍未解決的,以停車場導航為例:
在攝像頭取景的一幀內,各個地方的物體都非常類似,這種視頻流素材作為構建特徵地圖是非常困難的,在沒有GPS的幫助下,重定位誤差比較大;
停車場的車是流動的,人也是流動的,再次重定位的時候,會出現關鍵點匹配失敗的情況。
當然,這些技術難題也會不斷被攻克,比如未來的深度攝像頭,如果產品化,對關鍵點的提取和跟蹤會友好;AI技術的助力,可以識別3D物體,把指定的物體剔除,不再作為MAP保存,以此提高重定位的環境適應性。
現在技術還不算成熟,但從趨勢上看,是符合人獲取信息的趨勢。AR使信息能以更高密度、個性化、精準的存在。目前主流的硬體還是攝像頭,甚至仍是單目攝像頭,僅靠RGB和演算法來優化和識別,但以後有新的成熟贏家的加入,比如TOF,結構光等硬體更新,現在面臨的演算法瓶頸將不復存在。AR雲技術,未來可期。
㈤ 圖像視覺演算法(深度學習)和SLAM演算法哪個更有前景啊
vSALM(Visual SLAM)能夠在跟蹤攝像機(用於AR的手持或者頭盔,或者裝備在機器人上)位置和方位的同時構建三維地圖. SLAM演算法與ConvNets和深度學習是互補的。SLAM關注幾何問題,而深度學習主要關注識別問題。如果你想讓機器人走到冰箱面前而不撞到牆,就用SLAM。如果你想讓機器人識別冰箱里的物品,就用ConvNets。http://openmvg.readthedocs.io/en/latest/
SLAM相當於實時版本的SFM(Structure From Motion)。vSLAM使用攝像機,放棄了昂貴的激光感測器和慣性感測器(IMU)。單目SLAM使用單個相機,而非單目SLAM通常使用預先標定好的固定基線的立體攝像機。SLAM是基於幾何方法的計算機視覺的一個主要的例子。事實上,CMU(卡內基梅隴大學)的機器人研究機構劃分了兩個課程:基於學習方法的視覺和基於幾何方法的視覺。
SFM vs vSLAM
SFM和SLAM解決的是相似的問題,但SFM是以傳統的離線的方式來實現的。SLAM慢慢地朝著低功耗,實時和單個RGB相機模式發展。下面是一些流行的開源SFM軟體庫。
Bundler: 一個開源SFM工具箱,http://www.cs.cornell.e/~snavely/bundler/
Libceres: 一個非線性最小二乘法庫(對bundle adjustment問題非常有用),http://ceres-solver.org/
Andrew Zisserman's多視圖幾何Matlab函數庫,http://www.robots.ox.ac.uk/~vgg/hzbook/code/
vSLAM vs 自動駕駛
自動駕駛汽車是SLAM最重要的一個應用領域。未來很多年裡,在自動駕駛領域將持續地研究SLAM。