于 蕾,李欣澤,侯長(zhǎng)波
(1. 哈爾濱工程大學(xué) 信息與通信工程學(xué)院 電工電子國(guó)家級(jí)實(shí)驗(yàn)示范中心,黑龍江 哈爾濱 150000;2. 哈爾濱工程大學(xué) 信息與通信工程學(xué)院,黑龍江 哈爾濱 150000)
傳統(tǒng)的 “電子系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)” 課程中所采用的FPGA 芯片功能較單一,需要使用專(zhuān)用的硬件描述語(yǔ)言(Verilog HDL 或者VHDL),擅長(zhǎng)C 語(yǔ)言或者嵌入式系統(tǒng)編程的工程師往往需要重新入門(mén)學(xué)習(xí),不利于擴(kuò)展后續(xù)功能[1]。在市場(chǎng)需求的推動(dòng)下,為了滿(mǎn)足下一代應(yīng)用處理的需求,Xilinx推出了ZYNQ系列產(chǎn)品[2],ARM+FPGA 體系結(jié)構(gòu)能夠在芯片上提供軟、硬件和I/O 可編程功能[3]。因此,對(duì)電子系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)課程進(jìn)行內(nèi)容更新就成為必然要求。課程組對(duì) “電子系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)”課程體系進(jìn)行了改革,引入了ZYNQ 平臺(tái)[4]。
本實(shí)驗(yàn)案例基于ZYNQ 平臺(tái)設(shè)計(jì)了一個(gè)圖像拼接系統(tǒng),為“電子系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)”提供了實(shí)驗(yàn)教學(xué)素材[5]。要求學(xué)生通過(guò)學(xué)習(xí)實(shí)驗(yàn)案例,重點(diǎn)掌握如何基于ZYNQ 平臺(tái)實(shí)現(xiàn)圖像拼接算法。其中,算法功能是依托ZYNQ 的ARM 部分通過(guò)C++語(yǔ)言以及OpenCV 實(shí)現(xiàn)的[6],而圖像拼接結(jié)果的顯示是通過(guò)搭建Debian 桌面系統(tǒng)、對(duì)FPGA 部分的HDMI 接口進(jìn)行配置和驅(qū)動(dòng)來(lái)實(shí)現(xiàn)的。
在實(shí)驗(yàn)先導(dǎo)課中,學(xué)生能夠?qū)W習(xí)使用ZYNQ 進(jìn)行開(kāi)發(fā)設(shè)計(jì)的全過(guò)程和基本概念,了解ZYNQ 學(xué)習(xí)的常用方法。在搭建硬件實(shí)現(xiàn)平臺(tái)和算法移植的過(guò)程中,能夠培養(yǎng)學(xué)生解決在ZYNQ 設(shè)計(jì)、調(diào)試過(guò)程中出現(xiàn)的問(wèn)題的能力,為學(xué)生今后學(xué)習(xí)使用ZYNQ 進(jìn)行軟硬件協(xié)同設(shè)計(jì)和開(kāi)發(fā)方面的工作打下良好基礎(chǔ)。
為了避免學(xué)生局限于相關(guān)圖像處理理論知識(shí)而無(wú)法完成電子系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)內(nèi)容的情況,本實(shí)驗(yàn)采用了Image Stitching 算法[7]。Image Stitching 算法是一種為了解決相機(jī)鏡頭廣角有限問(wèn)題而設(shè)計(jì)的開(kāi)源圖像拼接算法。
如圖1 所示,使用Stitching_ detail 進(jìn)行多幅圖像拼接的大致流程如下。
(1)對(duì)待拼接圖像進(jìn)行尺寸縮放等預(yù)處理。
(2)使用ORB 算法對(duì)待拼接圖像進(jìn)行特征點(diǎn)檢測(cè)并進(jìn)行特征點(diǎn)描述[8]。
(3)對(duì)待拼接圖像的特征點(diǎn)進(jìn)行匹配。本實(shí)驗(yàn)中主要使用最近鄰和次近鄰法進(jìn)行匹配。
(4)在特征點(diǎn)匹配后對(duì)待匹配圖像進(jìn)行篩選,保留置信度較高的待拼接圖像用于接下來(lái)的操作。檢查經(jīng)篩選后的圖片數(shù)量是否依舊滿(mǎn)足要求(即大于等于2 張圖片)。
(5)對(duì)所有待拼接圖像進(jìn)行相機(jī)參數(shù)校正。本實(shí)驗(yàn)中使用光束平差法進(jìn)行相機(jī)參數(shù)校正,通過(guò)對(duì)求出的焦距取中值及所有圖片的焦距來(lái)構(gòu)建相機(jī)參數(shù)。
(6)由于光束平差法會(huì)引起波形效應(yīng),因此需要對(duì)圖像進(jìn)行波形矯正。
(7)為了避免圖像重疊部分出現(xiàn)明顯的邊緣,需要對(duì)待拼接圖像進(jìn)行曝光補(bǔ)償。
(8)對(duì)所有待拼接圖像進(jìn)行彎曲圖像和融合掩碼。
(9)為了防止圖像融合時(shí)出現(xiàn)裂縫或是重影,需要使用圖割法尋找重疊部分最相似的像素的連線(xiàn)(也稱(chēng)接縫線(xiàn))。
(10)完成上述操作后,釋放未使用的內(nèi)存進(jìn)行圖像融合。本實(shí)驗(yàn)使用多頻段融合。
圖1 多幅圖像拼接流程
對(duì)圖像拼接算法的移植,主要包括用于數(shù)據(jù)傳輸?shù)腘FS 文件系統(tǒng)以及用于顯示的Debian 桌面系統(tǒng)。
本案例將PC 機(jī)上運(yùn)行的虛擬機(jī)作為服務(wù)器,將開(kāi)發(fā)板上的系統(tǒng)作為客戶(hù)端。當(dāng)使用遠(yuǎn)端文件時(shí),只要使用mount 命令就可把遠(yuǎn)端虛擬機(jī)上的文件系統(tǒng)掛載在本地文件系統(tǒng)之下,并在開(kāi)發(fā)板的系統(tǒng)中對(duì)虛擬機(jī)文件系統(tǒng)中的文件進(jìn)行任意的讀寫(xiě)操作。
本案例中使用Petalinux 來(lái)完成Debian 桌面系統(tǒng)的配置。Petalinux 是一套開(kāi)發(fā)環(huán)境配置工具,能夠降低uboot、內(nèi)核、根文件系統(tǒng)的配置工作量,也可以利用Vivado 的導(dǎo)出硬件信息自動(dòng)完成相關(guān)軟件的配置。
本實(shí)驗(yàn)實(shí)現(xiàn)圖像拼接算法的硬件平臺(tái)結(jié)構(gòu)圖如圖2所示。兩片DDR3 DRAM 為圖像拼接算法的實(shí)現(xiàn)提供了足夠的內(nèi)存空間。SD 卡用于ZYNQ 芯片BOOT 程序、Linux 操作系統(tǒng)內(nèi)核、文件系統(tǒng)、圖像拼接算法程序以及待處理的圖片文件存儲(chǔ)。PC 主機(jī)可使用USB轉(zhuǎn)串口對(duì)開(kāi)發(fā)板的系統(tǒng)進(jìn)行調(diào)試。通過(guò)路由器連接主機(jī)和開(kāi)發(fā)板,使主機(jī)和開(kāi)發(fā)板位于同一網(wǎng)段,使用NFS服務(wù)掛載圖像拼接所需要的相關(guān)庫(kù)。開(kāi)發(fā)板的 PS(processing system)部分通過(guò)讀取并運(yùn)行SD 卡中的程序,實(shí)現(xiàn)圖像拼接。由于在PS 部分搭建了可視化的Debian 桌面系統(tǒng),因此可以通過(guò)鍵盤(pán)和鼠標(biāo)訪問(wèn)拼接完成的圖像文件,通過(guò)PL(programmable logic)端的HDMI 接口輸出至HDMI 顯示器進(jìn)行顯示。通過(guò)以上步驟可在硬件平臺(tái)上實(shí)現(xiàn)圖像拼接算法。
圖2 圖像拼接硬件實(shí)現(xiàn)結(jié)構(gòu)圖
圖像拼接實(shí)驗(yàn)旨在使學(xué)生學(xué)習(xí)如何在ZYNQ 平臺(tái)下實(shí)現(xiàn)算法,側(cè)重于在ZYNQ 開(kāi)發(fā)板上調(diào)用OpenCV庫(kù)以實(shí)現(xiàn)和運(yùn)行算法[9]。
實(shí)驗(yàn)開(kāi)始前,教師對(duì)本次實(shí)驗(yàn)涉及的算法原理及在C++環(huán)境中的實(shí)現(xiàn)方法進(jìn)行講解,介紹所使用到的平臺(tái)和工具,包括網(wǎng)絡(luò)文件系統(tǒng)和Debian 桌面系統(tǒng)。為了使學(xué)生掌握在ZYNQ 平臺(tái)中實(shí)現(xiàn)圖像拼接的算法,教師應(yīng)在實(shí)驗(yàn)中指導(dǎo)學(xué)生進(jìn)行平臺(tái)搭建和參數(shù)設(shè)置。本次實(shí)驗(yàn)共6 學(xué)時(shí),前4 學(xué)時(shí)主要進(jìn)行圖像拼接程序的編寫(xiě),后2 學(xué)時(shí)主要進(jìn)行硬件實(shí)現(xiàn)。
學(xué)生首先應(yīng)在Visual Studio 環(huán)境中編寫(xiě)圖像拼接程序,對(duì)圖像拼接流程逐一進(jìn)行實(shí)現(xiàn)。其中包括特征點(diǎn)檢測(cè)、特征點(diǎn)匹配、計(jì)算圖像變換矩陣、圖像模型變化以及圖像融合等。圖像拼接程序運(yùn)行情況和結(jié)果如圖3、圖4 所示。
圖3 待拼接圖像
圖4 VS2017 拼接后的圖像
在算法移植過(guò)程中,首先需要在Linux 環(huán)境下實(shí)現(xiàn)圖像拼接算法[10],以便將其移植到ZYNQ 平臺(tái)的PS 部分[11]。如圖5 所示,在Linux 環(huán)境下實(shí)現(xiàn)圖像拼接算法主要有三個(gè)步驟。首先需要搭建Linux 編譯環(huán)境[12];其次,需要配置Linux 版本的OpenCV 庫(kù);最后在Linux 版的QT 中實(shí)現(xiàn)Image Stitching 圖像拼接算法。
圖5 Linux 下的圖像拼接算法實(shí)現(xiàn)流程
在Linux 版的QT 中實(shí)現(xiàn)Image Stitching 圖像拼接算法后,需要將算法程序移植到硬件平臺(tái)中[13],移植過(guò)程主要包括搭建硬件平臺(tái)和在硬件平臺(tái)對(duì)硬件算法進(jìn)行調(diào)試兩個(gè)步驟,如圖6 所示,硬件實(shí)現(xiàn)流程主要包括搭建Debian 桌面系統(tǒng)、使用Petalinux 配置HDMI 顯示及配置NFS 服務(wù)。
將進(jìn)行圖像拼接后的圖片文件保存在文件系統(tǒng)中,待拼接圖像及拼接結(jié)果如圖7、圖8 所示,拼接結(jié)果為1920×1080。
圖6 硬件平臺(tái)實(shí)現(xiàn)流程圖
圖7 待拼接圖像
圖8 8 圖拼接結(jié)果
本文介紹了基于ZYNQ 平臺(tái)的圖像拼接實(shí)驗(yàn)案例。該實(shí)驗(yàn)綜合鍛煉了學(xué)生的軟件編程能力及硬件設(shè)計(jì)和調(diào)試能力[14-15],較以往實(shí)驗(yàn)課程的綜合性和難度均有所提高。學(xué)習(xí)本實(shí)驗(yàn)課的學(xué)生需要具備一定的理論基礎(chǔ),如需具有一定的圖像處理知識(shí),能夠用C、C++語(yǔ)言、硬件描述語(yǔ)言進(jìn)行編程[16],且對(duì)計(jì)算機(jī)操作系統(tǒng)有一定了解。該實(shí)驗(yàn)案例還具有很強(qiáng)的拓展性[17],學(xué)生在熟悉相關(guān)實(shí)驗(yàn)流程后,可以自行探索優(yōu)化手段。通過(guò)該實(shí)驗(yàn),有利于培養(yǎng)學(xué)生的自主學(xué)習(xí)能力和創(chuàng)新能力,達(dá)到了良好的教學(xué)效果。