FPGA高端項(xiàng)目:FPGA幀差算法圖像識別+目標(biāo)跟蹤,提供9套工程源碼和技術(shù)支持
1、前言
本設(shè)計使用Xilinx系列FPGA實(shí)現(xiàn)幀差算法圖像識別+目標(biāo)跟蹤,提供vivado2019.1版本的工程源碼共計9套,詳情見下表:
視頻輸入源由多種方案可供選擇,既有廉價的OV5640、OV7725攝像頭,也有高分辨率的HDMI輸入,我使用了筆記本電腦充當(dāng)HDMI輸入源接入FPGA開發(fā)板;FPGA采集到輸入視頻后,首先使用本博常用的FDMA圖像緩存架構(gòu)將視頻緩存到DDR3,作為“第一幀視頻”的存放點(diǎn);然后讀出第一幀做RGB轉(zhuǎn)灰度處理,得到的灰度圖像再調(diào)用一路FDMA圖像緩存架構(gòu)進(jìn)行緩存,作為“第二幀視頻”的存放點(diǎn);注意,前面說的“第一幀視頻”和“第二幀視頻”都是打了引號的,他指的是幀差算法的第一和第二幀;然后將兩幀視頻做幀差處理,得到幀差的視頻,即得到了運(yùn)動的目標(biāo)視頻;然后經(jīng)過中值濾波、圖像腐蝕、圖像膨脹、圖像畫框等一系列操作,即得到了被框出來的運(yùn)動的目標(biāo)圖像;然后經(jīng)過HDMI發(fā)送模塊,將視頻輸出顯示器顯示即可;
本文詳細(xì)描述了Xilinx的FPGA幀差算法圖像識別+目標(biāo)跟蹤,工程代碼編譯通過后上板調(diào)試驗(yàn)證,可直接項(xiàng)目移植,適用于在校學(xué)生做畢業(yè)設(shè)計、研究生項(xiàng)目開發(fā),也適用于在職工程師做項(xiàng)目開發(fā),可應(yīng)用于醫(yī)療、軍工等行業(yè)的數(shù)字成像和圖像傳輸領(lǐng)域;
提供完整的、跑通的工程源碼和技術(shù)支持;
工程源碼和技術(shù)支持的獲取方式放在了文章末尾,請耐心看到最后;
免責(zé)聲明
本工程及其源碼即有自己寫的一部分,也有網(wǎng)絡(luò)公開渠道獲取的一部分(包括CSDN、Xilinx官網(wǎng)、Altera官網(wǎng)等等),若大佬們覺得有所冒犯,請私信批評教育;基于此,本工程及其源碼僅限于讀者或粉絲個人學(xué)習(xí)和研究,禁止用于商業(yè)用途,若由于讀者或粉絲自身原因用于商業(yè)用途所導(dǎo)致的法律問題,與本博客及博主無關(guān),請謹(jǐn)慎使用。。。
2、詳細(xì)設(shè)計方案
設(shè)計原理框圖
工程源碼設(shè)計原理框圖如下:
運(yùn)動目標(biāo)檢測原理
運(yùn)動目標(biāo)檢測原理:先將RGB圖像轉(zhuǎn)為灰度圖只取亮度分量y,如果一個物體是運(yùn)動的,那么前后兩張或幾張灰度圖的同一位置的像素值應(yīng)該是變化的,試想,如果是靜止物體,比如一幅畫,那么任意時刻,同一位置像素點(diǎn)的值不變才對,如果運(yùn)動了,像素點(diǎn)的值自然也就改變了,很好理解,這個叫做幀差算法,這里的像素點(diǎn)差值有個范圍,叫做閾值,cdn上有大佬說70~100是理想值。
輸入視頻
視頻輸入源由多種方案可供選擇,既有廉價的OV5640、OV7725攝像頭,也有高分辨率的HDMI輸入,我使用了筆記本電腦充當(dāng)HDMI輸入源接入FPGA開發(fā)板;
工程源碼1、3、6、8使用OV5640攝像頭,ov5640需要i2c配置才能使用,需要i2c配置分辨率,然后將DVP接口的兩個時鐘一個像素的GRB565視頻數(shù)據(jù)采集為一個時鐘一個像素的RGB565或者RGB888視頻數(shù)據(jù);ov5640i2c配置及采集代碼如下:
工程源碼4、7、9使用OV7725攝像頭,OV7725需要i2c配置才能使用,需要i2c配置分辨率,然后將DVP接口的兩個時鐘一個像素的GRB565視頻數(shù)據(jù)采集為一個時鐘一個像素的RGB565或者RGB888視頻數(shù)據(jù);OV7725 i2c配置及采集代碼如下:
工程源碼2使用HDMI輸入源,我使用了筆記本電腦充當(dāng)HDMI輸入源接入FPGA開發(fā)板,HDMI解碼采用silcom9011芯片解碼方案,silcom9011需要i2c配置才能使用,需要i2c配置分辨率,i2c配置及采集代碼如下:
工程源碼5使用HDMI輸入源,我使用了筆記本電腦充當(dāng)HDMI輸入源接入FPGA開發(fā)板,HDMI解碼采用IT6802芯片解碼方案,IT6802需要i2c配置才能使用,需要i2c配置分辨率,i2c配置及采集代碼如下:
圖像緩存
使用本博常用的FDMA圖像緩存架構(gòu)將視頻緩存到DDR3,需要調(diào)用兩路FDMA才能實(shí)現(xiàn)幀差算法,關(guān)于FDMA,請參考我之前的博客,博客地址:點(diǎn)擊直接前往
FDMA圖像緩存架構(gòu)在Block Design中如下:
RGB轉(zhuǎn)灰度
圖像RGB轉(zhuǎn)灰度的目的是做幀差算法,因?yàn)榛叶葓D像只有8位,可以減少幀差的計算量,RGB轉(zhuǎn)灰度代碼如下:
幀差算法
利用圖像緩存模塊得到間隔的兩幀圖像,根據(jù)兩幀圖輸入進(jìn)來的Y分量,在圖像有效信號de期間,用后一幀圖像的Y分量減去前一幀圖像的Y分量得到差值,用差值與幀差閾值進(jìn)行比較得到幀差標(biāo)志,判定為是運(yùn)動跡象,根據(jù)幀差標(biāo)志將認(rèn)定為是有變化的像素點(diǎn)賦白色像素值,其余賦黑色像素點(diǎn),如此一來,得到的圖像就是只有黑白像素的圖像,其中由運(yùn)動跡象的點(diǎn)是白色,其余是黑色,這就為后面的畫框做好了鋪墊;幀差算法代碼如下:
1、幀差間隔,也就是2幀圖像之間的時間間隔怎么選???經(jīng)驗(yàn)告訴我們選擇5幀,代碼部分如下:
2、幀差閾值,也就是兩幀圖像的Y分量之差是多少才能判定為是運(yùn)動跡象呢?經(jīng)驗(yàn)告訴我們選擇20到100,但70為最佳,設(shè)計中采用了一個VIO來動態(tài)配置閾值,默認(rèn)為70,如下:
中值濾波
中值濾波采用2個fifo取3x3的算子模塊,然后進(jìn)行中值濾波,也就是以你某個像素點(diǎn)為中心,與其周邊3個點(diǎn)的值取平均值,目的是為了使我們前面得到的黑白圖像中的白色噪點(diǎn)減少;中值濾波法代碼如下:
圖像腐蝕和膨脹
與中值濾波類似,同樣采用2個fifo取3x3的算子模塊,目的是為了使我們前面得到的黑白圖像中的白色噪點(diǎn)進(jìn)一步減少;圖像腐蝕和膨脹代碼如下:
運(yùn)動目標(biāo)圖像畫框
這個模塊是整個工程的精髓和難點(diǎn)所在,目的是把運(yùn)動的二物體框出來;現(xiàn)解析如下:
輸入:處理后的黑白圖像和原始的RGB圖像,原始的RGB圖像是圖像緩存模塊從ddr3中讀出的圖像,之所以要采用2個圖像輸入的方案,是為了輸出的選擇,如果判斷當(dāng)前像素點(diǎn)是運(yùn)動跡象的邊沿,則將該像素點(diǎn)賦為紅色,否則賦原始的RGB圖像的值;
算法:算法部分只用黑白圖像,判斷黑白圖像中白點(diǎn)的x軸坐標(biāo)的最小位置和最大位置,以及y軸坐標(biāo)的最小位置和最大位置,根據(jù)這四個點(diǎn)的坐標(biāo),就能框出一個矩形框,具體算法還得看代碼,運(yùn)動目標(biāo)圖像畫框代碼如下:
HDMI輸出
工程1、2的HDMI輸出采用silcom9134芯片編碼方案,將RGB視頻編碼為HDMI視頻,silcom9134需要i2c配置才能使用,需要i2c配置分辨率,i2c配置及采集代碼如下:
工程3、4、5、6、7、8、9的HDMI輸出采用純verilog代碼編碼方案,將RGB視頻編碼為HDMI視頻,視頻從FDMA讀出后,經(jīng)過VGA時序模塊和HDMI發(fā)送模塊后輸出顯示器,代碼位置如下:
工程源碼架構(gòu)
源碼由兩部分組成,一是Block Design搭建的基于FDMA實(shí)現(xiàn)的圖像緩存架構(gòu),二是包含了Block Design的工程源碼,以工程源碼2為例,Block Design如下,其他幾套與之類似:
以工程源碼2為例,工程源碼如下,其他幾套與之類似:
工程源碼6、7、8、9使用了自定義的FDMA方案,雖然不需要SDK配置,但FDMA的AXI4接口時鐘由Zynq提供,所以需要運(yùn)行SDK程序才能啟動Zynq,從而為PL端邏輯提供時鐘;由于不需要SDK配置,所以SDK軟件代碼就變得極度簡單,只需運(yùn)行一個“Hello World”即可,如下:
3、工程代碼1詳解–>OV5640輸入,A7版本
開發(fā)板FPGA型號:Xilinx–Artix7–xc7a35tfgg484-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:OV5640攝像頭,分辨率1280x720;
輸出:HDMI,silcom9134編碼,分辨率1280x720;
工程作用:掌握FPGA幀差算法圖像識別+目標(biāo)跟蹤的設(shè)計方法;
工程Block Design和工程代碼架構(gòu)請參考第2章節(jié)“工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:
4、工程代碼2詳解–>HDMI輸入,A7版本
開發(fā)板FPGA型號:Xilinx–Artix7–xc7a35tfgg484-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:HDMI–筆記本電腦模擬,silcom9011編碼,分辨率1920x1080;
輸出:HDMI,silcom9134編碼,分辨率1920x1080;
工程作用:掌握FPGA幀差算法圖像識別+目標(biāo)跟蹤的設(shè)計方法;
工程Block Design和工程代碼架構(gòu)請參考第2章節(jié)“工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:
5、工程代碼3詳解–>OV5640輸入,K7版本
開發(fā)板FPGA型號:Xilinx–Kintex7–xc7k325tffg676-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:OV5640攝像頭,分辨率1280x720;
輸出:HDMI,純verilog代碼編碼,分辨率1280x720;
工程作用:掌握FPGA幀差算法圖像識別+目標(biāo)跟蹤的設(shè)計方法;
工程Block Design和工程代碼架構(gòu)請參考第2章節(jié)“工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:
6、工程代碼4詳解–>OV7725輸入,K7版本
開發(fā)板FPGA型號:Xilinx–Kintex7–xc7k325tffg676-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:OV7725,分辨率640x480;
輸出:HDMI,純verilog代碼編碼,分辨率640x480;
工程作用:掌握FPGA幀差算法圖像識別+目標(biāo)跟蹤的設(shè)計方法;
工程Block Design和工程代碼架構(gòu)請參考第2章節(jié)“工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:
7、工程代碼5詳解–>HDMI輸入,K7版本
開發(fā)板FPGA型號:Xilinx–Kintex7–xc7k325tffg676-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:HDMI–筆記本電腦模擬,IT6802編碼,分辨率1920x1080;
輸出:HDMI,純verilog代碼編碼,分辨率1920x1080;
工程作用:掌握FPGA幀差算法圖像識別+目標(biāo)跟蹤的設(shè)計方法;
工程Block Design和工程代碼架構(gòu)請參考第2章節(jié)“工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:
8、工程代碼6詳解–>OV5640輸入,Zynq7020版本
開發(fā)板FPGA型號:Xilinx–Zynq7020–xc7z020clg400-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:OV5640攝像頭,分辨率1280x720;
輸出:HDMI,純verilog代碼編碼,分辨率1280x720;
工程作用:掌握FPGA幀差算法圖像識別+目標(biāo)跟蹤的設(shè)計方法;
工程Block Design和工程代碼架構(gòu)請參考第2章節(jié)“工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:
9、工程代碼7詳解–>OV7725輸入,Zynq7020版本
開發(fā)板FPGA型號:Xilinx–Zynq7020–xc7z020clg400-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:OV7725,分辨率640x480;
輸出:HDMI,純verilog代碼編碼,分辨率640x480;
工程作用:掌握FPGA幀差算法圖像識別+目標(biāo)跟蹤的設(shè)計方法;
工程Block Design和工程代碼架構(gòu)請參考第2章節(jié)“工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:
10、工程代碼8詳解–>OV5640輸入,Zynq7010版本
開發(fā)板FPGA型號:Xilinx–Zynq7010–xc7z010clg400-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:OV5640攝像頭,分辨率1280x720;
輸出:HDMI,純verilog代碼編碼,分辨率1280x720;
工程作用:掌握FPGA幀差算法圖像識別+目標(biāo)跟蹤的設(shè)計方法;
工程Block Design和工程代碼架構(gòu)請參考第2章節(jié)“工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:
11、工程代碼9詳解–>OV7725輸入,Zynq7010版本
開發(fā)板FPGA型號:Xilinx–Zynq7010–xc7z010clg400-2;
開發(fā)環(huán)境:Vivado2019.1;
輸入:OV7725,分辨率640x480;
輸出:HDMI,純verilog代碼編碼,分辨率640x480;
工程作用:掌握FPGA幀差算法圖像識別+目標(biāo)跟蹤的設(shè)計方法;
工程Block Design和工程代碼架構(gòu)請參考第2章節(jié)“工程源碼架構(gòu)”小節(jié)內(nèi)容;
工程的資源消耗和功耗如下:
12、上板調(diào)試驗(yàn)證并演示
準(zhǔn)備工作
需要如下器材設(shè)備:
1、FPGA開發(fā)板;
2、OV5640、OV7725攝像頭或HDMI輸入設(shè)備,比如筆記本電腦;
2、HDMI連接線和顯示器;
OV5640輸入版本工程演示
工程1、3、6、8使用OV5640輸入,分辨率為1280x720,幀差算法圖像識別+目標(biāo)跟蹤輸出效果如下:
OV5640輸入FPGA幀差算法圖像識別+目標(biāo)跟蹤
OV7725輸入版本工程演示
工程4、7、9使用OV7725輸入,分辨率為640x480,幀差算法圖像識別+目標(biāo)跟蹤輸出效果如下:
OV7725輸入FPGA幀差算法圖像識別+目標(biāo)跟蹤
HDMI輸入版本工程演示
工程2、5使用HDMI輸入,分辨率為1920x1080,幀差算法圖像識別+目標(biāo)跟蹤輸出效果如下:
HDMI輸入FPGA幀差算法圖像識別+目標(biāo)跟蹤文章來源:http://www.zghlxwxcb.cn/news/detail-851848.html
13、福利:工程源碼獲取
福利:工程代碼的獲取
代碼太大,無法郵箱發(fā)送,以某度網(wǎng)盤鏈接方式發(fā)送,
資料獲取方式:私,或者文章末尾的V名片。
網(wǎng)盤資料如下:
此外,有很多朋友給本博主提了很多意見和建議,希望能豐富服務(wù)內(nèi)容和選項(xiàng),因?yàn)椴煌笥训男枨蟛灰粯?,所以本博主還提供以下服務(wù):文章來源地址http://www.zghlxwxcb.cn/news/detail-851848.html
到了這里,關(guān)于FPGA高端項(xiàng)目:FPGA幀差算法圖像識別+目標(biāo)跟蹤,提供9套工程源碼和技術(shù)支持的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!