趙建軍,朱繼珍
(昆明理工大學理學院,昆明 650500)
隨著信息需求和人民生活水平的提高,人們對電子產品的需求日益增高,快速的將產品推向市場是提高市場占有率的關鍵。嵌入式產品開發周期的縮短帶來的巨大壓力,迫使嵌入式開發人員必須不斷創新開發理念。Open CV以其強大的圖像和矩陣運算能力以及良好的移植性使得在視覺應用領域的嵌入式產品有著很大的應用潛力,目前英特爾已經有部分Open CV視覺算法庫是針對嵌入式系統而開發的,它的開源性大大減少了開發者的編程工作量,進而有效提高了開發效率和程序運行的可靠性以及縮短了產品的開發周期,它是目前作為PC軟件進入嵌入式開發領域的一個較為成功的案例。
Open CV是一個基于BSD許可證授權(開源)發行的跨平臺計算機視覺庫,采用C/C++語言編寫,可以運行在Linux/Windows/Mac等操作系統上。實現了圖像處理和計算機視覺方面的很多通用算法。它的目標是構建一個簡單易用的計算機視覺框架,以幫助開發人員更便捷地設計更復雜的與計算機視覺相關的應用程序,以促進視覺研究的發展,更有效的避免“閉門造車”。Open CV包含的函數有500多個,覆蓋了計算機視覺的許多應用領域,如工廠產品檢測、醫學成像、信息安全、用戶界面、攝像頭標定、立體視覺和機器人等。開發者可以自由地調用函數庫中的相關處理函數。作為一個基本的計算機視覺、圖像處理和模式識別的開源項目,Open CV可以直接應用于很多領域,作為二次開發的理想工具。不過在利用Open CV做商業開發應用前,還應該仔細閱讀Open CV包所附帶的 PUBLIC LICENSE。由于Open CV中提供的開源代碼針對PC平臺,在移植過程中需要針對特定平臺進行代碼優化。
Open CV主要分為五個模塊,其中主要的四個模塊結構如圖1所示。

圖1 Open CV結構圖
CV模塊:包含基本的圖像處理函數和高級的計算機視覺算法。
ML:是機器學習庫,包含一些基于統計的分類和聚類工具。
HighGUI:包含圖像和視頻的輸入/輸出函數。
CXCORE:包含了Open CV的一些基本數據結構和相關函數。
CVAUX:該模塊一般用于存放即將被淘汰的算法和函數,同時也包含一些新出現的實驗性的函數和算法。
(1)硬件平臺
Xilinx的XUP Virtex-II Pro Development Board平臺提供給用戶一種類似ARM的32位處理器——PowerPC處理器(硬核)。
(2)軟件開發環境
Xilinx的嵌入式開發套件(Embedded Development Kit,EDK)是基于eclipse平臺而設計開發的工具,EDK帶有許多的工具和IP,可以用來設計完整的嵌入式處理器系統,主要包括Xilinx平臺工作室XPS和軟件開發套件SDK。
Open CV提供實現基于PC平臺Adaboost人臉檢測算法的一些精簡代碼,這里設計的目標是將其移植到XUP Virtex-II Pro Development Board平臺上的POWER PC處理器上實現檢測功能。
首先在EDK開發環境下配置針對Open CV人臉檢測的Power PC硬件平臺,包括PowerPC處理器、PLB總線、RS232串口、DDR存儲器等各種外設IP。并且編譯生成BIT流文件。建立后的硬件平臺如圖2所示。

