0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA偽紅外圖像處理過程演示

OpenFPGA ? 來源:OpenFPGA ? 2023-03-09 14:30 ? 次閱讀

介紹

紅外攝像機因為對可見光不敏感,所以在一些特殊行業(yè)應用越來越廣泛。

紅外攝像機甚至可以透過太陽鏡看到人眼,并且攝像機圖像不受白天或夜晚的影響,并且?guī)缀鯖]有環(huán)境光。

因為真正的紅外sensor價格比較昂貴,所以這次選用一種偽紅外sensor,即利用相機自己的光源,即安裝在鏡頭旁邊的 LED,反射紅外光后進項圖像采集,這是一種利用近紅外成像,和我們熟知的紅外攝像頭還是有區(qū)別的。

該項目展示了一些紅外圖像處理算法,這些算法可以提高圖像質(zhì)量。

所選FPGA是 ZYNQ-020 SoC,攝像頭是便宜的 Raspberry PI 攝像頭,帶有兩個紅外 LED,最大分辨率為 1080p@60Hz。

該項目中呈現(xiàn)的體系結構是可擴展的,可以輕松添加更多算法。

理論

我選擇了五種基于 3x3 內(nèi)核的圖像處理算法:

壞點校正

35af8ed0-be40-11ed-bfe3-dac502259ad0.png

這是所有這類傳感器的普遍問題,是一種常見的預處理算法。

中值濾波器

35b9c72e-be40-11ed-bfe3-dac502259ad0.png

常見的噪聲平滑預處理算法。

低通濾波器(平滑濾波器)

35c4e168-be40-11ed-bfe3-dac502259ad0.png

噪聲平滑,這個算法使圖像平滑,不會像中值濾波器那樣使圖像模糊。

圖像銳化

35d7d1f6-be40-11ed-bfe3-dac502259ad0.png

通過“邊緣銳化”提高圖像質(zhì)量,即強調(diào)邊緣。

邊緣檢測

35e405de-be40-11ed-bfe3-dac502259ad0.png

應用其中一種算法后,對圖像邊緣處理后,圖像尺寸會減?。蛇x)。

35f0795e-be40-11ed-bfe3-dac502259ad0.png

架構

所有算法都基于 3x3 內(nèi)核,這就是為什么所有算法內(nèi)核 (PE) 都必須與 FIFO 通信,每個 PE 都有一行的延遲。只有當?shù)诙袛?shù)據(jù)到達時才開始應用算法內(nèi)核,考慮到圖像處理時候會對邊界有影響,但是我們需要輸出端輸出相同的圖像大小。

35fae420-be40-11ed-bfe3-dac502259ad0.png

架構

360fbff8-be40-11ed-bfe3-dac502259ad0.png

選擇模塊是一個可擴展的 MUX 網(wǎng)絡,在上圖情況下,具有五個圖像處理算法,由六個級聯(lián)的 MUX-es 組成,一個用于濾波器輸出,一個用于輸入信號。數(shù)據(jù)流可以配置,在這種情況下,視頻流從輸入到輸出,它通過的圖像處理元素的順序和數(shù)量是可配置的。

算法內(nèi)核的結構如下所示,基本上在這種情況下是一個延遲線,它以視頻流作為輸入并輸出一個 3x3 矩陣,輸出是處理后的幀。

361902e8-be40-11ed-bfe3-dac502259ad0.png

設計

在該架構中,我在 VDMA 和 Gamma Correction 模塊之間插入了我的模塊。

362a7672-be40-11ed-bfe3-dac502259ad0.png364116e8-be40-11ed-bfe3-dac502259ad0.png

我為每個行緩沖區(qū)添加了一個 FIFO。

接口

