RISC-V MCU中文社区

【分享】 基于FPGA的肤色检测方案简介

发表于 全国大学生集成电路创新创业大赛 2021-07-10 22:40:42
0
1715
1

一、团队介绍

大家好,我们是293小分队,报名编号为CICC1363。本次我们将分享肤色检测的相关知识。水平有限,如果有错误希望大家多多批评指正。

二、肤色检测原理

RGB图像中,肤色对光照强度的敏感度很高,因此RGB下的肤色没有明显的特异性。而在YCbCr图像中,去除光照强度Y的影响,人的肤色在CbCr中存在明显的聚类,即77133,绝大多数人的肤色分量位于这个区间中。基于此,可以通过判断图像中像素点的CbCr分量,从而判断是否存在人脸以及人脸位置。当然,这种检测方法十分容易出现误差,只要颜色分量相近,就很可能被误认。

二、肤色检测流程

A. rgb2YCbCr+二值化:

基于以下公式,将浮点数运算转换为定点数运算,并根据77133条件将图像转变为二值化图像。


B.    滤波(腐蚀+膨胀):

图像中可能存在噪声或者其他干扰项,会对肤色检测带来影响,因此需要对其进行去除,最常用的方法便是腐蚀和膨胀操作。


腐蚀操作将图像中的白色区域缩小,从而可以消除二值图像中的噪声白点或者部分干扰白色小区域;而膨胀操作将图像中的白色区域扩大,从而抵消腐蚀操作对图像带来的变化。通过腐蚀和膨胀,可以在几乎不改变图像的前提下消除干扰,提高肤色检测准确度。其效果如下所示:

  

FPGA中,实现腐蚀和膨胀操作最主要的就是按照像素点顺序构建3*3方块矩阵,然后对矩阵中的像素点进行运算,对于腐蚀操作就是“与”,对于膨胀操作就是“或”。在vivado中,可以使用shift RAM来构建方块矩阵。shift RAM的深度设置为图像的宽度,两个shift RAM相连分别输出第一行和第二行数据,而输出可以作为第三行数据,从而构成3*3矩阵,并随着像素的输入该矩阵逐次向前推进。


C.    确定区域

对于二值化图像,我们只需要确定白色像素点坐标在XY方向的最值,从而确定肤色区域的外围。

三、肤色检测仿真

将像素点保存在文本文档中,通过testbench将其读入到数组中,并依次输入到肤色检测模块中,最终输出坐标最值。










喜欢1
用户评论

未通过实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板