圖2 Open CV人臉檢測的Power PC硬件平臺
硬件開發完成后,接下來就是在SDK中開發軟 件工程,硬件設計只是建立起一個可運行人臉檢測算法的平臺,給定一個樣本集,里面包含了兩個樣本集:人臉(正樣本)和非人臉(負樣本),可以從一系列的弱分類器中構造出一個強分類器,這就是所謂的boosting過程。本課題采用的就是類似boost算法的基于類Haar特征的Adaboost人臉檢測算法。Adaboost算法,就是一種級聯分類器算法,它把大量的分類能力一般的弱分類串聯起來,構成一個分類能力很強的強分類器,再將若干個強分類器串聯起來用來作為檢測人臉的層級級聯分類器。根據Adaboost算法,一幅圖像中的一個子區域被分類為人臉區域當且僅當該子區域能通過算法中所有的級聯分類器;而一個子區域能通過一個分類器僅當該子區域在該分類器所有特征上的特征值之和大于該分類器的閾值。
人臉檢測的功能描述主要在軟件工程中完成,這里以Open CV人臉檢測庫作為工程鏈接庫,通過對人臉檢測代碼的分析,發現其只使用到了Open CV的三個庫:CV庫、cxcore庫和highgui庫。所以直接將這三個庫放到設計的工程目錄下以便進行編譯鏈接,需要指出的是并不是直接完全復制這些庫,不同的算法在不同的嵌入式平臺上移植所需要對庫函數的裁剪是不同的,這里在Open CV提供的人臉檢測代碼基礎上進行修改優化,主要是根據VC與SDK編譯環境的差別進行修改,這里不詳細介紹SDK開發流程,重點是通過以人臉檢測移植這個例子來探索Open CV的許多視覺應用在嵌入式平臺上的移植方法。在SDK環境下修改和優化Open CV提供的人臉檢測代碼如圖3所示。

圖3 SDK下編寫人臉檢測代碼
編譯工程并且正確生成elf文件。
在Open CV的人臉檢測模塊中,CVHaarClassifierCascade是存儲人臉信息的 knowledge base;IplImage是一種存儲了圖像數據的內部格式。在人臉檢測中,它們是整個程序的輸入。
目標是把Open CV的代碼移植到Xilinx Virtex II Pro上,考慮到性能和專用的特點,不使用操作系統。這樣做引發了一個問題:不能使用OS提供的文件系統,可供操作的是線性的內存地址;無法使用highgui中的圖形功能,這說明程序的輸入將是原始圖片格式,輸出是監測區域的坐標值。
在Open CV的PC實現中,CVHaarClassifierCascade通過調用CVLoad對cascade的xml文件進行解析之后得到;這個解析的過程是復雜的,沒有必要把這部分邏輯拿到嵌入式設備上。一個好的辦法是把CVHaarClassifierCascade的內存鏡像搬到FPGA的DRAM當中,這樣CVHaarDetectObjects直接使用其即可。
同樣,圖片的道理也是一樣的,在PC開發當中,Open CV支持多種圖片文件的輸入,然后通過解析,最后變成統一的格式IplImage結構。這里把IplImage結構搬到FPGA的DRAM當中,就省去了圖片的格式解析過程。把CVHaarClassifierCascade和IplImage這兩個結構的鏡像寫到文件中;然后由于FPGA上的PPC是Big-endian的,而X86 PC是little endian的,再使用網絡字節序轉換工具將其轉換為big-endian的鏡像,這個鏡像直接下載到FPGA的DRAM當中,就可以用強制類型轉換為相應的結構體。
CVHaarClassifierCascade內存鏡像的生成:
結構體定義如下:


結構當中有指針,這使得映射的過程變得復雜,具體就是在實現的時候,把外層的struct寫到file里之后,需要調用內層struct的寫出函數,直到最后到沒有指針的一個結構。在讀入過程中也采用同樣的過程即可。讀入的時候用同樣的順序調用即可(幾乎是把write改成read就可以了)。
這個過程比較簡單,把IplImage的指針里的數據dump到文件中即可:

以int為單位進行轉換經過以上過程生成的image.big和cascade.big就可以直接下載到內存當中。
軟硬件開發完成后,將BIT文件、elf文件、被轉換后的圖片和分類器文件下載到FPGA中,利用XMP(調試POWER PC處理器命令行工具)通過命令行運行這個系統。最后在超級終端上輸出人臉檢測信息即人臉的坐標信息(見圖4)。

