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

3D攝像頭行業(yè)巨頭的市場(chǎng)爭(zhēng)奪戰(zhàn)爆發(fā)“誰(shuí)”能勇立潮頭
MWC2018:奧比中光成功研發(fā)手機(jī)3D攝像頭 安卓陣營(yíng)進(jìn)入3D人臉識(shí)別時(shí)代
Lucid的3D融合技術(shù)實(shí)現(xiàn)攝像頭設(shè)備仿人類視覺3D景深識(shí)別
單目攝像對(duì)比立體攝像頭的優(yōu)點(diǎn)
為什么華為Mate30Pro前后都采用了3D深感攝像頭
人臉識(shí)別中雙目、單目、3D結(jié)構(gòu)光攝像頭的區(qū)別
專訪模組廠商:人臉識(shí)別中單攝像頭和雙攝像頭該如何選型
人臉識(shí)別中雙目、單目、3D結(jié)構(gòu)光攝像頭之間的區(qū)別
華為智能門鎖搭載3D深感攝像頭和人臉識(shí)別技術(shù)

以單顆CMOS攝像頭重構(gòu)三維場(chǎng)景,維悟光子發(fā)布單目紅外3D成像模組

評(píng)論