国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ZYNQ圖像處理項目——幀差法運動目標跟蹤

這篇具有很好參考價值的文章主要介紹了ZYNQ圖像處理項目——幀差法運動目標跟蹤。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、幀差法運動目標跟蹤概述

1.1 基本原理

幀差法顧名思義就是對輸入的前后兩幀圖像做差值,然后檢測出兩幀圖像不同的地方,并且可以實時跟蹤運動的目標輪廓。
本設(shè)計是基于ZYNQ7010和VIVADO2018.3實現(xiàn)的幀差法運動目標檢測,針對運動目標檢測算法在傳統(tǒng) PC端上實時性較差的問題,設(shè)計了一種基于 ZYNQ 硬件加速的運動目標實時檢測系統(tǒng)。將攝像頭采集的彩色視頻流轉(zhuǎn)換為灰度視頻流并進行圖像處理來實現(xiàn)運動目標檢測,并將檢測后的結(jié)果與原彩色視頻流疊加來顯示實時檢測結(jié)果。

1.2 效果展示

本設(shè)計使用到的硬件有ZYNQ7010、768P顯示屏、OV5640攝像頭這些硬件,在原有的攝像頭顯示例子上搭建完成,關(guān)于顯示環(huán)境的搭建可以參照前面的文章。
幀差法項目通過pl端兩個按鍵分別控制幀差的閾值和輸出圖像的類型。按鍵1控制閾值為40-100遞增,按鍵2控制輸出圖像類型為原始RGB圖像、灰度圖像、幀差結(jié)果圖像以及RGB疊加檢測框圖像。

ZYNQ圖像處理項目——幀差法運動目標跟蹤
原始圖像

ZYNQ圖像處理項目——幀差法運動目標跟蹤
灰度圖像

ZYNQ圖像處理項目——幀差法運動目標跟蹤
幀差結(jié)果圖像

ZYNQ圖像處理項目——幀差法運動目標跟蹤
ZYNQ圖像處理項目——幀差法運動目標跟蹤
ZYNQ圖像處理項目——幀差法運動目標跟蹤
原始圖像迭代幀差結(jié)果圖像

二、幀差法的實現(xiàn)

2.1 幀差法項目架構(gòu)

這邊的項目架構(gòu)主要是參照了《基于ZYNQ加速的幀差法運動目標檢測》這樣一篇論文,大家可以去下載看看。然后視頻教程的話,我是看了B站up主大磊FPGA的視頻,大家也可以去看看。
下圖是我的幀差法實現(xiàn)運動目標檢測跟蹤的整體框圖了。大致的原理過程是這樣子的,首先OV5640采集圖像,將采集到的圖像分別送入到vdma0和vdma1中,然后兩個vdma緩存不同的幀數(shù),達到幀差的效果;之后將兩幀圖像送入到自己編寫的幀差模塊進行差值計算,之后將結(jié)果輸出到vdma2;最后經(jīng)過DVI模塊將信號送至hdmi顯示屏上顯示。
ZYNQ圖像處理項目——幀差法運動目標跟蹤
下面這張圖呢是我參照b站視頻里面的,幀差代碼也主要完成下面這個框圖。將其中一個vdma,比如vdma0中的數(shù)據(jù)送到fifo進行緩存。然后當vdma1中的數(shù)據(jù)的user來到時,從fifo中讀數(shù)據(jù),這樣可以對齊信號。因為從fifo中讀數(shù)據(jù)需要耗費兩個時鐘周期,所以vdma1的數(shù)據(jù)延遲2clk,之后就是轉(zhuǎn)灰度,做差值,都比較簡單。
ZYNQ圖像處理項目——幀差法運動目標跟蹤
然后這邊需要說一下這個握手的協(xié)議。它是有五組信號組成,data是數(shù)據(jù)信號,user是一幀圖像的開始信號,last是一幀圖像每一行結(jié)束的信號,當valid和ready拉高時數(shù)據(jù)有效。
ZYNQ圖像處理項目——幀差法運動目標跟蹤

2.2 幀差法模塊代碼

首先是信號的定義,有三組信號,分別是vdma0和vdma1的輸入,以及輸出到vdma2這樣的三組信號。

