基于FPGA的人脸识别
基于FPGA的人臉識別
一.理論基礎
1.基本介紹
模塊框圖:
在上一篇文章里,已經實現了基于OV5640的攝像頭監控,在此基礎上,我們加入一些圖像處理的內容,即可實現簡單的一些圖像處理效果,這次做到的就是最基礎的人臉識別功能。
2.理論知識
(1)RGB->YCBCR
因為RGB全彩圖像對于圖像處理很困難,所以大部分采用的都是將圖像信息二值化,也就是我們所理解的黑白圖像。所以我們第一個需要的就是將圖像信息從RGB轉成ycbcr格式。
RGB轉換YCBCR格式的公式如下:
Y = 0.299R +0.587G + 0.114B
Cb = 0.568(B-Y) + 128
CR = 0.713(R-Y) + 128
經過上面公式我們就可以將RGB轉換成YCBCR格式
(2)圖像二值化
得到了YCBCR格式的圖像數據之后,我們就可以通過設定閾值的范圍來獲得我們所需要的圖像信息了,處理之后的效果就是人臉部分顯示白色,其余部分顯示黑色。
比如我們這里要得到的人臉的膚色,根據查詢,人臉的閾值如下:
77 < Cb < 127
133 < Cr < 173
(3)濾波
由于我們實現的是最基本的圖像處理效果,所以此次的介紹沒有加入濾波的方法。但可以介紹一下濾波的原因和方法,具體內容后期隨緣介紹哈哈。
濾波的原因:
在我們的攝像頭采集圖像信息的過程中,由于硬件本來存在的問題,會有一些飄動的白點進行調動,這就是我們所說的圖像噪點。(小時候的電視機的雪花就是這樣滴)
濾波的方法:
就我所知的圖像處理方法比較有限且基礎,有中值濾波,均值濾波,服飾和膨脹算法等等,還有一些其他比如幀差發來檢測快速運動物體,光流法等。
(4)識別有效區域
為了更加直觀的看到處理的結果,我們用紅框來框選住我們所處理之后的圖像信息。但是我們不能無緣無故就可以準確的框選我們所要的內容,所以我們需要進行識別有效的區域,即得到有效圖像的最小和最大的X,Y的坐標,來進行框選。
具體思路就是:用X,Y分別掃描圖像信息,第一個得到的1.和第一個從1反轉到0的坐標進行寄存,然后經過運算之后就可以準確的得到這四個值:
X min,X max,Y min,Y max.
當然,沒有進行濾波的圖像會產生很多的噪點,導致框選的內容有問題,這里只是提供一個思路。可以用開運算進行去除噪點。
(5)畫框
將上一模塊傳來的X min,X max,Y min,Y max值分別賦予紅色之后,就可以框選出我們想要框選的內容。
具體代碼體現:
二.系統RTL及模塊核心代碼
1.系統RTL
1.模塊核心代碼
(1)RGB->YCBCR
//step1 計算括號內的各乘法項 always @(posedge clk or negedge rst_n) beginif(!rst_n) beginrgb_r_m0 <= 16'd0;rgb_r_m1 <= 16'd0;rgb_r_m2 <= 16'd0;rgb_g_m0 <= 16'd0;rgb_g_m1 <= 16'd0;rgb_g_m2 <= 16'd0;rgb_b_m0 <= 16'd0;rgb_b_m1 <= 16'd0;rgb_b_m2 <= 16'd0;endelse beginrgb_r_m0 <= rgb888_r * 8'd77 ;rgb_r_m1 <= rgb888_r * 8'd43 ;rgb_r_m2 <= rgb888_r * 8'd128;rgb_g_m0 <= rgb888_g * 8'd150;rgb_g_m1 <= rgb888_g * 8'd85 ;rgb_g_m2 <= rgb888_g * 8'd107;rgb_b_m0 <= rgb888_b * 8'd29 ;rgb_b_m1 <= rgb888_b * 8'd128;rgb_b_m2 <= rgb888_b * 8'd21 ;end end//step2 括號內各項相加 always @(posedge clk or negedge rst_n) beginif(!rst_n) beginimg_y0 <= 16'd0;img_cb0 <= 16'd0;img_cr0 <= 16'd0;endelse beginimg_y0 <= rgb_r_m0 + rgb_g_m0 + rgb_b_m0;img_cb0 <= rgb_b_m1 - rgb_r_m1 - rgb_g_m1 + 16'd32768;img_cr0 <= rgb_r_m2 - rgb_g_m2 - rgb_b_m2 + 16'd32768;endend//step3 括號內計算的數據右移8位 always @(posedge clk or negedge rst_n) beginif(!rst_n) beginimg_y1 <= 8'd0;img_cb1 <= 8'd0;img_cr1 <= 8'd0;endelse beginimg_y1 <= img_y0 [15:8];img_cb1 <= img_cb0[15:8];img_cr1 <= img_cr0[15:8];end end(2)識別有效區域
//x_min lag 2clk always @(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)beginx_min <= ROW_CNT;endelse if(flag)x_min <= ROW_CNT;else if(per_frame_clken && per_img_Bit == 1 && x_min > cnt_x)x_min <= cnt_x;else x_min <= x_min; end //x_max always @(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)beginx_max <= 0;endelse if(flag)x_max <= 0;else if(per_frame_clken && per_img_Bit == 1 && x_max < cnt_x)x_max <= cnt_x;else x_max <= x_max; end //y_min always @(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)beginy_min <= COL_CNT;endelse if(flag)y_min <= COL_CNT;else if(per_frame_clken && per_img_Bit == 1 && y_min > cnt_y)y_min <= cnt_y;else y_min <= y_min; end //y_max always @(posedge clk or negedge rst_n)beginif(rst_n == 1'b0)beginy_max <= 0;endelse if(flag)y_max <= 0;else if(per_frame_clken && per_img_Bit == 1 && y_max < cnt_y)y_max <= cnt_y;else y_max <= y_max; end初學入門,分享學習筆記和心得,如有指教,感激不盡!
由于最近板子做在了課設上,所以暫時沒有上板的效果,等課賽開始之后,將即時上傳上板的效果圖片。
總結
以上是生活随笔為你收集整理的基于FPGA的人脸识别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用开源链接
- 下一篇: 51nod3148 松鼠聚会