FPGA驱动摄像头实现人脸识别(基于肤色)

FPGA驱动摄像头实现人脸识别(基于肤色)

验证平台:黑金AX309 OV5640
时至今日图像处理已经得到了广泛应用,今天我们来讲一讲利用FPGA结合摄像头来实现一个简单的人脸识别(当然误检率很高,因为是基于肤色的,颜色相近就会被检测)。
话不多说咱们先来简单的分析一下整个检测的流程。咱们是采用VGA进行最终的识别结果显示,也就是画框。摄像头驱动部分就不在多说。流程如下。

RGB数据
转YCBCR
二值化
滤波
识别区域
画框
VGA显示

①:RGB数据转换为TCBCR
公式如下:
Y’ = 0.257R’ + 0.504G’ + 0.098*B’ + 16

Cb’ = -0.148R’ - 0.291G’ + 0.439*B’ + 128

Cr’ = 0.439R’ - 0.368G’ - 0.071*B’ + 128

当然FPGA处理整形数据较为容易:
所以我们可以将数据整日左移八位,在进行计算,最后在右移回去即可。
②:二值化
所谓二值化,就是讲整个图像转化为黑白图,当然,为了提取到人脸数据,我们需要将人脸部分显示为白色,其余部分为黑色,这就要我们设置一个阈值(关于如何提取到肤色的值,我们可以利用PS去提取RGB数据,在通过计算即可),在这里我们设置的阈值为
77 < Cb < 127 133 < Cr < 173
当然可以根据实际需要进行计算修改
才阈值范围内的RGB赋值为FFFF,否则为0,这样就把二值化了,且提取出来了我们希望识别的像素。
FPGA驱动摄像头实现人脸识别(基于肤色)_第1张图片

③:滤波
二值化后的图形进行显示的时候,我们会发现,出去我们的肤色部分外,还有许多位置一直在变动的白色的点,这些就是摄像头采集过程中,环境中的噪声干扰的结果。这些小点会干扰到我们的识别,所以我们要设计一定的算法进行滤波。常用的就是 腐蚀 -> 膨胀。当然我们也可以设计一种类似于“四舍五入”的方法,将少数次出现的点滤除掉即可,这样滤波的结果虽然不是很好,但也可以满足我们的需要。
④:识别区域
接下来我们就要开始检测我们的人脸区域了,前面我们已将人脸部分的像素进行了二值化处理,所以我们只需要锁定白色点坐标XY方向的最值就可以。
当然为了减少波动,我们可以采取隔帧计算的方法,以减少区域的不稳定,也可以避免由于延时导致的黑屏问题。
⑤:画框
得到了坐标之后,我们只需要将VGA显示部分的数据,进行略微更改,即当行场扫描到达我们的最值坐标后,更改RGB的值(例如11111_000000_00000红色),就可以吧我们的面部圈出来了。
FPGA驱动摄像头实现人脸识别(基于肤色)_第2张图片

当然这只是一个大致的过程,有哪里不懂的话可以评论区留言,源码评论区2021.10.31更新源码,评论区自取

你可能感兴趣的:(fpga,人脸识别,人脸识别,fpga)