module  frame_diff(
    input clk,
    input rst_n,

    //control key
    input key0,
    input key1,

    //data stream from vdma0
    input [23:0]    s0_axis_tdata,
    input           s0_axis_tvalid,
    output          s0_axis_tready,
    input           s0_axis_tuser,
    input           s0_axis_tlast,

    //data stream from VDMA1
    input [23:0]    s1_axis_tdata,
    input           s1_axis_tvalid,
    output          s1_axis_tready,
    input           s1_axis_tuser,
    input           s1_axis_tlast,

    //data stream to VDMA2
    output reg [23:0]       m_axis_tdata,
    output reg              m_axis_tvalid,
    input                   m_axis_tready,
    output reg              m_axis_tuser,
    output reg              m_axis_tlast
);

接著就是信號緩存了,對vdma0來的數(shù)據(jù)到user來臨時就開始存;然后當vdma1的user來臨時就開始從fifo中讀數(shù)據(jù)。注意vdma1的數(shù)據(jù)延遲2clk來同比,具體可以看代碼。

//-------------------------------------------------------
//          fifo write and read data from vdma0
//-------------------------------------------------------

reg [23:0] data_in;
reg data_wr;
reg data_wr_en;
wire data_alfull;
wire [23:0] data_out;
reg data_rd;
reg data_rd_en;
reg [23:0] s0_axis_tdata_dy1;
reg [23:0] s0_axis_tdata_dy2;

//write data to fifo
assign s1_axis_tready=~data_alfull; //always ready until fifo is full

always @(posedge clk or negedge rst_n) begin
    if(~rst_n)begin
      data_wr<=1'b0;
      data_wr_en<=1'b0;
      data_in<=24'd0;
    end
    else begin
      if(s1_axis_tvalid & s1_axis_tready & s1_axis_tuser)begin  //when s0_user is come,wr_en is high,make corrsponding 
        data_wr_en<=1'b1;
      end
      if(s1_axis_tvalid & s1_axis_tready)begin  //begin to write data to fifo
        data_wr<=1'b1;
        data_in<=s1_axis_tdata;
      end
      else begin
        data_wr<=1'b0;
        data_in<=data_in;
      end
    end
end

//read data from fifo
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)begin
      data_rd<=1'b0;
      data_rd_en<=1'b0;
    end
    else begin
      if(s0_axis_tvalid & s0_axis_tready & s0_axis_tuser)begin//unfull    //when fifo is alfull and data from camera is come,rd_en is high 
        data_rd_en<=1'b1;
      end
      if(s0_axis_tvalid & s0_axis_tready)begin
        data_rd<=1'b1;
      end
      else begin
        data_rd<=1'b0;
      end
    end
end

//fifo define 24*1024
fifo_generator_0 u_fifo_generator_0 (
  .clk        (clk),                  // input wire clk
  .srst       (~rst_n),                // input wire srst
  .din        (data_in),                  // input wire [23 : 0] din
  .wr_en      (data_wr_en & data_wr),              // input wire wr_en
  .rd_en      (data_rd_en & data_rd),              // input wire rd_en
  .dout       (data_out),                // output wire [23 : 0] dout
  .full       (),                // output wire full
  .almost_full(data_alfull),  // output wire almost_full
  .empty      (),              // output wire empty
  .data_count ()              // output wire [10 : 0] data_count
);

//read from fifo cost 2 clk, so data from camera need delay 2 clk too
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)begin
      s0_axis_tdata_dy1<=24'd0;
      s0_axis_tdata_dy2<=24'd0;
    end
    else begin
      s0_axis_tdata_dy1<=s0_axis_tdata;
      s0_axis_tdata_dy2<=s0_axis_tdata_dy1;
    end
end

然后我這邊又定義了兩個按鍵檢測和濾波信號,其實就是為了控制輸出的閾值大小和圖像類型,這部分內(nèi)容很簡單。

//-------------------------------------------------------
//   key filter and throshold control and state chose
//-------------------------------------------------------

reg [7:0] Frame_Diff_Throshold;
reg [1:0] state;
wire key0_flag;
wire key1_flag;

key_filter u_key_filter0(
    .clk    ( clk    ),
    .rst_n  ( rst_n  ),
    .key_in ( key0 ),
    .key_flag  ( key0_flag  )
);

key_filter u_key_filter1(
    .clk    ( clk    ),
    .rst_n  ( rst_n  ),
    .key_in ( key1 ),
    .key_flag  ( key1_flag  )
);

always @(posedge clk or negedge rst_n) begin
  if(~rst_n)begin
    Frame_Diff_Throshold<=8'd70;
  end
  else if(key0_flag==1'b1 & Frame_Diff_Throshold<8'd100)begin
    Frame_Diff_Throshold<=Frame_Diff_Throshold+4'd10;
  end
  else if (key0_flag==1'b1 & Frame_Diff_Throshold>=8'd100)begin
    Frame_Diff_Throshold<=8'd40;
  end
  else begin
    Frame_Diff_Throshold<=Frame_Diff_Throshold;
  end
