基于FPGA的人脸识别
基于FPGA的人臉識(shí)別
一.理論基礎(chǔ)
1.基本介紹
模塊框圖:
在上一篇文章里,已經(jīng)實(shí)現(xiàn)了基于OV5640的攝像頭監(jiān)控,在此基礎(chǔ)上,我們加入一些圖像處理的內(nèi)容,即可實(shí)現(xiàn)簡(jiǎn)單的一些圖像處理效果,這次做到的就是最基礎(chǔ)的人臉識(shí)別功能。
2.理論知識(shí)
(1)RGB->YCBCR
因?yàn)镽GB全彩圖像對(duì)于圖像處理很困難,所以大部分采用的都是將圖像信息二值化,也就是我們所理解的黑白圖像。所以我們第一個(gè)需要的就是將圖像信息從RGB轉(zhuǎn)成ycbcr格式。
RGB轉(zhuǎn)換YCBCR格式的公式如下:
Y = 0.299R +0.587G + 0.114B
Cb = 0.568(B-Y) + 128
CR = 0.713(R-Y) + 128
經(jīng)過(guò)上面公式我們就可以將RGB轉(zhuǎn)換成YCBCR格式
(2)圖像二值化
得到了YCBCR格式的圖像數(shù)據(jù)之后,我們就可以通過(guò)設(shè)定閾值的范圍來(lái)獲得我們所需要的圖像信息了,處理之后的效果就是人臉部分顯示白色,其余部分顯示黑色。
比如我們這里要得到的人臉的膚色,根據(jù)查詢(xún),人臉的閾值如下:
77 < Cb < 127
133 < Cr < 173
(3)濾波
由于我們實(shí)現(xiàn)的是最基本的圖像處理效果,所以此次的介紹沒(méi)有加入濾波的方法。但可以介紹一下濾波的原因和方法,具體內(nèi)容后期隨緣介紹哈哈。
濾波的原因:
在我們的攝像頭采集圖像信息的過(guò)程中,由于硬件本來(lái)存在的問(wèn)題,會(huì)有一些飄動(dòng)的白點(diǎn)進(jìn)行調(diào)動(dòng),這就是我們所說(shuō)的圖像噪點(diǎn)。(小時(shí)候的電視機(jī)的雪花就是這樣滴)
濾波的方法:
就我所知的圖像處理方法比較有限且基礎(chǔ),有中值濾波,均值濾波,服飾和膨脹算法等等,還有一些其他比如幀差發(fā)來(lái)檢測(cè)快速運(yùn)動(dòng)物體,光流法等。
(4)識(shí)別有效區(qū)域
為了更加直觀的看到處理的結(jié)果,我們用紅框來(lái)框選住我們所處理之后的圖像信息。但是我們不能無(wú)緣無(wú)故就可以準(zhǔn)確的框選我們所要的內(nèi)容,所以我們需要進(jìn)行識(shí)別有效的區(qū)域,即得到有效圖像的最小和最大的X,Y的坐標(biāo),來(lái)進(jìn)行框選。
具體思路就是:用X,Y分別掃描圖像信息,第一個(gè)得到的1.和第一個(gè)從1反轉(zhuǎn)到0的坐標(biāo)進(jìn)行寄存,然后經(jīng)過(guò)運(yùn)算之后就可以準(zhǔn)確的得到這四個(gè)值:
X min,X max,Y min,Y max.
當(dāng)然,沒(méi)有進(jìn)行濾波的圖像會(huì)產(chǎn)生很多的噪點(diǎn),導(dǎo)致框選的內(nèi)容有問(wèn)題,這里只是提供一個(gè)思路。可以用開(kāi)運(yùn)算進(jìn)行去除噪點(diǎn)。
(5)畫(huà)框
將上一模塊傳來(lái)的X min,X max,Y min,Y max值分別賦予紅色之后,就可以框選出我們想要框選的內(nèi)容。
具體代碼體現(xiàn):
二.系統(tǒng)RTL及模塊核心代碼
1.系統(tǒng)RTL
1.模塊核心代碼
(1)RGB->YCBCR
//step1 計(jì)算括號(hào)內(nèi)的各乘法項(xiàng) 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 括號(hào)內(nèi)各項(xiàng)相加 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 括號(hào)內(nèi)計(jì)算的數(shù)據(jù)右移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)識(shí)別有效區(qū)域
//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初學(xué)入門(mén),分享學(xué)習(xí)筆記和心得,如有指教,感激不盡!
由于最近板子做在了課設(shè)上,所以暫時(shí)沒(méi)有上板的效果,等課賽開(kāi)始之后,將即時(shí)上傳上板的效果圖片。
總結(jié)
以上是生活随笔為你收集整理的基于FPGA的人脸识别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。