本發(fā)明涉及一種硬件加速OpenCV庫(kù)中圖像處理函數(shù)的方法。
背景技術(shù):
計(jì)算機(jī)視覺(jué)技術(shù)幾年來(lái)發(fā)展成為學(xué)術(shù)界一個(gè)相當(dāng)成熟的科研領(lǐng)域,目前許多視覺(jué)算法來(lái)源數(shù)十年的科研成果?,F(xiàn)在計(jì)算機(jī)視覺(jué)技術(shù)正快速滲透到我們生活的方方面面,我們擁有自動(dòng)駕駛的汽車、能根據(jù)我們的每個(gè)動(dòng)作做出反應(yīng)的游戲機(jī)、自動(dòng)工作的吸塵器、能根據(jù)我們手勢(shì)做出響應(yīng)的手機(jī),以及其它等視覺(jué)產(chǎn)品。
今天我們面臨的挑戰(zhàn)就是如何高效地實(shí)現(xiàn)上述這些及未來(lái)的各種視覺(jué)系統(tǒng),同時(shí)滿足嚴(yán)格的功耗和上市要求。嵌入式系統(tǒng)在計(jì)算方面的局限性,尤其是在處理大型圖片、高幀率時(shí)計(jì)算能力低下嚴(yán)重限制了嵌入式系統(tǒng)在計(jì)算機(jī)/機(jī)器視覺(jué)實(shí)際方面的應(yīng)用?,F(xiàn)有對(duì)OpenCV(Open Source Computer Vision Library,計(jì)算機(jī)視覺(jué)函數(shù)庫(kù))的加速,主要有三種方案:A、GPU的方式,這種方式運(yùn)行速度快,通用性強(qiáng),但是GPU廠商基本都沒(méi)有提供基于Linux的驅(qū)動(dòng)源碼,需要開(kāi)發(fā)人員手動(dòng)移植到對(duì)應(yīng)的嵌入式平臺(tái),難度非常的大,對(duì)嵌入式系統(tǒng)的開(kāi)發(fā)人員的專業(yè)水平要求非常高;B、DSP的方式,這種方式通用性強(qiáng),但是并行性很差,并且價(jià)格昂貴;C、FPGA的方式,這種方式提供了強(qiáng)大的通用處理功能,此外還有穩(wěn)健可靠的數(shù)字處理功能,能夠?qū)崿F(xiàn)計(jì)算強(qiáng)度高、存儲(chǔ)高效的計(jì)算機(jī)視覺(jué)算法。
Xilinx使用的就是FPGA的方式,利用高層次綜合工具Vivado HLS,將OpenCV程序代碼轉(zhuǎn)換成硬件描述語(yǔ)言,最后綜合成IP核,然后再手動(dòng)進(jìn)行軟硬件集成。這種方式,需要軟硬件開(kāi)發(fā)人員同時(shí)參與,并且還需要進(jìn)行手動(dòng)軟硬件的集成,開(kāi)發(fā)流程復(fù)雜,開(kāi)發(fā)效率比較低。
因此,有必要設(shè)計(jì)一種不但能提高運(yùn)行速度,而且不需要硬件人員的參與,也不需要手動(dòng)軟硬件進(jìn)行集成,提高開(kāi)發(fā)效率的硬件加速OpenCV庫(kù)中圖像處理函數(shù)的方法。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明所解決的技術(shù)問(wèn)題是,針對(duì)現(xiàn)有技術(shù)的不足,提供一種硬件加速OpenCV庫(kù)中圖像處理函數(shù)的方法,在保持OpenCV原有庫(kù)框架的不變的基礎(chǔ)上,同時(shí)提高了運(yùn)行速度,而且不需要硬件人員的參與,也不需要手動(dòng)對(duì)軟硬件進(jìn)行集成。
本發(fā)明所提供的技術(shù)方案為:
一種硬件加速OpenCV庫(kù)中圖像處理函數(shù)的方法,包括以下步驟:識(shí)別OpenCV庫(kù)中計(jì)算工作量大,運(yùn)算耗時(shí)的圖像處理函數(shù),確定為需要進(jìn)行硬件加速的圖像處理函數(shù);然后進(jìn)行以下處理:
A、從OpenCV庫(kù)中需要進(jìn)行硬件加速的圖像處理函數(shù)中抽取復(fù)雜運(yùn)算的代碼,封裝成新的函數(shù),確保新的函數(shù)中沒(méi)有再次對(duì)OpenCV庫(kù)中的函數(shù)進(jìn)行調(diào)用,都是基本的算術(shù)邏輯運(yùn)算;
B、在需要進(jìn)行硬件加速的圖像處理函數(shù)所在文件中定義與新抽取的函數(shù)對(duì)應(yīng)的函數(shù)指針類型,函數(shù)指針類型的函數(shù)參數(shù)與新抽取的函數(shù)的參數(shù)保持一致;
C、針對(duì)定義的每一個(gè)函數(shù)指針類型,在需要進(jìn)行硬件加速的圖像處理函數(shù)所在文件中定義相應(yīng)的靜態(tài)全局變量(就是函數(shù)指針);
這些靜態(tài)全局變量是在OpenCV的庫(kù)內(nèi)部定義的,并且在下一步會(huì)定義對(duì)應(yīng)的賦值函數(shù),分別給對(duì)應(yīng)的變量進(jìn)行賦值,這樣OpenCV的應(yīng)用程序,就可以調(diào)用OpenCV庫(kù)中的賦值函數(shù),對(duì)這些靜態(tài)全局變量分別進(jìn)行賦值;
D、針對(duì)每一個(gè)靜態(tài)全局變量,定義一個(gè)可供OpenCV應(yīng)用代碼調(diào)用的賦值函數(shù),用來(lái)對(duì)對(duì)應(yīng)的靜態(tài)全局變量賦值,并且確保賦值函數(shù)的函數(shù)參數(shù)的類型就是靜態(tài)全局變量對(duì)應(yīng)的函數(shù)指針類型;
E、修改OpenCV庫(kù)中步驟A確定的需要進(jìn)行硬件加速的圖像處理函數(shù):首先,注釋掉其對(duì)新抽取的函數(shù)的調(diào)用;然后,將調(diào)用的參數(shù)傳遞給步驟C中定義的對(duì)應(yīng)的函數(shù)指針類型的靜態(tài)全局變量,這樣就實(shí)現(xiàn)了需要進(jìn)行硬件加速的圖像處理函數(shù)的內(nèi)部代碼改成對(duì)靜態(tài)全局變量的函數(shù)指針的調(diào)用;
F、重新編譯OpenCV庫(kù),生成動(dòng)態(tài)鏈接庫(kù),供OpenCV應(yīng)用代碼調(diào)用;
G、在OpenCV應(yīng)用代碼中,定義新的硬件加速函數(shù),其函數(shù)參數(shù)與步驟B中定義的函數(shù)指針類型的函數(shù)參數(shù)保持一致,其完成的功能與步驟A中抽取出來(lái)的函數(shù)的功能相同,并且確保其內(nèi)部不再調(diào)用OpenCV的庫(kù)函數(shù);在應(yīng)用代碼中,定義硬件加速函數(shù),就是將原來(lái)OpenCV庫(kù)中完成的功能,改由OpenCV應(yīng)用代碼來(lái)實(shí)現(xiàn);
H、OpenCV應(yīng)用代碼在初始化的時(shí)候,會(huì)調(diào)用OpenCV動(dòng)態(tài)鏈接庫(kù)中相應(yīng)的賦值函數(shù),將步驟G中定義的硬件加速函數(shù)作為參數(shù)傳給該賦值函數(shù),從而實(shí)現(xiàn)對(duì)庫(kù)中對(duì)應(yīng)靜態(tài)全局變量的賦值;
OpenCV應(yīng)用代碼對(duì)OpenCV庫(kù)中需要進(jìn)行硬件加速的圖像處理函數(shù)進(jìn)行函數(shù)調(diào)用時(shí),其內(nèi)部代碼會(huì)調(diào)用靜態(tài)全局變量的函數(shù)指針,由于此時(shí)靜態(tài)全局變量的函數(shù)指針已被賦值函數(shù)賦值為應(yīng)用代碼中的硬件加速函數(shù),從而實(shí)現(xiàn)對(duì)應(yīng)用代碼中的硬件加速函數(shù)的調(diào)用;
I、通過(guò)Xilinx SDSOC開(kāi)發(fā)平臺(tái),將步驟G中定義的硬件加速函數(shù)改成由FPGA硬件邏輯來(lái)實(shí)現(xiàn)。
步驟A到F在保持OpenCV低層庫(kù)框架不變的情況,通過(guò)函數(shù)指針調(diào)用替換原有功能函數(shù),生成新的動(dòng)態(tài)庫(kù)。步驟G和H在應(yīng)用層完成原有低層庫(kù)函數(shù)的功能。
本發(fā)明公開(kāi)了一種硬件加速OpenCV的圖像處理方法,
有益效果:
本發(fā)明提出的一種硬件加速OpenCV庫(kù)中圖像處理函數(shù)的方法,在Xilinx提供的SDSOC平臺(tái)基礎(chǔ)之上,采用特殊的技術(shù)處理方式,將OpenCV庫(kù)中的高強(qiáng)度計(jì)算功能函數(shù)移植到應(yīng)用層,原來(lái)OpenCV庫(kù)中需要進(jìn)行硬件加速的圖像處理函數(shù)的功能會(huì)挪到OpenCV應(yīng)用代碼中去實(shí)現(xiàn)。然后利用FPGA來(lái)進(jìn)行加速;采用這種方式,在保持OpenCV原有庫(kù)框架的不變的基礎(chǔ)上,提高了運(yùn)行速度,而且不需要硬件人員的參與,也不需要手動(dòng)對(duì)軟硬件進(jìn)行集成,簡(jiǎn)化了開(kāi)發(fā)流程,提高了開(kāi)發(fā)效率。
附圖說(shuō)明
圖1為OpenCV硬件加速流程。
具體實(shí)施方式
下面結(jié)合附圖和具體實(shí)施例對(duì)本發(fā)明作進(jìn)一步說(shuō)明。
如圖1所示,用戶預(yù)先識(shí)別OpenCV庫(kù)中運(yùn)算量大,需要硬件加速的函數(shù)。
例如針對(duì)OpenCV庫(kù)中的opencv-3.1.0\modules\calib3d\src\calibration.cpp文件中的reprojectImageTo3D函數(shù)進(jìn)行硬件加速,具體實(shí)施步驟如下:
A、將reprojectImageTo3D函數(shù)內(nèi)部的復(fù)雜運(yùn)算邏輯功能,抽取出一個(gè)新的函數(shù);
void sw_repro ject ImageTo3D(float*disparity,int rows,int cols,float q[][4],float minDisparity,float*outXYZ);
B、在該文件定義函數(shù)指針類型,其函數(shù)參數(shù)與新抽取函數(shù)的函數(shù)參數(shù)保持一致;
typedef void(*hiden_repro ject ImageTo3D)(float*disparity,int rows,int cols,float q[][4],float minDisparity,float*outXYZ);
C、定義一個(gè)該函數(shù)指針類型的靜態(tài)全局變量;
static hiden_repro ject ImageTo3D hiden_instance;
D、定義一個(gè)可供應(yīng)用程序調(diào)用的庫(kù)函數(shù),用來(lái)對(duì)靜態(tài)全局變量賦值,并且函數(shù)參數(shù)類型與上述定義的函數(shù)指針類型保持一致;
E、修改庫(kù)中需要進(jìn)行硬件加速的圖像處理函數(shù),將其內(nèi)部改成對(duì)靜態(tài)全局變量函數(shù)指針的調(diào)用;
F、重新編譯OpenCV庫(kù),生成對(duì)應(yīng)的動(dòng)態(tài)鏈接庫(kù),供應(yīng)用程序調(diào)用;
G、在應(yīng)用代碼中定義硬件加速函數(shù),調(diào)用動(dòng)態(tài)鏈接庫(kù)提供的賦值函數(shù),將硬件函數(shù)加速作為參數(shù)傳給該賦值函數(shù);
H、最后在Xilinx SDSOC開(kāi)發(fā)平臺(tái)中,將硬件加速函數(shù)hw_repro ject ImageTo3D_impl改成由FPGA硬件邏輯來(lái)實(shí)現(xiàn)。