通過單眼攝像頭復原3D模型
為了能夠通過單眼攝像頭實現3D識別,SfM(Structure from Motion)的技術。采用的方法是,移動攝像頭的位置,獲得視點不同的多個圖像,然后對這些圖像加以比較,從而復原拍攝對象的三維(3D)模型。對于車載攝像頭,只要車輛移動就能獲得視點不同的多個圖像,因此可以使用SfM制作車輛周邊的簡易3D模型。
獲得的3D模型如何應用不是由芯片來決定的,而是取決于開發者。比如,可以組合使用由多個車載攝像頭獲得的圖像生成的360度圖像,從而提高駕駛輔助的精度等。上述一系列的圖像識別處理利用VGA和全高清(1920×1080像素)車載攝像頭就能實現,無需專門選擇某種攝像頭。
1. Bundler簡介
Bundler是一個采用C和C++開發的稱為sfm(struct-from-motion)的系統,它能夠利用無序的圖片集合(例如來自網絡的圖片)重建出3D的模型。最早的版本被用在Photo Tourism的項目上。
Bundler的輸入是一些圖像、圖像特征以及圖像匹配信息,輸出則是一個根據這些圖像反應的場景的3D重建模型,伴有少量識別得到的相機以及場景幾何信息。系統借用一個由Lourakis 和Argyros提供的稱為Sparse Bundle Adjustment的開發包的修改版,一點一點遞增地重建出圖像場景。Bundler已經成功的應用在許多網絡相冊系統,尤其是一些建筑相冊里。
2. Bundler的編譯
下載到Bundler的源代碼之后,我們首先要對其進行編譯。在bundler-v0.4-source\vc++\文件夾下有Visual Studio2005創建的工程Bundler.sln,當然我們也可以使用更高的版本進行編譯。
在編譯f2c時,會給出無法找到#include"sysdep1.h"文件的錯誤。進入f2c的目錄,將sysdep1.h0文件名修改為sysdep1.h即可。
同時將signal1.h0文件名修改為signal1.h。再次編譯f2c庫時,會提示無法找到#include"arith.h"文件的錯誤,同時在f2c目錄下并沒有名字為arith.h的文件,這時可以新建一個arith.h文件,在文件里添加如下內容即可:
#define IEEE_8087
#define Arith_Kind_ASL 1
#define Long int
#define Intcast (int)(long)
#define Double_Align
#define X64_bit_pointers
#define QNaN0 0x0
#define QNaN1 0xfff80000
這時,編譯f2c,便成功了。
接下來編譯keyMatchFull和Bundler項目,一切順利。
為了進行獲得稠密的三圍重建效果,利用Bundler提供的Bundle2PMVS和RadialUndistort工具,生成稠密重建PMVS軟件所需的參數。
在編譯Bundlr2PMVS時,在Bundle2PMVS.cpp文件中會出現“未知的標識符mkdir”的錯誤。在文件的開頭添加#include,
同時將mkdir替換為_mkdir,如下所示:
//mkdir(output_path,0770);
_mkdir(output_path);
至此,Bundle2PMVS編譯成功。
在編譯RadialUndistort時,在RadialUndistort.cpp文件中會出現“無法識別的標識符index”。
原先的代碼如下所示:
//char *space = index(buf, ' ');
//if (space) *space = 0;
將其替換為:
std::string str(buf);
int space_pos = str.find(' ');
str.at(space_pos) = 0;
files.push_back(str);
至此,RadialUndistort編譯成功。
3. Bundler的運行
編譯完成后,需要將bundler-v0.4-source\vc++\Debug\目錄下的Bundler.exe,KeyMatchFull.exe, RadialUndistort.exe, Bundle2PMVS.exe, jpeg.dll,ann_1.1_char.dll文件統統考到bundler-v0.4-source\bin\目錄下。
在成功執行Bundler前,我們需要做幾步準備工作:
1.下載和安裝Cygwin。Cygwin是許多自由軟件的集合,最初由Cygnus Solutions開發,用于各種版本的Microsoft Windows上,運行UNIX類系統。由于Bundler默認是通過在Unix環境下執行shell腳本來啟動Bundler的,因為在Windows環境下需要安裝Cygwin以執行shell腳本。
要下載cygwin,直接在setup.exe上點右鍵“另存為”即可。也可以復制右邊這個地址:http://cygwin.com/setup.exe
cygwin的安裝比較簡單,可以參考這篇教程:
但要注意一點,Bundler程序中會使用perl、python來進行一些預處理,因此在安裝過程中需要把Devel、Perl、Python三個組件庫都選上。另外還有ImageMagick這個庫,用來處理圖片。
下載安裝的時間比較久,需要等待一段時間。安裝過程中一些殺毒軟件(比如360)可能會提示一些安全警告,無視即可。
2.下載特征檢測器。Bundler推薦使用SIFT來進行特征提取,可以到SIFT的作者David Lowe的主頁上下載他提供的SIFT Demo作為我們的檢測器。
下載完成后,解壓該文檔,將目錄下的siftWin32.exe文件拷貝到BASE_PATH\bin目錄中。
3.準備圖片。將要進行分析處理的圖片放到一個目錄里,比如BASE_PATH\Pictures\中(下面也統一以Pictures代替圖片目錄)。作為例子,Bundler自己也提供了兩套圖片,分別放在BASE_PATH\examples\ET和BASE_PATH\examples\kermit中。
4.下面對運行Bundler的腳本文件進行修改:
把RunBundler.sh文件中BASE_PATH=$(dirname $(which $0)); 一句等號后邊的東西替換為Bundler的根目錄,也就是RunBundler.sh文件所在的目錄,記得加雙引號。如BASE_PATH="E:/SDK/bundler-v0.4-source";。
然后把ToSift.sh文件中BIN_PATH設為bin目錄,如BIN_PATH="E:/SDK/bundler-v0.4-source/bin"。
5.這下就大功告成了!!
打開Cygwin,cd定位到Bundler根目錄下,然后輸入下面的命令測試一下例子的圖片:
./RunBundler.sh examples/ET
4. 后續工作
Bundler輸出的文件大多以“bundle_*.out”的形式來命名,我們稱之為“bundle文件”。缺省命令下,Bundler在每張圖片經過分析和注冊(register)后都會輸出一個相應的bundle文件用來保存當前的狀態信息,并以“bundle_.out”的形式命名。當所有的文件都注冊后,Bundler就會輸出一個最終的文件“bundle.out”。另外,每一回合結束時還會緊接著生成一些后綴名為“ply”的文件,這些文件包含的是經過重建后的相機和點的信息。
這些ply文件可以通過使用專用的查看器scanalyze來查看,
當然也可以通過meshlab來查看。
利用Bundler可以得到較為稀疏的點云(pointclouds)數據。如果需要得到更密集的點,可以使用Yasutaka Furukawa博士寫的另外一個非常強大的軟件包,稱為PMVS2,
一種比較常見的途徑是使用Bundler來得到相機參數,然后使用Bundle2PMVS程序,將生成結果轉換為PMVS2的輸入,然后使用PMVS2來得到更密集的點云。另外,讀者們可能會對另外一個同樣由Furukawa博士開發的實用工具——CMVS感興趣,CMVS是一個場景聚類程序,在使用PMVS2前可以使用它來進行一些預處理,
-
3D
+關注
關注
9文章
2887瀏覽量
107626 -
車載攝像頭
+關注
關注
5文章
138瀏覽量
28094 -
單目攝像頭
+關注
關注
0文章
4瀏覽量
4287
發布評論請先 登錄
相關推薦
評論