end

always @(posedge clk or negedge rst_n) begin
  if(~rst_n)begin
    state<=2'd0;
  end
  else if(key1_flag==1'b1)begin
    state<=state+1'b1;
  end
  else begin
    state<=state;
  end
end

對讀出的兩組信號將RGB圖像轉(zhuǎn)換成灰度圖像,之后在把兩張灰度圖像進行幀差,最后注意fifo讀用了兩個clk、轉(zhuǎn)灰度用了3clk、幀差用了1clk,所以握手信號也要延遲6clk,經(jīng)過這些操作后,flag信號就是代表了幀差的結(jié)果了,接下來只需要提取出這些flag在圖像上的范圍和邊界即可,具體代碼如下所示。
更多的關(guān)于怎么找到邊間畫出邊界,大磊FPGA里面有很詳細的步驟,大家可以看視頻,或者看我工程,這里就不敘述了。

//-------------------------------------------------------
//  current img data and past img data:RGB888 to RGB565 
//-------------------------------------------------------

wire [23:0] s0_data_gray;   //data from camera
wire [23:0] s1_data_gray;   //data from vdma0
wire [7:0] s0_data_gray1;
wire [7:0] s1_data_gray1;

assign s0_data_gray1=s0_data_gray[23:16];
assign s1_data_gray1=s1_data_gray[23:16];

rgb2gray u_rgb2gray1(
    .pclk       ( clk     ),
    .rst_n      ( rst_n    ),
    .rgb_data   ( s0_axis_tdata_dy2 ),
    .gray_data  ( s0_data_gray  )
);

rgb2gray u_rgb2gray2(
    .pclk       ( clk     ),
    .rst_n      ( rst_n    ),
    .rgb_data   ( data_out ),
    .gray_data  ( s1_data_gray  )
);

//-------------------------------------------------------
//               frame diff operation  
//-------------------------------------------------------

reg frame_diff_flag;
reg [10:0] x_cnt;
reg [10:0] y_cnt;

always @(posedge clk or negedge rst_n) begin
    if(~rst_n)begin
      frame_diff_flag<=1'b0;
    end
    else begin
        if(s0_data_gray1>s1_data_gray1)begin
            if( ((s0_data_gray1-s1_data_gray1) > Frame_Diff_Throshold) && (x_cnt<H_DISP-5'd5) )begin
              frame_diff_flag<=1'b1;
            end
            else frame_diff_flag<=1'b0;
        end
        else begin
          if( ((s1_data_gray1-s0_data_gray1) > Frame_Diff_Throshold) && (x_cnt<H_DISP-5'd5) )begin
            frame_diff_flag<=1'b1;
          end
          else frame_diff_flag<=1'b0;
        end
    end
end

//-------------------------------------------------------
//              for signal of s0,delay 6 clk   
//-------------------------------------------------------

//fifo:2clk; rgb2gray:3clk; frame diff:1clk
//so 6 clk delay needed
wire s0_axis_tvalid_dy;
wire s0_axis_tuser_dy;
wire s0_axis_tlast_dy;
reg [5:0] s0_axis_tvalid_reg;
reg [5:0] s0_axis_tuser_reg;
reg [5:0] s0_axis_tlast_reg;

assign s0_axis_tvalid_dy=s0_axis_tvalid_reg[5];
assign s0_axis_tuser_dy=s0_axis_tuser_reg[5];
assign s0_axis_tlast_dy=s0_axis_tlast_reg[5];

always @(posedge clk or negedge rst_n) begin
    if(~rst_n)begin
      s0_axis_tvalid_reg<=6'd0;
      s0_axis_tuser_reg<=6'd0;
      s0_axis_tlast_reg<=6'd0;
    end
    else begin
      s0_axis_tvalid_reg<={s0_axis_tvalid_reg[4:0],s0_axis_tvalid & s0_axis_tready};
      s0_axis_tuser_reg<={s0_axis_tuser_reg[4:0],s0_axis_tvalid & s0_axis_tready & s0_axis_tuser};
      s0_axis_tlast_reg<={s0_axis_tlast_reg[4:0],s0_axis_tvalid & s0_axis_tready & s0_axis_tlast};
    end
end

2.3 幀差法軟硬件設(shè)計

vivado工程中的block design就如下圖所示了,可以看到例化了3個vdma,然后自己編寫了frame diff模塊,原理是和上面的架構(gòu)是相同的。
ZYNQ圖像處理項目——幀差法運動目標跟蹤
綜合布局布線完成后,我們把它導入到sdk設(shè)計中,sdk中c代碼如下所示,就很基礎(chǔ),只是初始化3個vdma開啟讀和寫通道就可以了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "xil_types.h"
#include "xil_cache.h"
#include "xparameters.h"
#include "xaxivdma.h"
#include "xaxivdma_i.h"
#include "vdma_api/vdma_api.h"

//宏定義
#define VDMA_ID0          XPAR_AXIVDMA_0_DEVICE_ID
#define VDMA_ID1          XPAR_AXIVDMA_1_DEVICE_ID
#define VDMA_ID2		  XPAR_AXIVDMA_2_DEVICE_ID
//frame buffer的起始地址
unsigned int const frame_buffer_addr0 =0x03000000;
unsigned int const frame_buffer_addr1 =0x06000000;
unsigned int const frame_buffer_addr2 =0x09000000;

//驅(qū)動實例
XAxiVdma     vdma;

int main(void)
{
	int i;
	int j;
	int k;

	//配置VDMA
	i=run_vdma_frame_buffer(&vdma, VDMA_ID0,1024,768,frame_buffer_addr0,0,0,BOTH);
	j=run_vdma_frame_buffer(&vdma, VDMA_ID1,1024,768,frame_buffer_addr1,0,0,BOTH);
	k=run_vdma_frame_buffer(&vdma, VDMA_ID2,1024,768,frame_buffer_addr2,0,0,BOTH);
	printf("%d\r\n",i);
	printf("%d\r\n",j);
	printf("%d\r\n",k);
	while(1);
    return 0;
}

三、總結(jié)

這個工程采用了前后幀差法,完成了單運動目標的檢測,是比較基礎(chǔ)的實戰(zhàn)項目。對于后期想擴展的方向,可以使用背景幀差法來更好的定位目標,或者完成多運動目標的檢測和計數(shù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-472065.html

資源下載鏈接:
https://download.csdn.net/download/qq_40995480/86880974

到了這里,關(guān)于ZYNQ圖像處理項目——幀差法運動目標跟蹤的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • ZYNQ圖像處理(7)——sobel邊緣檢測

    ZYNQ圖像處理(7)——sobel邊緣檢測

    所謂邊緣是指其周圍像素灰度急劇變化的那些象素的集合,它是圖像最基本的特征。邊緣存在于目標、背景和區(qū)域之間,所以,它是圖像分割所依賴的最重要的依據(jù)。由于邊緣是位置的標志,對灰度的變化不敏感,,因此,邊緣也是圖像匹配的重要的特征。邊緣檢測和區(qū)域劃分

    2024年02月05日
    瀏覽(88)
  • ZYNQ圖像處理(6)——均值濾波和中值濾波

    ZYNQ圖像處理(6)——均值濾波和中值濾波

    首先要做的是最簡單的均值濾波算法。均值濾波是典型的線性濾波算法,它是指在圖像上對目標像素給一個模板,該模板包括了其周圍的臨近像素(以目標象素為中心的周圍 8 個像素,構(gòu)成一個濾波模板,即去掉目標像素本身),再用模板中的全體像素的平均值來代替原來像

    2024年02月08日
    瀏覽(96)
  • FPGA + 圖像處理(一)三種向zynq中DDR內(nèi)導入圖像數(shù)據(jù)的方法

    FPGA + 圖像處理(一)三種向zynq中DDR內(nèi)導入圖像數(shù)據(jù)的方法

    本文主要講解三種本人已知的將圖像數(shù)據(jù)傳入ddr的方法(一些非圖像數(shù)據(jù)也可以用),方便后續(xù)通過fpga對圖像進行處理,在一些導入方法中,需要將圖像轉(zhuǎn)換成特定的格式,因此,需要用到matlab來實現(xiàn)圖像的格式轉(zhuǎn)換 這里先展示一下用到的圖像,是一個ai隨機繪制的圖像 通

    2024年02月03日
    瀏覽(142)
  • XILINX Zynq UltraScale+ MPSoC 在 4K 視頻圖像處理和會議系統(tǒng)的應用

    ? ? 賽靈思 Zynq UltraScale+? MPSoC EV 器件的 4K 視頻處理功能。EV 器件具有繼承的多標準視頻編解碼器,能夠以 60幀/秒 的速度同步編碼和解碼。 ? ? ? Arm 四核 Cortex-A53 核以及集成的定制化的視頻處理引擎,ZU7EV 器件可以作為多媒體應用方案的主控。 ? ? ? ?ZCU106 評估套件可作

    2024年02月01日
    瀏覽(235)
  • 數(shù)字圖像處理——圖像退化(大氣湍流模型與運動模糊模型)與圖像復原(逆濾波與維納濾波)

    數(shù)字圖像處理——圖像退化(大氣湍流模型與運動模糊模型)與圖像復原(逆濾波與維納濾波)

    一般來說,圖像的退化模型可以表示為 其中g(shù)(x,y) 表示退化后的圖像,h(x,y)表示退化模型,f(x,y)表示原圖像,n(x,y)表示噪聲。 在頻域上面可以表示為 下面介紹常見的兩種退化模型:基于大氣湍流物理特性的大氣湍流模型和運動模糊模型。 1.大氣湍流模型 退化模型: 伴隨著

    2024年02月05日
    瀏覽(34)
  • 圖像處理 信號處理板 設(shè)計原理圖:367-基于zynq XC7Z100 FMC接口通用計算平臺

    圖像處理 信號處理板 設(shè)計原理圖:367-基于zynq XC7Z100 FMC接口通用計算平臺

    基于zynq XC7Z100 FMC接口通用計算平臺 ? 板卡由SoC XC7Z100-2FFG900I芯片來完成卡主控及數(shù)字信號處理,XC7Z100內(nèi)部集成了兩個ARM Cortex-A9核和一個kintex 7的FPGA,通過PL端FPGA擴展FMC、光纖、IO等接口,PS端ARM擴展網(wǎng)絡(luò)、USB、RS232等接口。板卡適應于圖像處理、震動、通信、雷達等前端信號

    2024年02月11日
    瀏覽(95)
  • 008-關(guān)于FPGA/ZYNQ直接處理圖像傳感器數(shù)據(jù)輸出的若干筆記(裸板采集思路)

    008-關(guān)于FPGA/ZYNQ直接處理圖像傳感器數(shù)據(jù)輸出的若干筆記(裸板采集思路)

    最近也是未來需要考慮做的一件事情是,如何通過FPGA/ZYNQ去做顯微鏡圖像觀測下的圖像采集傳輸與后續(xù)的處理。目前顯微鏡觀測領(lǐng)域通常是以PC端連接工業(yè)相機接口,這個接口可以是USB3.0,可以是網(wǎng)口,也可以是其它傳輸方式。常常通過工業(yè)相機輸出的為視頻流數(shù)據(jù),廠商會

    2024年01月23日
    瀏覽(97)
  • Xilinx Zynq-7000系列FPGA多路視頻處理:圖像縮放+視頻拼接顯示,提供工程源碼和技術(shù)支持

    Xilinx Zynq-7000系列FPGA多路視頻處理:圖像縮放+視頻拼接顯示,提供工程源碼和技術(shù)支持

    Xilinx Zynq-7000系列FPGA多路視頻處理:圖像縮放+視頻拼接顯示,提供工程源碼和技術(shù)支持 沒玩過圖像縮放和視頻拼接都不好意思說自己玩兒過FPGA,這是CSDN某大佬說過的一句話,鄙人深信不疑。。。本文使用Xilinx Zynq7000系列FPGA Zynq7020實現(xiàn)HLS圖像縮放+視頻拼接,輸入視頻源采用

    2024年02月04日
    瀏覽(107)
  • 【OpenCV】“幀差法”實現(xiàn)移動物體的檢測(車輛識別)

    【OpenCV】“幀差法”實現(xiàn)移動物體的檢測(車輛識別)

    目錄 一、幀差法 1、概念 2、為什么幀差法可以檢測運動的物體?? 二、使用OpenCV配合幀差法實現(xiàn)車輛識別 1、加載視頻 2、灰度處理+幀差計算 3、二值化 4、腐蝕 5、膨脹 6、框選出車輛 三、全部代碼+實現(xiàn)效果 1、代碼 2、車輛檢測效果 四、幀差法存在不足之處 ? ? ? ? 幀差

    2024年02月02日
    瀏覽(27)
  • 使用opencv結(jié)合幀差法和背景減法 檢測場景異常情況

    幀差法是一種簡單的背景減法技術(shù),用于檢測當前幀和背景幀之間的差異。以下是使用OpenCV實現(xiàn)幀差法的Python代碼示例: 用于檢測是否下雨,漏水等情況。 要截取攝像頭的3秒時間并使用幀差法進行動態(tài)背景差異檢測,你可以使用OpenCV庫來完成這項任務(wù)。首先,你需要設(shè)置一

    2024年02月07日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包