所有模塊都使用規(guī)定好的幀接口 (FI),它與參考設計中使用的 AXI Stream 接口非常相似(https://reference.digilentinc.com/learn/programmable-logic/tutorials/zybo-z7-pcam-5c-demo/start),可以在兩者之間進行轉(zhuǎn)換。從 AXI Stream 到 Frame 不需要轉(zhuǎn)換,反之則必須生成一些額外的信號。AXI Stream 接口只有幀開始和行結束控制信號。

36632a80-be40-11ed-bfe3-dac502259ad0.png

moduleaxi_stream2frame#(
parameterDATA_WIDTH=24
)(
inputclk,//Systeclock
inputrst_n,//Asynchronousresetactivelow
//-------------------------Configurationinterface----------------------------------
input[11:0]cfg_img_w,//Imagewidth
input[11:0]cfg_img_h,//Imagewidth
//-------------------------AXI-Streaminterface-------------------------------------
inputm_axi_stream_tuser,//Startofframe
inputm_axi_stream_tvalid,//Slavehasvaliddata
inputm_axi_stream_tlast,//Endofframe
input[DATA_WIDTH-1:0]m_axi_stream_tdata,//Datatransferred
outputm_axi_stream_tready,//Masterisreadytoreceive
//------------------------------FrameInterface-----------------------------------
outputregs_frm_val,//Masterhasvaliddata
inputs_frm_rdy,//Slaveisreadytoreceive
outputreg[DATA_WIDTH-1:0]s_frm_data,//Datatransferred
outputregs_frm_sof,//StartofFrame
outputregs_frm_eof,//EndofFrame
outputregs_frm_sol,//StartofLine
outputregs_frm_eol//EndofLine
);
reg[11:0]pix_cnt;
reg[11:0]line_cnt;
wireinvalrdy;
wireoutvalrdy;
wireset_eof;
assigninvalrdy=m_axi_stream_tvalid&m_axi_stream_tready;
assignoutvalrdy=s_frm_rdy&s_frm_val;
assignm_axi_stream_tready=s_frm_rdy;
assignset_eof=(line_cnt==(cfg_img_h-1'd1))&m_axi_stream_tlast&invalrdy;

always@(posedgeclkornegedgerst_n)
if(~rst_n)pix_cnt<=?11'd0?????????;?else
if(m_axi_stream_tuser?&?invalrdy?)?pix_cnt?<=?11'd0?????????;?else?//?Reset?at?start?of?frame
if(m_axi_stream_tlast?&?invalrdy?)?pix_cnt?<=?11'd0?????????;?else?//?Reset?at?end?of?frame
if(invalrdy??????????????????????)?pix_cnt?<=?pix_cnt?+?1'd1;??????//?Increment?at?each?pixel
always@(posedge?clk?or?negedge?rst_n)
if(~rst_n???????????????????????)?line_cnt?<=?11'd0??????????;?else
if(m_axi_stream_tuser?&?invalrdy)?line_cnt?<=?11'd0??????????;?else?//?Reset?at?start?of?frame
if(m_axi_stream_tlast?&?invalrdy)?line_cnt?<=?line_cnt?+?1'd1;??????//?Increment?at?each?pixel
always@(posedge?clk?or?negedge?rst_n)
if(~rst_n??????????????????????????????)?s_frm_sol?<=?1'b0;?else
if(outvalrdy?&?s_frm_sol???????????????)?s_frm_sol?<=?1'b0;?else?//?Reset?sol?is?transmitted
if(m_axi_stream_tuser?&?invalrdy???????)?s_frm_sol?<=?1'b1;?else?//?Set?start?of?line?after?last?pixel?of?line?is?transmitted
if(outvalrdy?&?s_frm_eol?&?(~s_frm_eof))?s_frm_sol?<=?1'b1;??????//?Set?at?start?of?frame
always@(posedge?clk?or?negedge?rst_n)
if(~rst_n???????????????)?s_frm_eof?<=?1'b0;?else
if(outvalrdy?&?s_frm_eof)?s_frm_eof?<=?1'b0;?else?//?Reset?after?eof?is?transmitted
if(set_eof??????????????)?s_frm_eof?<=?1'b1;??????//?Set?when?last?pixel?is?received
always@(posedge?clk?or?negedge?rst_n)
if(~rst_n????????????????????????????)?s_frm_val?<=?1'b0;?else
if(s_frm_rdy?&?(~m_axi_stream_tvalid))?s_frm_val?<=?1'b0;?else?//?Reset?when?ready?and?no?valid?data?at?the?input
if(invalrdy??????????????????????????)?s_frm_val?<=?1'b1;???//?Set?if?data?is?received
always@(posedge?clk?or?negedge?rst_n)
if(~rst_n???????????????????????)?s_frm_eol?<=?1'b0;?else
if(outvalrdy?&?s_frm_eol????????)?s_frm_eol?<=?1'b0;?else?//?Reset?after?eol?is?transmitted
if(m_axi_stream_tlast?&?invalrdy)?s_frm_eol?<=?1'b1;??????//?Set?when?last?pixel?in?a?row?is?received
always@(posedge?clk?or?negedge?rst_n)
if(~rst_n????????????????????????)?s_frm_sof?<=?1'b0;?else
if(outvalrdy?&?s_frm_sof?????????)?s_frm_sof?<=?1'b0;?else?//?Reset?after?sof?is???????????????????????????????transmitted
if(m_axi_stream_tuser??&?invalrdy)?s_frm_sof?<=?1'b1;??????//?Set?when?first?pixel?is?received
always@(posedge?clk?or?negedge?rst_n)
if(~rst_n??)?s_frm_data?<=?{(DATA_WIDTH){1'b0}};?else
if(invalrdy)?s_frm_data?<=?m_axi_stream_tdata??;
endmodule?//axi_stream2Frame

配置sensor

這個攝像頭是搭配樹莓派使用的,所有驅(qū)動都是閉源的,所以沒有配置示例。我在 SCL 和 SDA 引腳上的 I2C 引腳上焊接了兩根電線。將相機連接到 Raspeberry Pi 并將邏輯分析儀連接到焊線,我按照相機接口指南

邏輯分析儀解碼了I2C,抓取的值將在最后附上excel。

36743df2-be40-11ed-bfe3-dac502259ad0.png

該配置已添加到 C++ 代碼中。

攝像頭是 RGB 攝像頭,只有在房間黑暗時才會啟動紅外攝像頭。為了解決這個問題,我在sensor前面粘上了一塊塑料,這是紅外 LED 前面的過濾器。這不是一個很好的解決方案,但可以。

配置模塊

使用 APB 接口進行配置。

372b5780-be40-11ed-bfe3-dac502259ad0.png

voidfilter_cfg()
{
Xil_Out32(APB_BASE_ADDR+CFG_IMG_WIDTH_ADDR,IMG_W);
Xil_Out32(APB_BASE_ADDR+CFG_IMG_HEIGHT_ADDR,IMG_H);
Xil_Out32(APB_BASE_ADDR+CFG_PIX_CORR_SEL_ADDR,0);
Xil_Out32(APB_BASE_ADDR+CFG_SHARP_SEL_ADDR,0);
Xil_Out32(APB_BASE_ADDR+CFG_SMOOTH_SEL_ADDR,0);
Xil_Out32(APB_BASE_ADDR+CFG_MEDIAN_SEL_ADDR,0);
Xil_Out32(APB_BASE_ADDR+CFG_LAPLACE_SEL_ADDR,0);
Xil_Out32(APB_BASE_ADDR+CFG_OUTPUT_SEL_ADDR,0);
Xil_Out32(APB_BASE_ADDR+CFG_PIX_CORR_THR_ADDR,0);
Xil_Out32(APB_BASE_ADDR+CFG_SHARP_COEF_ADDR,0);
Xil_Out32(APB_BASE_ADDR+CFG_TEST_MODE_EN_ADDR,0);
}

上面給出的配置是每個選擇器模塊的選擇?,F(xiàn)在它被配置為輸入流不進行任何處理的情況下轉(zhuǎn)到輸出。

37380fde-be40-11ed-bfe3-dac502259ad0.png

voidfilter_cfg()
{
Xil_Out32(APB_BASE_ADDR+CFG_IMG_WIDTH_ADDR,IMG_W);
Xil_Out32(APB_BASE_ADDR+CFG_IMG_HEIGHT_ADDR,IMG_H);
Xil_Out32(APB_BASE_ADDR+CFG_PIX_CORR_SEL_ADDR,0);
Xil_Out32(APB_BASE_ADDR+CFG_SHARP_SEL_ADDR,0);
Xil_Out32(APB_BASE_ADDR+CFG_SMOOTH_SEL_ADDR,SMOOTH_IN_CODE);
Xil_Out32(APB_BASE_ADDR+CFG_MEDIAN_SEL_ADDR,0);
Xil_Out32(APB_BASE_ADDR+CFG_LAPLACE_SEL_ADDR,SMOOTH_IN_CODE);
Xil_Out32(APB_BASE_ADDR+CFG_OUTPUT_SEL_ADDR,LAPLACE_IN_CODE);
Xil_Out32(APB_BASE_ADDR+CFG_PIX_CORR_THR_ADDR,0);
Xil_Out32(APB_BASE_ADDR+CFG_SHARP_COEF_ADDR,0);
Xil_Out32(APB_BASE_ADDR+CFG_TEST_MODE_EN_ADDR,0);
}

Xil_Out32(APB_BASE_ADDR+CFG_SMOOTH_SEL_ADDR,SMOOTH_IN_CODE);

將輸入視頻流放入算法核心。

374e276a-be40-11ed-bfe3-dac502259ad0.png

演示

我展示了帶平滑和不帶平滑的拉普拉斯濾波器,我們可以觀察到圖像有噪聲,應用平滑濾波器后圖像有所變化。

為了比較原始圖像和處理后的兩個圖像,在 Gamma 校正之后添加了第二個 VDMA,,現(xiàn)在校正后的圖像和原始圖像都在 DDR 中,因此可以復制裁剪處理后的圖像并將裁剪區(qū)域替換為原始圖像。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1625

    文章

    21638

    瀏覽量

    601353
  • led
    led
    +關注

    關注

    240

    文章

    23087

    瀏覽量

    657346
  • 濾波器
    +關注

    關注

    160

    文章

    7711

    瀏覽量

    177518
  • 紅外攝像機
    +關注

    關注

    1

    文章

    18

    瀏覽量

    8794
  • Raspberry Pi
    +關注

    關注

    1

    文章

    557

    瀏覽量

    22151

原文標題:工程鏈接

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    DSP+FPGA+ASIC設計的實時紅外圖像處理系統(tǒng)

    1.引言 本文針對紅外圖像處理系統(tǒng)的實時性要求,提出了基于DSP+FPGA+ASIC的圖像處理
    發(fā)表于 07-22 15:18 ?888次閱讀

    vison assistant中的圖像處理過程

    新手求教!在vision assistant中驗證圖片時在圖像處理畫面可以看到圖像處理過程,但完成退回到labview中后,為什么在顯示的 圖片中看不到
    發(fā)表于 06-24 15:55

    用NI Vision Assistant生成的vi運行時不顯示處理過程

    大家好,我最近在用vision assistant時遇到了問題,在assistant里處理過程可以顯示,但當我選擇好要顯示的數(shù)據(jù),導出成vi后,這些選擇的測試數(shù)據(jù)是有的也是正常的,但是輸出圖像里沒有處理過程還是一張原始
    發(fā)表于 06-08 10:49

    ni vision assistant生成的VI圖像運行時不顯示處理過程(就是圖像的抓取點這些東西)

    ni vision assistant生成的VI圖像運行時不顯示處理過程(就是圖像的抓取點這些東西)
    發(fā)表于 04-18 09:22

    FPGA應用視頻信號處理的基本過程是怎樣的

    視頻信號的處理過程就是拍攝視頻信號的逆過程。攝像頭輸出的是標準 PAL 制電視信號。攝像頭通過光電轉(zhuǎn)換實現(xiàn)圖像到視頻信號的轉(zhuǎn)換,也就是掃描的過程。攝像頭每掃描完一行
    發(fā)表于 12-04 09:36

    CPU的內(nèi)部處理過程是怎樣的

    CPU是什么?CPU主要由哪幾部分構成?CPU的內(nèi)部處理過程是怎樣的?
    發(fā)表于 10-19 09:21

    污水處理過程儀表技術的研究現(xiàn)狀

    污水處理過程固有的非線性、時變性特征對傳感器的可靠性、適應性提出了很高的要求。污水處理過程涉及多種傳感器,多數(shù)傳感器是污水處理過程所特有的,分別為人們提供所監(jiān)
    發(fā)表于 12-20 15:11 ?10次下載

    污水處理過程儀表技術的研究現(xiàn)狀

    污水處理過程固有的非線性、時變性特征對傳感器的可靠性、適應性提出了很高的要求。污水處理過程涉及多種傳感器,多數(shù)傳感器是污水處理過程所特有的,分別為人們提供所監(jiān)
    發(fā)表于 01-07 15:39 ?15次下載

    數(shù)字電視的典型的處理過程

    典型的處理過程 下面介紹數(shù)字電視的幾個典型的處理過程
    發(fā)表于 07-31 14:23 ?1489次閱讀
    數(shù)字電視的典型的<b class='flag-5'>處理過程</b>

    FPGA+DSP的紅外圖像數(shù)據(jù)采集與顯示

    摘要:在FPGA+DSP構建的便件平臺上,以鏈路口(LINKPORT)通信協(xié)議為根據(jù),實現(xiàn)紅外圖像數(shù)據(jù)采集與顯示。重點描述紅外圖像數(shù)據(jù)采集與
    發(fā)表于 03-01 00:11 ?88次下載

    基于FPGA紅外圖像處理系統(tǒng)及算法設計

    本文在研究紅外焦平面陣列非均勻性的特點和成因后,首先設計了紅外圖像實時處理的硬件平臺。本硬件平臺以FPGA為核心
    發(fā)表于 05-17 14:29 ?5次下載

    基于FPGA的多功能紅外圖像源系統(tǒng)設計

    基于FPGA的多功能紅外圖像源系統(tǒng)設計。
    發(fā)表于 08-30 15:10 ?9次下載

    FPGA圖像處理

    FPGA圖像處理
    發(fā)表于 12-14 22:29 ?19次下載

    淺析單片機中斷處理過程

    中斷處理過程可分為中斷響應、中斷處理和中斷返回三個階段。
    的頭像 發(fā)表于 11-06 14:31 ?1.7w次閱讀
    淺析單片機中斷<b class='flag-5'>處理過程</b>

    如何使用DSP和FPGA實現(xiàn)紅外圖像銳化算法的實現(xiàn)

    為了改善紅外圖像的成像質(zhì)量,根據(jù)紅外圖像的特點,提出了一種改進的拉普拉斯銳化算法——受限拉普拉斯銳化算法,并采用DSP+FPGA的架構進行實
    發(fā)表于 01-25 16:04 ?6次下載
    如何使用DSP和<b class='flag-5'>FPGA</b>實現(xiàn)<b class='flag-5'>紅外</b><b class='flag-5'>圖像</b>銳化算法的實現(xiàn)