圖像旋轉的FPGA實現(一)


  繼續圖像處理專題,這次寫的是圖像旋轉。若要說小分辨率的圖像旋轉倒也簡單,直接將原始圖像存儲在BRAM中,然后按照旋轉后的位置關系取出便是。但是對於高分辨的圖像(720P及以上)就必須得用DDR3或者DDR4緩存了,而DDR是突發傳輸,對連續視頻流十分友好。所以在旋轉180°時倒也問題不大,但是若旋轉90°或者270°的話,每取出一個數據,

就要跨行一次,而DDR跨行傳輸的效率極低,經測量大概是10%左右,根本無法滿足實時性要求。

  那么,又該怎么解決旋轉90°或者270°DDR傳輸效率低的問題呢?我查閱了大量資料,有一種方法是改用sram存儲圖像,這樣便沒有跨行傳輸效率低下的問題。但是現在FPGA的開發板普遍帶的是DDR,也沒有必要為了圖像旋轉這個功能重新設計電路,增加sram芯片。另一種方法則是改變DDR讀寫圖像的方式,這里也有兩種方案。方案1是對DDR進行分塊,DDR的一塊存儲一行有效圖像數據,這樣就使得DDR跨行次數減少。同時由於DDR位寬大於像素數據位寬,所以每讀取一個數據就能獲得數個像素點,可供幾次旋轉90°或者270°使用。

方案2是對圖像進行分塊,寫入DDR時按照分塊尺寸對應關系,每一行寫入一個分塊,這個方法同樣會使得旋轉操作后讀取DDR跨行變少。有些人或許就會疑問,連續的視頻流怎么分塊呢?視頻的確是連續進入的,可是我們可以控制寫入的地址,假如分辨率是1920*1080,分塊是192*10,那么在DDR寫到192-8地址時,就直接跳轉到0+DDR列長度處了,進而實現DDR的一塊存儲原圖像的一行數據。

  這里的話,我選擇的是第一種方案,即DDR的一塊存儲原圖像一行有效數據,並在720P和1080P各種制式下驗證通過,具體實現細節見下一篇博客。

       事實上,我只實現了直角旋轉,即旋轉90°,旋轉180°,旋轉270°。而想實現任意角度旋轉的話則思路一致,即重新排列圖像寫入DDR順序,使得讀DDR跨行操作次數降低,而關於這一點,萬方上有一篇名叫“基於FPGA的數字圖像旋轉引擎設計”(李傑明)的論文,大家有興趣的可以去查閱觀看。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM