陳 怡,張 萌
(電子科技大學 電子薄膜與集成器件國家重點實驗室,四川 成都 610054)
近年來,物聯(lián)網(wǎng)技術(shù)高速發(fā)展,已成為各國的發(fā)展戰(zhàn)略,受到高度重視。在物聯(lián)網(wǎng)的應(yīng)用和實現(xiàn)過程中,條碼技術(shù)(可分為一維條碼和二維條碼)是信息識別領(lǐng)域最為重要和關(guān)鍵的技術(shù)之一。如今二維條碼技術(shù)已經(jīng)在物流、通信和工業(yè)領(lǐng)域中得到了廣泛應(yīng)用[1]。
因圖像采集環(huán)境復(fù)雜多變,采集到的二維碼必須進行圖像處理才能達到理想的識別率。二維碼圖像預(yù)處理包括灰度化、濾波去噪、二值化、圖像旋轉(zhuǎn)和圖像去光照等步驟。由于通過攝像頭采集到的圖像或多或少都會有一定的歪斜,所以將圖像旋轉(zhuǎn)端正對二維碼圖像識別來說是必不可少的[2-3]。
本文基于CORDIC算法,設(shè)計了一種高速流水線的圖像旋轉(zhuǎn)算法。算法只包含加法和移位操作,在FPGA上的驗證結(jié)果表明,本設(shè)計的電路精度高,速度快,可以適用于實時二維碼圖像識別。
在本系統(tǒng)中,圖像采集采用OV7620攝像頭。OV7620是一種CMOS圖像傳感器,具有軟件可編程性,可以通過SCCB總線協(xié)議進行其工作模式的配置,被廣泛應(yīng)用在網(wǎng)絡(luò)攝像頭、攝像手機等產(chǎn)品中。首先基于SCCB協(xié)議的寄存器配置電路對OV7620進行初始化,然后設(shè)計了攝像頭圖像采集程序,通過SRAM控制器將采集到的圖像存入SRAM中,并在LCD上實時顯示出來。攝像頭采集與顯示框圖如圖1所示。
由于受采集環(huán)境、攝像頭和圖像采集者等多種因素的影響,采集到的二維碼圖像一般都會有一定的歪斜。要將二維碼圖像旋轉(zhuǎn)端正,首先需要知道二維碼圖像歪斜的角度。QR碼圖像在左上角、左下角和右上角各有一個位置探測圖形,每個位置探測圖形可以看作是由3個重疊且同心的正方形組成,它們分別為7×7個深色模塊、5×5個淺色模塊和 3×3個深色模塊。如圖 2所示,位置探測圖形的模塊寬度比為 1:1:3:1:1。符號中其他地方遇到類似圖形的可能性極小,因此可以通過掃描整個二維碼圖像找出3個位置探測圖形,根據(jù)3個位置探測圖形的相對位置判斷出圖像的歪斜角度。
設(shè)(x,y)為將原圖像旋轉(zhuǎn)角度θ后的新坐標,(x′,y′)為原圖像中的對應(yīng)坐標,則(x,y)與(x′,y′)的對應(yīng)關(guān)系為:
由式(2)只能計算出特定角度(arctan2-i)的旋轉(zhuǎn)坐標。CORDIC算法的原理是任何角度都可以通過n個arctan2-i形式的微小角度相加來無限接近??梢胱兞縵表示每次旋轉(zhuǎn)的方向,z的初始值為圖像需要旋轉(zhuǎn)的角度,則式(2)可以變?yōu)椋?/p>
式(3)為CORDIC算法的基本旋轉(zhuǎn)公式??梢钥闯?,CORDIC算法是由一系列簡單的移位和加法操作組成的。它實際上是一種逐次逼近的坐標旋轉(zhuǎn)方法,每次旋轉(zhuǎn)都使累加的旋轉(zhuǎn)角度之和與目標旋轉(zhuǎn)角更接近。迭代次數(shù)n越大,旋轉(zhuǎn)的角度就與真實的角度越接近。在實際應(yīng)用中,受硬件資源限制,不可能迭代很多次。實際上,對于n次迭代,CORDIC算法的旋轉(zhuǎn)精度為arctan2-(n-1)。當 n=8時,旋轉(zhuǎn)精度可達 0.447 6°,滿足實際應(yīng)用的需要[4]。
在式(3)中,每次迭代運算后都需要與ki進行一次乘法,n次迭代運算就需要進行n次乘法,這將十分消耗硬件資源。在實際操作中,一般都是在n次迭代過后再乘上,這是一個收斂函數(shù),由此可見基本的旋轉(zhuǎn)改變了矢量的模長,需要用k(n)進行校正。當n趨于無窮大時,k(n)趨近于一個固定值0.607 25。這種直接在流水線結(jié)構(gòu)之后附加乘法器的實現(xiàn)方法使原本由移位器和加法器組成的整體結(jié)構(gòu)變得不規(guī)則,同時乘法器占用很大資源且會降低整個流水線的吞吐率。因此,提出一種CORDIC模校正方法來避免在硬件中引入乘法器。
整個系統(tǒng)包括求取角度單元、地址產(chǎn)生單元、數(shù)據(jù)準備單元、時鐘分頻單元、CORDIC單元、雙線性插值單元和存儲單元,系統(tǒng)框圖如圖3所示。求取角度單元對存儲在RAM中的圖像像素值進行掃描,通過設(shè)計的狀態(tài)機求得圖像歪斜的角度;地址產(chǎn)生單元將原圖像中的地址依次傳給CORDIC單元;CORDIC單元接收地址以及歪斜角度,通過13級流水線(8級CORDIC變換流水線和5級模校正流水線)求得旋轉(zhuǎn)過后的新坐標的整數(shù)部分和小數(shù)部分;數(shù)據(jù)準備單元根據(jù)CORDIC單元求出的新坐標的整數(shù)部分計算出其最鄰近的4個像素點的像素值,并將這些像素值與新坐標的小數(shù)部分一起傳給雙線性插值單元,計算出新坐標的像素值。
由于計算過程中包含小數(shù),所以在硬件結(jié)構(gòu)中將原始數(shù)據(jù)左移8位進行擴張,在CORDIC單元最后將計算得到的數(shù)據(jù)的低8位提取出來作為小數(shù)部分即可。
本實驗中設(shè)計了攝像頭采集程序以及液晶驅(qū)動程序。可以通過攝像頭實時采集圖像;將采集到的圖像通過灰度化、中值濾波和二值化處理后,存入SRAM中;隨后電路開始讀取SRAM中的圖像并求出歪斜角度,通過圖像旋轉(zhuǎn)電路將圖像旋轉(zhuǎn)端正。整個設(shè)計全部采用Verilog HDL語言編寫。采用 Synplify Pro、Quartus II 9.1和Modelsim 6.5SE仿真和實現(xiàn)了整個設(shè)計,并在DE2開發(fā)板上對本設(shè)計進行了驗證。
通過實驗結(jié)果可知,電路最大工作頻率可以達到90.9 MHz;整個系統(tǒng)消耗了1 289個組合邏輯單元和483個寄存器單元;求得一個旋轉(zhuǎn)過后的像素值需要6個時鐘周期,因此本二維碼圖像旋轉(zhuǎn)系統(tǒng)處理640×480像素的圖像的幀率為49 f/s,該速度完全可以滿足實際要求。上述驗證結(jié)果表明,本設(shè)計的二維碼圖像旋轉(zhuǎn)系統(tǒng)具有速度快、復(fù)雜度低的特點。
[1]GHOSH I,MAJUMDAR B.Design of an application specific VLSI chip for image rotation[C].Calcutta:Proceedings of the Seventh International Conference on VLSI Design,1994:275-278.
[2]SUCHITRA S,LAM S K,SRIKANTHAN T.Novel schemes for high-throughput image rotation[C].Singapore:Conference Record of the Thirty-Eighth Asilomar Conference on Signals,Systems and Computers,2004,2:1884-1888.
[3]Jiang Xiaogang,Zhou Jianyang,Shi Jianghong,et al.FPGA implementation of image rotation using modified compensated CORDIC[C].6th International Conference on ASIC,2005:752-756.
[4]李杰明,鄭學仁.基于CORDIC算法的數(shù)字圖像旋轉(zhuǎn)實現(xiàn)[J].電子技術(shù)應(yīng)用,2009,35(6):72-74.