于 蕾,李欣澤,侯長波
(1. 哈爾濱工程大學 信息與通信工程學院 電工電子國家級實驗示范中心,黑龍江 哈爾濱 150000;2. 哈爾濱工程大學 信息與通信工程學院,黑龍江 哈爾濱 150000)
傳統的 “電子系統設計實驗” 課程中所采用的FPGA 芯片功能較單一,需要使用專用的硬件描述語言(Verilog HDL 或者VHDL),擅長C 語言或者嵌入式系統編程的工程師往往需要重新入門學習,不利于擴展后續功能[1]。在市場需求的推動下,為了滿足下一代應用處理的需求,Xilinx推出了ZYNQ系列產品[2],ARM+FPGA 體系結構能夠在芯片上提供軟、硬件和I/O 可編程功能[3]。因此,對電子系統設計實驗課程進行內容更新就成為必然要求。課程組對 “電子系統設計實驗”課程體系進行了改革,引入了ZYNQ 平臺[4]。
本實驗案例基于ZYNQ 平臺設計了一個圖像拼接系統,為“電子系統設計實驗”提供了實驗教學素材[5]。要求學生通過學習實驗案例,重點掌握如何基于ZYNQ 平臺實現圖像拼接算法。其中,算法功能是依托ZYNQ 的ARM 部分通過C++語言以及OpenCV 實現的[6],而圖像拼接結果的顯示是通過搭建Debian 桌面系統、對FPGA 部分的HDMI 接口進行配置和驅動來實現的。
在實驗先導課中,學生能夠學習使用ZYNQ 進行開發設計的全過程和基本概念,了解ZYNQ 學習的常用方法。在搭建硬件實現平臺和算法移植的過程中,能夠培養學生解決在ZYNQ 設計、調試過程中出現的問題的能力,為學生今后學習使用ZYNQ 進行軟硬件協同設計和開發方面的工作打下良好基礎。
為了避免學生局限于相關圖像處理理論知識而無法完成電子系統設計實驗內容的情況,本實驗采用了Image Stitching 算法[7]。Image Stitching 算法是一種為了解決相機鏡頭廣角有限問題而設計的開源圖像拼接算法。
如圖1 所示,使用Stitching_ detail 進行多幅圖像拼接的大致流程如下。
(1)對待拼接圖像進行尺寸縮放等預處理。
(2)使用ORB 算法對待拼接圖像進行特征點檢測并進行特征點描述[8]。
(3)對待拼接圖像的特征點進行匹配。本實驗中主要使用最近鄰和次近鄰法進行匹配。
(4)在特征點匹配后對待匹配圖像進行篩選,保留置信度較高的待拼接圖像用于接下來的操作。檢查經篩選后的圖片數量是否依舊滿足要求(即大于等于2 張圖片)。
(5)對所有待拼接圖像進行相機參數校正。本實驗中使用光束平差法進行相機參數校正,通過對求出的焦距取中值及所有圖片的焦距來構建相機參數。
(6)由于光束平差法會引起波形效應,因此需要對圖像進行波形矯正。
(7)為了避免圖像重疊部分出現明顯的邊緣,需要對待拼接圖像進行曝光補償。
(8)對所有待拼接圖像進行彎曲圖像和融合掩碼。
(9)為了防止圖像融合時出現裂縫或是重影,需要使用圖割法尋找重疊部分最相似的像素的連線(也稱接縫線)。
(10)完成上述操作后,釋放未使用的內存進行圖像融合。本實驗使用多頻段融合。

圖1 多幅圖像拼接流程
對圖像拼接算法的移植,主要包括用于數據傳輸的NFS 文件系統以及用于顯示的Debian 桌面系統。
本案例將PC 機上運行的虛擬機作為服務器,將開發板上的系統作為客戶端。當使用遠端文件時,只要使用mount 命令就可把遠端虛擬機上的文件系統掛載在本地文件系統之下,并在開發板的系統中對虛擬機文件系統中的文件進行任意的讀寫操作。
本案例中使用Petalinux 來完成Debian 桌面系統的配置。Petalinux 是一套開發環境配置工具,能夠降低uboot、內核、根文件系統的配置工作量,也可以利用Vivado 的導出硬件信息自動完成相關軟件的配置。
本實驗實現圖像拼接算法的硬件平臺結構圖如圖2所示。兩片DDR3 DRAM 為圖像拼接算法的實現提供了足夠的內存空間。SD 卡用于ZYNQ 芯片BOOT 程序、Linux 操作系統內核、文件系統、圖像拼接算法程序以及待處理的圖片文件存儲。PC 主機可使用USB轉串口對開發板的系統進行調試。通過路由器連接主機和開發板,使主機和開發板位于同一網段,使用NFS服務掛載圖像拼接所需要的相關庫。開發板的 PS(processing system)部分通過讀取并運行SD 卡中的程序,實現圖像拼接。由于在PS 部分搭建了可視化的Debian 桌面系統,因此可以通過鍵盤和鼠標訪問拼接完成的圖像文件,通過PL(programmable logic)端的HDMI 接口輸出至HDMI 顯示器進行顯示。通過以上步驟可在硬件平臺上實現圖像拼接算法。

圖2 圖像拼接硬件實現結構圖
圖像拼接實驗旨在使學生學習如何在ZYNQ 平臺下實現算法,側重于在ZYNQ 開發板上調用OpenCV庫以實現和運行算法[9]。
實驗開始前,教師對本次實驗涉及的算法原理及在C++環境中的實現方法進行講解,介紹所使用到的平臺和工具,包括網絡文件系統和Debian 桌面系統。為了使學生掌握在ZYNQ 平臺中實現圖像拼接的算法,教師應在實驗中指導學生進行平臺搭建和參數設置。本次實驗共6 學時,前4 學時主要進行圖像拼接程序的編寫,后2 學時主要進行硬件實現。
學生首先應在Visual Studio 環境中編寫圖像拼接程序,對圖像拼接流程逐一進行實現。其中包括特征點檢測、特征點匹配、計算圖像變換矩陣、圖像模型變化以及圖像融合等。圖像拼接程序運行情況和結果如圖3、圖4 所示。

圖3 待拼接圖像

圖4 VS2017 拼接后的圖像
在算法移植過程中,首先需要在Linux 環境下實現圖像拼接算法[10],以便將其移植到ZYNQ 平臺的PS 部分[11]。如圖5 所示,在Linux 環境下實現圖像拼接算法主要有三個步驟。首先需要搭建Linux 編譯環境[12];其次,需要配置Linux 版本的OpenCV 庫;最后在Linux 版的QT 中實現Image Stitching 圖像拼接算法。

圖5 Linux 下的圖像拼接算法實現流程
在Linux 版的QT 中實現Image Stitching 圖像拼接算法后,需要將算法程序移植到硬件平臺中[13],移植過程主要包括搭建硬件平臺和在硬件平臺對硬件算法進行調試兩個步驟,如圖6 所示,硬件實現流程主要包括搭建Debian 桌面系統、使用Petalinux 配置HDMI 顯示及配置NFS 服務。
將進行圖像拼接后的圖片文件保存在文件系統中,待拼接圖像及拼接結果如圖7、圖8 所示,拼接結果為1920×1080。

圖6 硬件平臺實現流程圖

圖7 待拼接圖像

圖8 8 圖拼接結果
本文介紹了基于ZYNQ 平臺的圖像拼接實驗案例。該實驗綜合鍛煉了學生的軟件編程能力及硬件設計和調試能力[14-15],較以往實驗課程的綜合性和難度均有所提高。學習本實驗課的學生需要具備一定的理論基礎,如需具有一定的圖像處理知識,能夠用C、C++語言、硬件描述語言進行編程[16],且對計算機操作系統有一定了解。該實驗案例還具有很強的拓展性[17],學生在熟悉相關實驗流程后,可以自行探索優化手段。通過該實驗,有利于培養學生的自主學習能力和創新能力,達到了良好的教學效果。