基於膚色模型和中值濾波的手部檢測演算法FPGA實現,包括tb測試檔案和MATLAB輔助驗證

简简单单做算法發表於2024-03-10

1.演算法執行效果圖預覽

RTL圖:

模擬圖:

匯入到matlab顯示效果如下:

2.演算法執行軟體版本

matlab2022a

vivado2019.2

3.演算法理論概述

在計算機視覺領域,基於膚色模型和中值濾波的手部檢測方法是一種常見的初步定位策略。該方法主要分為兩大部分:膚色分割以區分出影像中的皮膚區域,以及中值濾波以消除噪聲並保持關鍵邊緣資訊。

3.1 膚色模型建立與應用

膚色模型是基於人手的膚色特徵建立的一種顏色空間表示或機率分佈模型,用於識別影像中的膚色畫素點。一種常用的膚色模型是在YCbCr色彩空間下構建:

其中 R、G、B 分別代表RGB三通道的畫素值,Y 是亮度分量,Cb 和 Cr 是色度分量。根據統計分析,在特定範圍內的 Cb 和 Cr 值可以很好地表徵膚色。例如:

3.2 中值濾波器的運用

在初步確定膚色區域後,為了去除如光照變化、感測器噪聲等導致的非結構噪聲,通常採用 中值濾波 方法來平滑處理膚色區域:

結合膚色模型與中值濾波的手部檢測演算法能夠有效地從複雜背景中分離出手部區域。實際應用時,還需要考慮光照、視角變化等因素的影響,並可能結合其他高階計算機視覺技術(如機器學習分類器或深度學習模型)進行精確的手部姿態估計和跟蹤。

4.部分核心程式

`timescale 1ns / 1ps
 
module TEST();
 
reg i_clk;
reg i_rst;
reg [7:0] Isave[0:220000];
integer fids;
 
 
integer dat; 
integer Pix_begin;
integer Sizes;
 
 
initial 
begin
	fids = $fopen("D:\\FPGA_Proj\\FPGAtest\\code\\test.bmp","rb");
	dat  = $fread(Isave,fids);
	//有效畫素起始位置
	Pix_begin = {Isave[13], Isave[12], Isave[11], Isave[10]};
	//尺寸
	Sizes     = {Isave[5], Isave[4], Isave[3], Isave[2]};
 
	$fclose(fids);
end
 
initial 
begin
i_clk=1;
i_rst=1;
#1000
i_rst=0;
end 
 
always #5  i_clk=~i_clk;
 
 
integer jj=0;
reg [7:0]R;
reg [7:0]G;
reg [7:0]B;
always@(posedge i_clk) 
begin
	R<=Isave[jj+2];//這個datas可以用於輸入到FPGA的後期處理
	G<=Isave[jj+1];//這個datas可以用於輸入到FPGA的後期處理
	B<=Isave[jj];//這個datas可以用於輸入到FPGA的後期處理
	jj<=jj+3;
end
 
 
wire [7:0]o_Rmed,o_Gmed,o_Bmed;
wire [7:0]o_Y;// Y 
wire [7:0]o_Cr;// Y 
wire [7:0]o_Cb;// Y 
wire [7:0]o_hand_check;
 
 
tops tops_u(
.i_clk (i_clk),
.i_rst (i_rst),
.i_R   (R),
.i_G   (G),
.i_B   (B),
.o_Rmed       (o_Rmed),
.o_Gmed       (o_Gmed),
.o_Bmed       (o_Bmed),
.o_Y          (o_Y),// Y 
.o_Cr         (o_Cr),// Y 
.o_Cb         (o_Cb),// Y 
.o_hand_check (o_hand_check)
);
 
integer fout1;
initial begin
 fout1 = $fopen("hand.txt","w");
end
 
always @ (posedge i_clk)
 begin
    if(jj<=65536*3+54 & jj>54)
	$fwrite(fout1,"%d\n",o_hand_check);
	else
	$fwrite(fout1,"%d\n",0);
end
endmodule

  

相關文章