FPGA實現(xiàn)圖像去霧 基于暗通道先驗算法 純verilog代碼加速 提供3套工程源碼和技術(shù)支持
1、前言
沒玩過圖像縮放和視頻拼接都不好意思說自己玩兒過FPGA,這是CSDN某大佬說過的一句話,鄙人深信不疑。。。本文詳細描述了FPGA實現(xiàn)圖像去霧的實現(xiàn)設(shè)計方案,視頻輸入源有兩種,一種是板載的HDMI輸入接口,采用silicon9011芯片解碼為RGB,另一種是廉價的ov5640攝像頭;FPGA采集到輸入視頻后會進行圖像去霧操作,圖像去霧模塊采用暗通道先驗算法實現(xiàn),利用verilog并行執(zhí)行的特點對算法進行了加速;,再經(jīng)過圖像緩存后輸出顯示器,以驗證圖像去霧算法在FPGA中加速的正確性;提供3套vivado2019.1版本的工程源碼,3套工程區(qū)別和詳情如下:
vivado工程1:FPGA型號為Xilinx A7 xc7a35tfgg484-2,視頻輸入為HDMI,視頻輸出為HDMI;
vivado工程2:FPGA型號為Xilinx A7 xc7a35tfgg484-2,視頻輸入為ov5640,視頻輸出為HDMI;
vivado工程3:FPGA型號為Xilinx Zynq7020 xc7z020clg400-2,視頻輸入為ov5640,視頻輸出為HDMI;
工程代碼編譯通過后上板調(diào)試驗證,文章末尾有演示視頻,可直接項目移植,適用于在校學(xué)生、研究生,也適用于在職工程師做項目開發(fā),可應(yīng)用于醫(yī)療、軍工等行業(yè)的數(shù)字成像和圖像傳輸領(lǐng)域;
提供完整的、跑通的工程源碼和技術(shù)支持;
工程源碼和技術(shù)支持的獲取方式放在了文章末尾,請耐心看到最后。
版本更新說明
此版本為第2版,根據(jù)讀者的建議,對第1版工程做了如下改進和更新:
1:優(yōu)化了FDMA緩存架構(gòu)的源碼;
2:新增了Zynq7020 版本工程;
免責(zé)聲明
本工程及其源碼即有自己寫的一部分,也有網(wǎng)絡(luò)公開渠道獲取的一部分(包括CSDN、Xilinx官網(wǎng)、Altera官網(wǎng)等等),若大佬們覺得有所冒犯,請私信批評教育;基于此,本工程及其源碼僅限于讀者或粉絲個人學(xué)習(xí)和研究,禁止用于商業(yè)用途,若由于讀者或粉絲自身原因用于商業(yè)用途所導(dǎo)致的法律問題,與本博客及博主無關(guān),請謹(jǐn)慎使用。。。
2、目前我這里已有的圖像處理方案
目前我這里已有的圖像處理方案有很多,包括圖像縮放、圖像拼接、圖像旋轉(zhuǎn)、圖像識別跟蹤、圖像去霧等等,所有工程均在自己的板子上跑通驗證過,保證代碼的可靠性,對圖像處理感興趣或有項目需求的兄弟可以參考我的圖像處理專欄,里面包含了上述工程源碼的詳細設(shè)計方案和驗證視頻演示:直接點擊前往
3、暗通道先驗算法介紹
暗通道先驗算法介紹可以百度一下或者csdn或者知乎搜一下看看,專業(yè)的講解我不擅長,我只擅長用fpga實現(xiàn)算法,專業(yè)講原理的大佬比我講得好,這里可以推薦一篇閱讀量很大的文章:直接點擊前往
4、本圖像去霧模塊的優(yōu)缺點
優(yōu)點1:純verilog代碼實現(xiàn),無任何IP,可在xilinx、altera、國產(chǎn)FPGA等平臺間自由移植;
優(yōu)點2:算法加速,利用了FPGA并行計算的特點;
優(yōu)點3:提供了2套工程源碼,對接不同的視頻輸入接口;
缺點1:算法還不夠完美,去霧效果也不完美,個人覺得;待我優(yōu)化;
缺點2:用于驗證、學(xué)習(xí)、課題等可以,做實際產(chǎn)品還不理想;
缺點3:對輸入的圖像要求稍微有點高,那種色差太過嚴(yán)重的去霧效果不好,我測試的這個視頻作為輸入源去霧效果是可以的的,兄弟們可以把這個視頻作為輸入源:點擊查看來源
5、詳細設(shè)計方案
本文詳細描述了FPGA實現(xiàn)圖像去霧的實現(xiàn)設(shè)計方案,視頻輸入源有兩種,一種是板載的HDMI輸入接口,采用silicon9011芯片解碼為RGB,另一種是廉價的ov5640攝像頭;FPGA采集到輸入視頻后會進行圖像去霧操作,圖像去霧模塊采用暗通道先驗算法實現(xiàn),利用verilog并行執(zhí)行的特點對算法進行了加速;,再經(jīng)過圖像緩存后輸出顯示器,以驗證圖像去霧算法在FPGA中加速的正確性;設(shè)計框圖如下:
視頻輸入
vivado工程1的視頻輸入為HDMI,使用筆記本電腦模擬視頻源,即將筆記本電腦通過HDMI線連接到FPGA開發(fā)板的HDMI輸入接口,輸入視頻分辨率為1920x1080@60Hz,HDMI視頻解碼方式為silicon9011芯片解碼,即silicon9011將輸入的HDMI視頻解碼為RGB視頻供FPGA使用,silicon9011芯片需要i2c配置才能使用,請參考我之前關(guān)于silicon9011和silicon9134芯片驅(qū)動的詳細講解:直接點擊前往
vivado工程2的視頻輸入為ov5640,DVP接口,輸入視頻分辨率為1280x720@30Hz;
vivado工程3的視頻輸入為ov5640,DVP接口,輸入視頻分辨率為1280x720@30Hz;
圖像去霧
圖像去霧模塊由純verilog代碼實現(xiàn),采用暗通道先驗算法理論,由3個模塊順序執(zhí)行,3個模塊內(nèi)部并行執(zhí)行,實現(xiàn)了FPGA加速算法的目的,分別由求RGB最小值模塊、求折射率模塊、圖像去霧組成;
求RGB最小值的目的是實時的比較求出每個像素點RGB分量的最小值,也就是暗通道,該模塊頂層接口如下:
求折射率的目的是輸出暗通道最大值和折射率,該模塊頂層接口如下:
該模塊有個i_thre輸入接口,該接口為閾值,初始值為26,vivado工程1和vivado工程2通過外接串口動態(tài)控制,vivado工程3通過VIO動態(tài)控制;
圖像去霧的目的是輸出暗通道最大值和折射率,該模塊頂層接口如下:
三個模塊整合封裝后的圖像去霧模塊接口如下:
圖像緩存
vivado工程1和vivado工程2采用FDMA圖像緩存架構(gòu)實現(xiàn)圖像緩存,即將圖像寫入DDR3種緩存三幀后再讀出來,F(xiàn)DMA圖像緩存架構(gòu)詳情,請參考我之前關(guān)于FDMA的詳細講解:直接點擊前往
串口解析
vivado工程1和vivado工程2用外接串口動態(tài)控制圖像去霧模塊的參數(shù),串口采用數(shù)據(jù)幀的方式發(fā)送和解析,這我常用的板間通信控制方案,詳情請參考我之前關(guān)于串口解析的詳細講解:直接點擊前往
串口解析模塊的作用是用電腦發(fā)送命令控制圖像去霧模塊的輸入閾值,這個閾值的初始值為十進制26,如果你在使用過程中覺得圖像去霧效果不好,可以將這個閾值調(diào)大或者調(diào)小,我這里通過串口調(diào)試助手設(shè)置了多種閾值進行調(diào)整,如下:
比如要發(fā)送閾值為26,則發(fā)送控制命令如下:
aa bb 00 00 00 1a 1a cc dd;
要發(fā)送閾值為251,則發(fā)送控制命令如下:
aa bb 00 00 00 fb fb cc dd;
視頻輸出
vivado工程1的視頻輸出為HDMI,輸出視頻分辨率為1920x1080@60Hz,HDMI視頻編碼方式為silicon9134芯片解碼,即silicon9134將輸入的RGB視頻編碼為HDMI視頻輸出,silicon9134芯片需要i2c配置才能使用,請參考我之前關(guān)于silicon9011和silicon9134芯片驅(qū)動的詳細講解:直接點擊前往
vivado工程2的視頻輸出為HDMI,輸出視頻分辨率為1920x1080@60Hz,HDMI視頻編碼方式為silicon9134芯片解碼;
vivado工程3的視頻輸出為HDMI,HDMI視頻編碼方式為純verilog代碼實現(xiàn)的HDMI輸出模塊,輸出視頻分辨率為1280x720@60Hz;
6、vivado工程1詳解
開發(fā)板FPGA型號:Xilinx Artix7 xc7a35tfgg484-2;
開發(fā)環(huán)境:vivado2019.1;
輸入:HDMI,分辨率1920x1080@60Hz;
輸出:HDMI,分辨率1920x1080@60Hz;
工程Block Design如下:
工程代碼架構(gòu)如下:
FPGA資源消耗和功耗預(yù)估如下:
7、vivado工程2詳解
開發(fā)板FPGA型號:Xilinx Artix7 xc7a35tfgg484-2;
開發(fā)環(huán)境:vivado2019.1;
輸入:ov5640攝像頭,分辨率1280x720@30Hz;
輸出:HDMI,分辨率1920x1080@60Hz;
工程Block Design如下:
工程代碼架構(gòu)如下:
FPGA資源消耗和功耗預(yù)估如下:
8、vivado工程3詳解
開發(fā)板FPGA型號:Xilinx Zynq7020 xc7z020clg400-2;
開發(fā)環(huán)境:vivado2019.1;
輸入:ov5640攝像頭,分辨率1280x720@30Hz;
輸出:HDMI,分辨率1280x720@30Hz;
工程Block Design如下:
工程代碼架構(gòu)如下:
FPGA資源消耗和功耗預(yù)估如下:
SDK軟件工程代碼架構(gòu)如下:
SDK軟件主函數(shù)代碼如下:
#include "I2C_16bit.h"
#include "xiicps.h"
#include "xil_io.h"
#include "xparameters.h"
#include "helai_vdma.h"
#include "xscugic.h"
#define VDMA0_BASEADDR XPAR_AXI_VDMA_0_BASEADDR
#define VIDEO0_BASEADDR0 0x01000000
#define VIDEO0_BASEADDR1 0x02000000
#define VIDEO0_BASEADDR2 0x03000000
#define H_ACTIVE 1280
#define V_ACTIVE 720
#define H_STRIDE 1280
XIicPs Iic;
XScuGic Intc; //中斷控制器驅(qū)動程序?qū)嵗?/span>
void main()
{
I2C_config_init(); //ov5640 配置完成
helai_vdma(VDMA0_BASEADDR,VIDEO0_BASEADDR0,VIDEO0_BASEADDR1,VIDEO0_BASEADDR2,H_ACTIVE,V_ACTIVE,H_STRIDE); // VDMA1 配置完成
while (1) ;
}
9、工程移植說明
vivado版本不一致處理
1:如果你的vivado版本與本工程vivado版本一致,則直接打開工程;
2:如果你的vivado版本低于本工程vivado版本,則需要打開工程后,點擊文件–>另存為;但此方法并不保險,最保險的方法是將你的vivado版本升級到本工程vivado的版本或者更高版本;
3:如果你的vivado版本高于本工程vivado版本,解決如下:
打開工程后會發(fā)現(xiàn)IP都被鎖住了,如下:
此時需要升級IP,操作如下:
FPGA型號不一致處理
如果你的FPGA型號與我的不一致,則需要更改FPGA型號,操作如下:
更改FPGA型號后還需要升級IP,升級IP的方法前面已經(jīng)講述了;
其他注意事項
1:由于每個板子的DDR不一定完全一樣,所以MIG IP需要根據(jù)你自己的原理圖進行配置,甚至可以直接刪掉我這里原工程的MIG并重新添加IP,重新配置;
2:根據(jù)你自己的原理圖修改引腳約束,在xdc文件中修改即可;
3:純FPGA移植到Zynq需要在工程中添加zynq軟核;
10、上板調(diào)試驗證
這里僅以vivado工程1做輸出演示:
靜態(tài)展示:
動態(tài)視頻演示:
圖像去霧文章來源:http://www.zghlxwxcb.cn/news/detail-429069.html
測試視頻中的原始帶霧視頻來源: 點擊查看來源
11、福利:工程源碼獲取
福利:工程代碼的獲取
代碼太大,無法郵箱發(fā)送,以某度網(wǎng)盤鏈接方式發(fā)送;
資料如下:獲取方式:私,或者文章結(jié)尾的V名片;
三套vivado工程中圖像去霧模塊源碼位置分別如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-429069.html
到了這里,關(guān)于FPGA實現(xiàn)圖像去霧 基于暗通道先驗算法 純verilog代碼加速 提供2套工程源碼和技術(shù)支持的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!