Bundler 在linux下的安裝

作者:Joseph Pan (轉載請註明出處http://www.cnblogs.com/weizhoupan/archive/2011/03/05/Intro_on_Bundler.html)

一、什麼是Bundler

  Bundler是一個採用C和C++開發的稱爲sfm(struct-from-motion)的系統,它能夠利用無序的圖片集合(例如來自網絡的圖片)重建出3D的模型。最早的版本被用在Photo Tourism的項目上。

  Bundler的輸入是一些圖像、圖像特徵以及圖像匹配信息,輸出則是一個根據這些圖像反應的場景的3D重建模型,伴有少量識別得到的相機以及場景幾何信息。系統借用一個由Lourakis 和Argyros提供的稱爲Sparse Bundle Adjustment的開發包的修改版,一點一點遞增地重建出圖像場景。Bundler已經成功的應用在許多網絡相冊系統,尤其是一些建築相冊裏。

  下面我們就來了解一下Bundler的下載、安裝和開發環境配置。

二、Bundler的下載

  Bundler的下載頁面在:http://phototour.cs.washington.edu/bundler/

  如果只需要得到windows下的可執行文件,可以直接下載:bundler-v0.3-binary.zip

  如果需要得到源代碼,則可以下載目前較新的版本:bundler-v0.4-source.zip 或者:bundler-v0.4-source.tar.gz (兩者沒區別,後者是Linux下的常用壓縮格式)。

三、Bundler的安裝配置

  以Windows爲例。下載Bundler後,將其解壓到一個路徑,比如:E:\bundler(下面都以BASE_PATH來代替)

  在成功執行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的安裝比較簡單,可以參考這篇教程:http://www.programarts.com/cfree_ch/doc/help/UsingCF/CompilerSupport/Cygwin/Cygwin1.htm

  但要注意一點,Bundler程序中會使用perl、python來進行一些預處理,因此在安裝過程中需要把Devel、Perl、Python三個組件庫都選上。

  下載安裝的時間比較久,需要等待一段時間。安裝過程中一些殺毒軟件(比如360)可能會提示一些安全警告,無視即可。

  2.下載特徵檢測器。Bundler推薦使用SIFT來進行特徵提取,可以到SIFT的作者David Lowe的主頁上下載他提供的SIFT Demo作爲我們的檢測器。下載頁面爲: http://www.cs.ubc.ca/~lowe/keypoints/ 或者直接點擊右邊的下載地址下載:SIFT demo program (Version 4, July 2005)

  下載完成後,解壓該文檔,將目錄下的siftWin32.exe文件拷貝到BASE_PATH\bin目錄中。

  3.準備圖片。將要進行分析處理的圖片放到一個目錄裏,比如BASE_PATH\Pictures\中(下面也統一以Pictures代替圖片目錄)。作爲例子,Bundler自己也提供了兩套圖片,分別放在BASE_PATH\examples\ET和BASE_PATH\examples\kermit中。

  4.運行Bundler。打開Cygwin,cd定位到BASE_PATH目錄下,然後輸入下面的命令:

./RunBundler.sh Pictures

  關於Bundler還提供了許多種命令行選項,具體的用法可以參考BASE_PATH\README.txt文件。

  如果只想測試一下例子的圖片,則可以鍵入:

./RunBundler.sh examples/ET
或者:
./RunBundler.sh examples/Kermit

  圖2就是運行ET例子的截圖:

  

          圖2 Windows下使用cygWin執行Bundler的結果

  Linux下的安裝則簡單一些。主要的區別在於以下幾點:

  1.由於Linux本身支持shell,因此不需要安裝Cygwin。

  2.下載Lowe的SIFT Demo後,自帶的siftWin32.exe已不可用。需要通過手動make編譯得到sift的可執行文件。完成後將sift文件拷貝到BASE_PATH\bin目錄中。

  3.完成了上面兩步後還不夠,如果直接執行RunBundler.sh腳本,會提示圖3所示的錯誤。

  

                圖3 提示缺少共享庫文件錯誤

  這是因爲我們沒有設置好共享庫。最直接的做法是將BASE_PATH\bin目錄下的libANN_char.so複製到/lib中:

$ sudo cp libANN_char.so /lib

  此時再執行一次RunBundler.sh腳本,即可順利執行完畢得到結果,如圖4所示。

  

            圖4 Linux下Bundler的運行結果

四、Bundler的輸出格式

  我們可以在BASE_PATH\Bundler目錄下找到生成的結果。如圖5所示。

  

           圖5 Bundler目錄下存放的處理結果

  Bundler輸出的文件大多以“bundle_*.out”的形式來命名,我們稱之爲“bundle文件”。缺省命令下,Bundler在每張圖片經過分析和註冊(register)後都會輸出一個相應的bundle文件用來保存當前的狀態信息,並以“bundle_<n>.out”的形式命名。當所有的文件都註冊後,Bundler就會輸出一個最終的文件“bundle.out”。另外,每一回合結束時還會緊接着生成一些後綴名爲“ply”的文件,這些文件包含的是經過重建後的相機和點的信息。這些ply文件可以通過使用專用的查看器scanalyze來查看,地址爲:http://graphics.stanford.edu/software/scanalyze/

  這些bundle文件包含了一些經過估算得到的場景和相機幾何信息。文件的格式如下:  

複製代碼
# Bundle file v0.3
<num_cameras> <num_points> [2 integers]
<camera1>
<camera2>
...
<cameraN>
<point1>
<point2>
...
<pointM>
複製代碼

  每一個camera實體<cameraI> 的值是估算得到的相機內部和外部參數,形式爲:

<f> <k1> <k2> [the focal length, followed by two radial distortion coeffs]
<R> [a 3x3 matrix representing the camera rotation]
<t> [a 3-vector describing the camera translation]

  每個相機的排序根據其在圖片列表中的出現順序來指定。

  每個point實體<pointI>格式爲:

<position> [a 3-vector describing the 3D position of the point]
<color> [a 3-vector describing the RGB color of the point]
<view list> [a list of views the point is visible in]

  其中,view list存放的是每一個點所在的場景列表的信息,開頭第一個數是每個場景列表的長度信息,然後緊接着分別是相機索引信息、該點所在的SIFT關鍵點序列的索引信息,以及該關鍵點所在的位置。

  根據這些bundle文件內容以及小孔成像模型,我們就可以大致得到每臺相機的參數:

  focal length (f),

  two radial distortion parameters (k1and k2),

  rotation (R),

  translation (t)。

  按照下面的法則我們可以將一個3D點X投影到參數爲(R,t,f)的相機中:

P = R * X + t (conversion from world to camera coordinates)
p
= -P / P.z (perspective division)
p
' = f * r(p) * p (conversion to pixel coordinates)

  其中,P.z是P的z座標值。r(p)是一個用來計算出徑向畸變(radial distortion)校正的尺度變量值的函數:

r(p) = 1.0 + k1 * ||p||^2 + k2 * ||p||^4.

  最後,利用上面的公式還可以得到相機的方向(viewing direction)爲:

R' * [0 0 -1]' (i.e., the third row of R or third column of R')

  其中,' 表示一個矩陣或者向量的轉置,而相機的空間位置就爲: 

-R' * t .

五、總結

  本文介紹瞭如何使用Bundler來根據圖片得到相機參數以及一些空間點雲數據,並詳細介紹了它在Windows和Linux下的安裝和配置方法,以及輸出結果的格式。得到的數據將能夠運用在3D重建中。利用Bundler可以得到較爲稀疏的點雲(point clouds)數據。如果需要得到更密集的點,可以使用Yasutaka Furukawa博士寫的另外一個非常強大的軟件包,稱爲PMVS2。一種比較常見的途徑是使用Bundler來得到相機參數,然後使用Bundle2PMVS程序,將生成結果轉換爲PMVS2的輸入,然後使用PMVS2來得到更密集的點雲。另外,讀者們可能會對另外一個同樣由Furukawa博士開發的實用工具——CMVS感興趣,CMVS是一個場景聚類程序,在使用PMVS2前可以使用它來進行一些預處理。

  下一篇博文將進一步介紹如何在Linux下編譯Bundle的源代碼。

分類: Me&IT
標籤: Bundler
1
0
(請您對文章做出評價)
« 上一篇:圖像特徵檢測(Image Feature Detection)[轉載]
» 下一篇:如何編譯安裝Bundler
posted @ 2011-03-05 00:35 Joseph Pan 閱讀(3120) 評論(0編輯 收藏

發佈了33 篇原創文章 · 獲贊 17 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章