摘 要:針對動態光場場景圖像采集高速數據流、大容量、實時存儲等關鍵問題,文中介紹了系統硬件環境并給出圖像采集控制程序設計思路,使用Leutron公司的PicSight G32B-GigE-AR型號工業相機以及控制接口,完成圖像采集控制程序,采集系統具備穩定、方便易用等優點。
關鍵詞:動態光場高速數據流實時存儲圖像采集PicSight
中圖分類號:TN957文獻標識碼:A文章編號:1674-098X(2011)04(b)-0002-02
Abstract:In order to solve the problem of the high-speed data,mass-capacity and real-time data storage in image acquisition of dynamic light field.In the paper there presented the solution of the hardware environment and design method of image acquisition and control program.The project completed the program by using the industrial camera interface of Leutron’s PicSight G32B-GigE-AR,the acquisition system with the advantage of stability and easy using and so on.
Key words:dynamic light field;high-speed data streams;real-time data storage;image acquisition;Picsight
動態光場是虛擬現實、三維重建、立體視頻等計算機視覺和圖形學相關領域密不可分的技術基礎,構建動態光場采集系統中,現場系統采集的圖像數據流量大,處理這些高速大批量數據時,分配內存過小,頻繁訪問硬盤使程序運行效率降低,還會造成數據幀丟失,采集到的數據無法使用;分配內存過大,計算機運行緩慢甚至程序出現異常錯誤,另外在界面顯示時重繪的繪圖量很大,會出現畫面停頓、閃爍或者延遲。此外還存在對大型數據文件存取時間過長,操作不方便等問題。
針對高速數據流圖像數據的采集處理問題,文中提出相應解決辦法,協調控制圖像數據存儲和圖像顯示,最終實現場景圖像數據的穩定獲取和存儲,完成動態光場采集控制系統。
1 動態光場采集系統硬件環境
根據動態光場的特點,光場采集系統需要提供不同視角場景圖像,這就要對目標從不同視角進行視頻采集,本項目將采集系統框架設計成近似圓形的框架罩,采集環境框架如圖1所示,
整體圓罩框架劃分成十一片六邊形視角采集區,每個視角劃分片中心掛載高速相機,在劃分片的十二個棱條上安裝LED燈作為光源提供環境光照,獲取模擬某一視角的場景圖時,需要同步LED觸發信號和劃分片中心的相外部觸發信號。
項目選擇使用GigE Vision接口標準相機,相對于USB2.0,IEEE1394和CameraLink接口標準,GigE Vision的優勢在于高速數據率、傳輸距離長且不需圖像采集卡,這樣使得采集系統具有更穩定和方便易用的優點。
本項目光場采集頻率為180Hz,相機分辨率是656*493,每位像素值用24bit表示,一幀圖像大約需要占948K Bytes的存儲空間,存儲一臺攝像機的圖像數據系統吞吐率達到166MB/s,存儲大容量數據使用RAID(Redundant Array Of Inexpensive Disks,冗余磁盤陣列),RAID有六種級別,項目選擇使用RAID0,RAID0是將多個磁盤合并成整體,存儲數據時按照磁盤個數分段并行將數據寫進磁盤,其速度是最快的。另外傳輸數據方面使用PCI-X接口的主機可以滿足高速數據率。
2 圖像采集控制程序設計與實現
經過需求以及數據分析,項目中數據采集具有高速、巨量的特點,控制界面除顯示相機采集圖像和采集幀計數與標示外,還要提供相機參數設定以根據不同應用進行更改的控制功能,程序中使用到Leutron提供的其PicSight相機驅動開發包相關接口。
2.1 程序流程
本項目程序運行于Windows系統,開發平臺使用VC6.0,運行程序的主機和相機之間通過千兆網卡連接,通過程序設定相機性能參數,控制相機采集與存儲數據,圖像采集和存儲控制程序簡要流程如圖2所示。
為了降低成本,經過測試和實驗,完全可以在一臺主機上掛載多個相機進行采集數據,雖然每個主機配置相應要提高,比如安裝多個RAID0冗余磁盤,多個千兆網卡和高性能CPU等,但是和使用一臺主機處理一臺相機數據方案相比,成本要節約很多,所以對于程序流程中的圖像采集線程其實要根據實際情況分成多個子線程分別控制對應相機如圖3所示。
2.2 圖像數據采集實現
本項目實現在同一臺主機上同時控制三臺高速相機,下面是實現采集控制功能主要函數聲明代碼,LeutronCard是相機C/C++開發包中的設備類,該類中RegisterProFunc函數采用回調函數方法將圖像數據的采集處理交由開發人員實現,相機設備類LeutronCard中其他控制相機接口函數功能和參數可以詳細查閱PicSight技術資料。
LeutronCard m_card[CAMNUM];//實例化LeutronCard
static void ProcessCam1Data(void* param);//Cam1數據處理函數
voidCamDisplay(HDC hDC, size_t camIndex);//相機圖像顯示處理函數
enum { Cam1, Cam2, Cam3, CAMNUM };//相機數目
doublem_frameRate[CAMNUM];//幀速率
size_tm_frameIndex[CAMNUM];//幀計數
RECTm_rect[CAMNUM]; //圖像顯示重繪區域
virtual BOOL OnInitDialog();//各種參數初始值設定
afx_msg void OnOpenCamera();//相機控制函數
afx_msg void OnInitialize();//相機參數更改及初始化函數
…
2.3 圖像數據存儲實現
由于系統采集的圖像數據量巨大,開辟單緩沖區來存儲這些數據遠遠不夠,很可能造成數據丟失甚至程序崩潰,所以程序使用循環緩沖區來無限存儲數據。下面是主要實現代碼
TImgBuffm_imgBuff[CAMNUM];//緩沖區操作類
TThreadm_saveThread;//實例化線程同步處理類Tthread
size_tm_saveIndex[CAMNUM];存儲計數
boolm_saveBegin[CAMNUM];存儲控制開關量
std::string m_filepath[CAMNUM];//數據存儲路徑
typedef struct S_SequenceInfo
{
size_t saveFlag;
size_t frmIndex;
} SequenceInfo;//存儲標示結構變量
…
下面是相機Cam1圖像數據處理中回調給LeutronCard::RegisterProcFunc函數實現,使用循環緩沖區協調控制數據的采集和存儲以及圖像顯示,其余相機處理類似。
void CAcqCamDlg:: ProcessCam1Data (void* param)
{
PixelMem* pPixel = pThis->m_card[Cam1].GetPixelMemBase();//獲取循環緩沖區基地址
PixelMem* pBuff= pThis->m_imgBuff[Cam1].FrameData(sequenceInfo.frmIndex);
//計算緩沖區寫指針偏移量
memcpy(pBuff, pPixel, pThis->m_imgBuff[Cam1].FrameBytes());//拷貝循環緩沖區
memcpy(pBuff, sequenceInfo, sizeof(sequenceInfo));//獲取存儲數據標示
pThis->m_frameIndex[Cam1] = sequenceInfo.frmIndex;//顯示Cam1的幀計數
pThis->InvalidateRect((pThis->m_dispRect), FALSE); //重繪窗口
…
}
3 結果分析
運行程序控制采集系統,使用硬盤測試軟件工具SCSIBench對三個冗余磁盤監測,測試得到的實驗數據如表1所示。
從以上實驗結果分析,系統運行良好,控制界面的圖像顯示比較流暢,采集得到的數據可以交付使用。但對于太長時間的采集會有極少周期的數據幀的丟失,可能由以下兩個原因引起:(1)長時間采集導致電路板硬件電氣特性誤差。(2)采集主機性能,循環緩沖區寫覆蓋未被讀取數據,引起幀丟失。
4 結語
經過多次實驗采集測試,采集到的數據保持相當高的準確率,丟失幀發生情況比較少,控制系統運行穩定,通過測試驗收。另外可以在處理函數中添加丟失幀記錄功能,這樣在使用數據幀時可以根據記錄日志來選擇或者剔除不需要的數據。
參考文獻
[1]Overview and tutorial of the sequencer DRAL Library.Leutron Inc.2008-05.
[2]英向華.面向復雜非規則運動對象的大規模全景動態光場采集系統與再現.北京:北京大學.2008-07.
[3]左飛.萬晉森.Visual C++數字圖像處理開發.北京:電子工業出版社.2007.
“本文中所涉及到的圖表、公式、注解等請以PDF格式閱讀”