[FlyCapture2] Bumblebee XB3 Save Images to Three AVI Files (Left, Center and Right) 大黃蜂立體相機保存捕獲的視頻到左中右三個不同的文件


 

PointGreyResearch是世界領先的致力於開發高級數字相機產品的公司。PointGrey產品涉及IEEE-1394相機、立體視覺相機和360度全景數字視頻相機。其中二代和三代的大黃蜂立體相機(Bumblebee2 and Bumblebee XB3) 也算其中的明星產品。大黃蜂二代相機有左右兩個相機可以同時拍攝,而三代更是喪心病狂般的用了三個攝像頭,模仿二郎神嗎?每個攝像頭的分辨率是1280x960,一身土豪金的塗裝讓人愛不釋手,真是越看越喜歡呀。

 

 

灰點公司的硬件做的棒的沒話說,但是提供的SDK卻讓人不敢恭維。主要提供了兩個SDK,分別是FlyCapture2和Tripclops。其中 FlyCapture2 是比較基本的SDK,主要提供通用的軟件接口來從USB, GigE, FireWire等接口獲取攝像機捕獲的圖像,和攝像機的一些基本配置。Tripclops 是一個計算機立體視覺庫,可以提供實時的深度圖像,讓用戶來精確的測量圖片中每一個像素的距離,並去除了一些透鏡畸變(lens distortions)和失調問題(misalignments),還提供了些簡單三維重建代碼,但是效果很不近人意。

 在FlyCapture2 SDK給的Example中,有個名為SaveImageToAviEx的例子是用來保存攝像機捕獲的圖像集到一個avi文件中,這是一個通用的例子,對灰點公司的每個攝像機產品都通用。但是對於大黃蜂攝像機問題就來了,大黃蜂攝像機有兩個或三個攝像頭,而該例子保存出來的只有一個文件,對於XB3攝像機,三個鏡頭捕捉的圖像纏繞在了一起,如下圖所示:

 

 

而SDK中也沒有相應的代碼來把左中右三個視圖分開,於是乎只能自己寫代碼來分開三個視圖。在查閱了一些有關Bumblee XB3的資料后,發現其是利用 Format_7 像素格式設置來控制捕從幾個攝像頭來獲圖像的,如果把像素格式改為RGB8, 則獲得是上圖中三個視圖交織在一起的效果,三個視圖分別被存在了RED, GREEN, BLUE通道里面。具體設置可參見灰點公司的文章( Using Format_7 modes to control image capture from stereo cameras ). 

攝像頭捕獲的圖像是以Bayer Tile format格式存儲的,每像素8位,之后可以通過色彩處理(color processing) 來增加的24位或32位的BGR彩圖,不同的攝像機的型號決定着其圖像傳感器上的色彩濾波矩陣(color filter arrays)上的RED, GRREN, BLUE的排列順序。(可參見 How to determine and interpret the Bayer Tile pixel format of a PGR camera )

最終分離的效果如下圖所示:

 

 

下面大概說下實現過程吧,用到了OpenCV和FlyCapture2這兩個SDK,用OpenCV的原因是因為FlyCapture2中讀AVI的函數只能處理2GB以內的視頻文件,OpenCV在處理圖像視頻方面很強大,又有很完備的類和函數可以直接用,而且網上的教程也很多,所以用其來讀取AVI視頻文件並處理,大概實現過程如下:

1,用OpenCV打開BumblebeeXB3捕獲的avi文件,並且將每一幀取出來存到一個IplImage的指針變量中

2,我們需要把OpenCV的圖片類型IplImage轉為FlyCapture2中的圖片類型Image,可以參見我之前的博客Conversion between OpenCV IplImage and FlyCapture2 Image 兩種圖像類的相互轉化

3. 我們的目標是將其保存為左中右三種avi視頻文件,我們這里用FlyCapture2中提供的AVIRecorder類來實現保存avi的操作,該類使用方法可以參見Flycapture2 SDK中的例子SaveImageToAviEx,我們要做的就是寫一個函數把一個重疊的Image類圖片變量分開到left,center,right三個Image類圖片變量

4. FlyCapture2中Image類中的數據是以unsigned char類型保存的,而且是按左中右分別存的,我們只需每三個拆分出來分別保存到新的Image變量中,可參見如下pseudo-code:

 

for i in rows:
    for j in cols:
        left[i*cols + j] = *data
        ++data
        center[i*cols + j] = *data
        ++data
        right[i*cols + j] = *data
        ++data

 

其中rows,cols,data分別是輸入的重疊的Image類圖片的高,寬和數據。left,center,right是新建的用來保存左中右圖片中數據的unsigned char的變量,最后利用Image類中SetData函數將left,center和right賦給定義的Image類的左中右的圖片里。

 

博主寫了一個自動分割Bumblebee XB3為左中右三視圖的軟件,並支持圖片和視頻的錄制,需要使用的可以在我的github上下載:

https://github.com/grandyang/StereoCapture/tree/master/QtStereoCapturePGR

(使用本軟件需要安裝Point Grey Research的FlyCapture SDK,下載地址為: https://www.ptgrey.com/flycapture-sdk)

 

有任何疑問或改進歡迎留言評論:)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM