基于FPGA的人脸位置定位的仿真实现 1 概述 在肤色识别算法中,常用的颜色空间为Ycbcr,Y代表亮度,cb代表蓝色分量,cr代表红色分量。 由于肤色在 YCbCr 空间受亮度信息的影响较小,本算法直接考虑 YCbCr 空间的 CbCr 分量,映射为两维独立分布的 CbCr 空间。在 CbCr 空间下,肤色类聚性好,利用人工阈值法将肤色与非肤色区域分开,形成二值图像。 RGB 转 YCbCr 的公式为: Y = 0.257*R+0.564*G+0.098*B+16 Cb= -0.148*R-0.291*G+0.439*B+128 Cr = 0.439*R-0.368*G-0.071*B+128 对肤色进行判定的条件常使用如下判定条件: Cb > 77 && Cb < 127 Cr > 133 && Cr < 173 本节目标:在复杂环境中识别人脸肤色,并且提取肤色,完成人脸位置的定位。 2实验程序 图1 实验原图 由于图1不是800*600的图像,我们使用画图工具将图1转化成800*600。 通过matlab查找人脸肤色范围如图2. 图2 matlab查找人脸肤色范围(cb,cr) 人脸颜色转化为黑色,其他颜色转化为背景白色。 /* Module name: face_location.v Description: face location Data: 2018/11/21 微信公众号: FPGA开源工作室 */ `timescale 1ns/1ps module face_location( input pix_clk, input reset_n, input [23:0] i_rgb, input [23:0] i_gray, input [23:0] i_ycbcr, input i_h_sync, input i_v_sync, input i_de, output [23:0] skin_binary_image, output [23:0] skin_rgb_image, output [23:0] skin_gray_image, output o_h_sync, output o_v_sync, output o_de ); //***************************************** // skin detection parameter define //***************************************** parameter Y_LOW = 8'd35; parameter Y_HIGH = 8'd60; parameter CB_LOW = 8'd93; parameter CB_HIGH = 8'd120; parameter CR_LOW = 8'd135; parameter CR_HIGH = 8'd165; wire [7 : 0] y_8b; wire [7 : 0] cb_8b; wire [7 : 0] cr_8b; reg h_sync_delay; reg v_sync_delay; reg de_delay; reg [23:0] skin_binary_r; reg [23:0] skin_rgb_r; reg [23:0] skin_gray_r; assign y_8b = i_ycbcr[23:16]; assign cb_8b = i_ycbcr[15:8]; assign cr_8b = i_ycbcr[7:0]; always @(posedge pix_clk or negedge reset_n) begin if(!reset_n) begin skin_binary_r <= 24'h000000; skin_rgb_r <= 24'h000000; skin_gray_r <= 24'h000000; end else if((cb_8b > CB_LOW && cb_8b < CB_HIGH) && (cr_8b > CR_LOW && cr_8b < CR_HIGH)) begin skin_binary_r <= 24'b000_000; skin_rgb_r <= i_rgb; skin_gray_r <= i_gray; end else begin skin_binary_r <= 24'hfff_fff; skin_rgb_r <= 24'hFFFFFF; skin_gray_r <= 24'hFFFFFF; end end always @(posedge pix_clk) begin h_sync_delay <= i_h_sync; v_sync_delay <= i_v_sync; de_delay <= i_de; end assign o_h_sync = h_sync_delay; assign o_v_sync = v_sync_delay; assign o_de = de_delay; assign skin_binary_image = skin_binary_r; assign skin_rgb_image = skin_rgb_r; assign skin_gray_image = skin_gray_r; endmodule 3 实验结果 图3 实验结果 从图3中可以看出img5提取出了人脸肤色,img6框出了人脸范围。实验成功。 图4 实验结果图 总结:本节实验只是简单的人脸位置定位仿真程序,对于多个人脸,或者有其他类似肤色干扰暂时还不能识别。 欢迎关注微信公众号:FPGA开源工作室
|