計(jì)算機(jī)視覺應(yīng)用之OpenCV基礎(chǔ)教程
從工業(yè)檢測(cè)系統(tǒng)到自動(dòng)駕駛系統(tǒng),計(jì)算機(jī)視覺是一個(gè)包括許多有趣應(yīng)用的廣泛領(lǐng)域。許多這樣的系統(tǒng)在原型和實(shí)現(xiàn)階段都要用到開源計(jì)算機(jī)視覺 (Open Source Computer Vision Library,OpenCV)。OpenCV優(yōu)化了許多功能函數(shù),并在實(shí)時(shí)的計(jì)算機(jī)視覺程序中得到應(yīng)用。但是,由于嵌入式優(yōu)化策略得天獨(dú)厚的優(yōu)勢(shì),仍然值得大家嘗試?yán)眠壿嬘布砑铀貽penCV的性能。
目前,OpenCV被廣泛用于開發(fā)計(jì)算機(jī)視覺應(yīng)用中。OpenCV包含2500多個(gè)優(yōu)化的視頻函數(shù)的函數(shù)庫(kù),并且專門針對(duì)臺(tái)式機(jī)處理器和圖形處理器(Graphic Processing Unit,GPU)進(jìn)行優(yōu)化。
Xilinx提供的Vivado HLS高層次綜合工具能夠通過C/C++ 編寫的代碼直接創(chuàng)建RTL硬件,顯著提高設(shè)計(jì)效率;同時(shí),Xilinx Zynq全可編程SOC系列器件嵌入雙核ARM Cortex-A9處理器將軟件可編程能力與FPGA的硬件可編程能力實(shí)現(xiàn)完美結(jié)合,以低功耗和低成本等系統(tǒng)優(yōu)勢(shì)實(shí)現(xiàn)單芯片無以倫比的系統(tǒng)性能、靈活性、可擴(kuò)展性,加速圖形處理產(chǎn)品設(shè)計(jì)上市時(shí)間。OpenCV擁有成千上萬的用戶,而且OpenCV的設(shè)計(jì)無需修改即可在 Zynq器件的ARM處理器上運(yùn)行。但是,利用OpenCV實(shí)現(xiàn)的高清處理經(jīng)常受外部存儲(chǔ)器的限制,尤其是存儲(chǔ)帶寬會(huì)成為性能瓶頸,存儲(chǔ)訪問也限制了功耗效率。通過Xilinx公司提供的Vivado HLS高級(jí)語言綜合工具,設(shè)計(jì)者可以輕松實(shí)現(xiàn)OpenCV C++視頻處理設(shè)計(jì)到RTL代碼的轉(zhuǎn)換,將其轉(zhuǎn)換為可以在Zynq實(shí)現(xiàn)的硬件加速器或者在FPGA上實(shí)現(xiàn)的實(shí)時(shí)硬件視頻處理單元。
1、 OpenCV和HLS視頻庫(kù)如圖15.83所示,OpenCV在視頻處理系統(tǒng)中可以有不同的應(yīng)用方式。在圖15.83(a)中,算法的設(shè)計(jì)和實(shí)現(xiàn)完全依賴于OpenCV的函數(shù)調(diào)用,利用文件的訪問功能進(jìn)行圖片的輸入、輸出和處理;在圖15.83(b)中,算法可以在嵌入式系統(tǒng)(例如Zynq Base TRD)中實(shí)現(xiàn),利用特定平臺(tái)的函數(shù)調(diào)用訪問輸入輸出圖像,但是,視頻處理的實(shí)現(xiàn)依賴于嵌入式系統(tǒng)中處理器(例如Cortex™-A9)對(duì)OpenCV功能函數(shù)的調(diào)用;在圖15.83(c)中,處理算法的OpenCV功能函數(shù)被Xilinx Vivado HLS視頻庫(kù)函數(shù)替換,而OpenCV函數(shù)則用于訪問輸入和輸出圖像,提供視頻處理算法實(shí)現(xiàn)的設(shè)計(jì)原型。Vivado HLS提供的視頻庫(kù)函數(shù)可以被綜合,在對(duì)這些函數(shù)綜合后,可以將處理程序模塊整合到諸如Zynq的可編程邏輯中。這樣,這些程序邏輯塊就可以處理由處理器生產(chǎn)的視頻流、從文件中讀取的數(shù)據(jù)、外部輸入的實(shí)時(shí)視頻流。
圖15.83 OpenCV應(yīng)用的不同方式
Vivado HLS包含大量的視頻庫(kù)函數(shù),方便于構(gòu)建各種各樣的視頻處理程序。通過可綜合的C++代碼,實(shí)現(xiàn)這些視頻庫(kù)函數(shù)。在視頻處理功能和數(shù)據(jù)結(jié)構(gòu)方面,這些綜合后的代碼與OpenCV基本對(duì)應(yīng)。許多視頻概念與抽象和OpenCV非常相似,很多圖像處理模塊函數(shù)和OpenCV庫(kù)函數(shù)一致。
例如,OpenCV中用于代表圖片的很重要的一個(gè)類便是cv::Mat類,cv::Mat對(duì)象定義如下:
cv::Mat image(1080, 1920, CV_8UC3);
該行代碼聲明了一個(gè)1080&TImes;1920像素,每一個(gè)像素都是由3個(gè)8位無符號(hào)數(shù)表示的變量image。對(duì)應(yīng)的HLS視頻庫(kù)模板類hls::Mat<>聲明如下:
hls::Mat<2047, 2047, HLS_8UC3> image(1080, 1920);
這兩行代碼的參數(shù)形式、圖像尺寸最大值、語法規(guī)則不同,生成的對(duì)象是相似的。如果圖像規(guī)定的最大尺寸和圖像的實(shí)際尺寸相同的話,也可以用下面的代碼替代:
hls::Mat<1080, 1920, HLS_8UC3> image( );
表15.14給出了一個(gè)簡(jiǎn)單的圖像轉(zhuǎn)換函數(shù)應(yīng)用對(duì)比(功能實(shí)現(xiàn)dst=src*2.0+0.0)。
表15.15和表15.16給出了OpenCV和HLS視頻庫(kù)的核心結(jié)構(gòu)和HLS視頻庫(kù)。
2、AXI4流和視頻接口
通過AXI4流協(xié)議,Xilinx提供的視頻處理模塊實(shí)現(xiàn)像素?cái)?shù)據(jù)通信。盡管底層AXI4流媒體協(xié)議不需要限制圖片尺寸,但是,若圖片尺寸相同,則將會(huì)大大簡(jiǎn)化大部分的復(fù)雜視頻處理計(jì)算。對(duì)于遵循AXI4流協(xié)議的輸入接口,可以保證每一幀都包含ROWS * COLS的像素。在保證前面視頻幀保持完整性和矩形性的情況下,后續(xù)模塊實(shí)現(xiàn)對(duì)視頻幀有效地處理。
如表15.17所示,Vivado HLS包含2個(gè)可綜合的視頻接口轉(zhuǎn)換函數(shù)。