圖4 輸出人臉坐標信息
Open CV在嵌入式平臺上的移植要點
(1)使用低版本的Open CV。高版本的Open CV很大程度上依賴于C++的標準模板庫(STL)容器以及GCC和C99的擴展,不能很方便的對嵌入式進行擴展,所以有必要用Open CV1.1版本或者之前的版本,這些幾乎是用純C寫的。
(2)精簡Open CV,使用內聯函數。在Open CV里面有很多針對X86的低級別優化,可以使用嵌入式平臺支持的庫以及內聯函數替換來進行優化,OPEN CV的API接口支持多種數據存儲格式,可以采用一種來編譯出更簡單高效的代碼。
(3)去除不合理的浮點運算。Open CV移植的另一個挑戰就是浮點運算。它包含了一些專門的圖像處理功能,很依賴浮點運算,但是許多Open CV的圖像處理功能,從來沒有使用浮點運算,而一些特別的函數涉及到 Eigen values,feature spaces,image transformation and image statistics時往往使用的是浮點運算。
(4)合理安排處理結構。低層次的預處理,比如說 color space conversions,noise reduction and statistical computation更適合FPGA或者ASIC來實現。
(5)對Open CV函數的內存進行管理。例如,一些Open CV的API經營單位,是最初分配一個固定大小的,后來的擴大是為防止溢出的必要措施,其內容的增長模式為“記憶存儲”。在程序開始時分配合理足夠大的內存來減少內存碎片和不必要的調用。
(6)直接把VC里的檢測代碼放到SDK中編譯一般會出現3種錯誤,一是long long類型編譯器似乎不支持,改成long類型;二是有些包含的頭文件找不到,編譯器無法處理嵌套的頭文件包含關系,改成包含所有頭文件;三是某些空函數未定義,將空函數刪除。
論文的意義是通過研究源自Open CV人臉檢測算法在FPGA的移植,為探索Open CV的多種視覺應用在嵌入式處理器上的移植提供啟示。如果可以將Open CV的所有視覺應用功能移植在目前的嵌入式產品中去,將大大拓展嵌入式開發人員的設計思路。將更快速、更低成本地開發出具有突破性性能的產品。而Open CV本身的功能也還在不斷發展完善當中,這將預示Open CV在嵌入式產品中將有著極大的應用潛力。
[1]Gary Bradski Adrian Kaehler.學習 Open CV(中文版)[M].于仕琪,劉瑞禎,譯.北京:清華大學出版社,2009-10.
[2]華清遠見嵌入式培訓中心.FPGA應用開發入門與典型案例[M].北京:人民郵電出版社.2008-07.
[3]田耘徐,文波.Xilinx FPGA開發實用教程[M].北京:清華大學出版社,2008-11.
[4]楊強浩.基于EDK的FPGA嵌入式系統開發[M].北京:機械工業出版社,2008-01.
[5]田耕,胡彬,許文波,等.Xilinx_ISE_Design_Suite_10.x_FPGA開發指南.DSP、嵌入式與高速傳輸篇[M].北京:人民郵電出版社,2008-11.
[6]齊金山.基于Open CV的人臉檢測算法研究[J].淮陰師范學院學報(自然科學版),2009,8(3):218-220.
[7]湯鋒,王進.基于分層約束的人臉局部特征檢測[C].西安:第五屆中國計算機圖形學大會,2004.
[8]張國斌.FPGA開發全攻略—工程師創新設計寶典電子書(上冊)[M/OL].2009.2,http://icode.csdn.net/source/3051760.
[9]于仕琪,張兆翔,譯.Open CV中文參考手冊[M/OL].2010.10,http://download.csdn.net/detail/ealingwang/2995991.