65.9K
CodeProject 正在变化。 阅读更多。
Home

从图像中检测人类情感

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.73/5 (89投票s)

2010 年 9 月 19 日

CPOL

9分钟阅读

viewsIcon

524636

downloadIcon

25193

它可以从图像中检测人类情感

引言

此代码可以从图像中检测人类情感。首先,它获取一张图像,然后通过肤色分割,检测出人类肤色,然后检测人脸。接着,它从人脸中分离出眼睛和嘴唇。然后,它为眼睛和嘴唇绘制贝塞尔曲线。然后,它将眼睛和嘴唇的贝塞尔曲线与存储在数据库中的眼睛和嘴唇的贝塞尔曲线进行比较。然后,它找到数据库中最接近的贝塞尔曲线,并将该数据库存储的贝塞尔曲线情感作为此图像的情感输出。

它是如何工作的?

肤色分割

对于肤色分割,我们首先增强图像对比度。然后进行肤色分割。

Pic-1.PNG

然后,我们需要找到最大的连通区域。然后我们需要检查该最大连通区域成为人脸的概率。如果最大连通区域有成为人脸的概率,它将打开一个新窗体,其中包含该最大连通区域。如果最大连通区域的高度和宽度大于或等于 50,并且高度/宽度比在 1 到 2 之间,那么它可能是一张脸。

Pic-2.PNG

人脸检测

对于人脸检测,我们首先将 RGB 图像转换为二值图像。要转换为二值图像,我们计算每个像素的 RGB 平均值,如果平均值低于 110,则将其替换为黑色像素,否则替换为白色像素。通过这种方法,我们从 RGB 图像获得了二值图像。

pic-10.PNG

然后,我们尝试从二值图像中找到额头。我们从图像中间开始扫描,然后寻找连续黑像素之后的连续白像素。然后,我们要通过向左和向右垂直搜索来找到白像素的最大宽度。然后,如果新宽度小于前一个最大宽度的一半,我们就停止扫描,因为如果我们到达眉毛,就会出现这种情况。然后,我们从额头的起始位置裁剪出人脸,其高度将是宽度的 1.5 倍。

pic-11.PNG pic-12.PNG

在图中,X 将等于额头的最大宽度。然后,我们将得到一张只包含眼睛、鼻子和嘴唇的图像。然后,我们将根据二值图像裁剪 RGB 图像。

眼睛检测

对于眼睛检测,我们将 RGB 人脸转换为二值人脸。现在,我们考虑人脸宽度为 W。我们从 W/4 到 (W-W/4) 扫描以找到两只眼睛的中间位置。在范围内的最高连续白像素(沿高度方向)是两只眼睛的中间位置。

pic-13.PNG

然后,我们通过垂直搜索找到两只眉毛的起始高度或上方位置。对于左眼,我们搜索 w/8 到 mid;对于右眼,我们搜索 mid 到 w - w/8。这里 w 是图像的宽度,mid 是两只眼睛的中间位置。眉毛和眼睛之间可能有一些白像素。为了连接眉毛和眼睛,我们在垂直方向上从眉毛到眼睛放置一些连续的黑像素。对于左眼,垂直黑像素线位于 mid/2 到 mid/4 之间;对于右眼,线条位于 mid+(w-mid)/4 到 mid+3*(w-mid)/4 之间,黑像素线的高度从眉毛起始高度到 (h - 眉毛起始位置)/4。这里 w 是图像的宽度,mid 是两只眼睛的中间位置,h 是图像的高度。然后,我们通过垂直搜索黑像素来找到两只眼睛的较低位置。对于左眼,我们在 mid/4 到 mid - mid/4 的宽度范围内搜索。对于右眼,我们从图像的下端到眉毛的起始位置,在 mid + (w-mid)/4 到 mid+3*(w-mid)/4 的宽度范围内搜索。然后,我们通过水平搜索黑像素来找到左眼的右侧,从中间位置到左眼上方和下方位置之间的黑像素起始位置。对于右眼,我们搜索中间位置到右眼上方和下方位置之间的黑像素起始位置的左侧。左眼的左侧是图像的起始宽度,右眼的右侧是图像的结束宽度。然后,我们根据上方位置、下方位置、左侧和右侧裁剪出 RGB 图像中的两只眼睛。

pic-14.PNG

嘴唇检测

对于嘴唇检测,我们确定嘴唇的边界框。我们假设嘴唇必须在嘴唇边界框内。所以,我们首先确定额头到眼睛的距离。然后,我们将该距离加到眼睛的较低高度,以确定包含嘴唇的边界框的上边缘高度。现在,边界框的起始点将是左眼边界框的四分之一位置,结束点将是右眼边界框的四分之三位置。边界框的结束高度将是人脸图像的底部。所以,这个边界框将只包含嘴唇,可能还有一部分鼻子。然后,我们将根据边界框裁剪 RGB 图像。

pic-15.PNG

因此,对于眼睛和嘴唇的检测,我们只需要将 RGB 图像转换为二值图像,并在二值图像中进行一些搜索。

pic-16.PNG

在嘴唇上应用贝塞尔曲线

在嘴唇边界框内,有嘴唇,可能还有一部分鼻子。因此,边界框周围是肤色或皮肤。所以,我们将肤色像素转换为白色像素,其他像素转换为黑色。我们还找出与肤色相似的像素,并将它们转换为白色像素。在这里,如果两个像素的 RGB 值差异小于或等于 10,我们就称它们为相似像素。在这里,我们使用直方图来查找最低平均 RGB 值和最高平均 RGB 值之间的距离。如果距离小于 70,我们就使用 7 来查找相似像素;如果距离大于或等于 70,我们就使用 10 来查找相似像素。因此,用于查找相似像素的值取决于图像的质量。如果图像质量高,我们就使用 7 来查找相似像素;如果图像质量低,我们就使用 10。

pic-17.PNG

所以,在二值图像中,嘴唇、鼻子以及可能与其他肤色略有不同的其他小区域都是黑色区域。然后,我们应用大的连通区域来查找二值图像中包含嘴唇的黑色区域。我们可以确定大的连通区域是嘴唇,因为在嘴唇边界框内,嘴唇是与肤色不同的最大区域。

pic-18.PNG

然后,我们要在二值嘴唇上应用贝塞尔曲线。要应用贝塞尔曲线,我们在水平方向上找到嘴唇的起始像素和结束像素。然后,我们在上唇从起始像素和结束像素处绘制两条切线,并找到切线上不在嘴唇上的两个点。对于下唇,我们通过类似上唇的过程找到两个点。我们使用三次贝塞尔曲线来绘制嘴唇的贝塞尔曲线。我们绘制两条贝塞尔曲线作为嘴唇,一条用于上唇,一条用于下唇。

pic-19.PNG

在眼睛上应用贝塞尔曲线

要在眼睛上应用贝塞尔曲线,我们首先要从眼睛中移除眉毛。要移除眉毛,我们从眼睛边界框的二值图像中搜索 1st 连续黑像素,然后是连续白像素,然后是连续黑像素。然后,我们从边界框中移除第一个连续黑像素,然后我们就得到了一个只包含眼睛的边界框。

pic-20.PNG pic-21.PNG

现在,包含眼睛的眼睛边界框周围有一些皮肤或肤色。所以,我们应用与嘴唇相似的肤色来查找眼睛区域。然后,我们应用大连通区域查找最大的连通区域,这就是眼睛,因为在眼睛边界框中,眼睛是与肤色不相似的最大区域。

pic-22.PNG pic-23.PNG

然后,我们像处理嘴唇一样,在眼睛边界框上应用贝塞尔曲线。然后,我们得到眼睛的形状。

pic-24.PNG

数据库和训练

在我们的数据库中,有两个表。一个表“Person”用于存储人的姓名及其 4 种情感的索引,这些索引存储在另一个表“Position”中。“Position”表中,每个索引都有 6 个嘴唇贝塞尔曲线的控制点,6 个左眼贝塞尔曲线的控制点,6 个右眼贝塞尔曲线的控制点,嘴唇的高度和宽度,左眼的高度和宽度,以及右眼的高度和宽度。因此,通过这种方法,程序就能学习到人的情感。

pic-25.PNG

情感检测

对于图像的情感检测,我们需要找到嘴唇、左眼和右眼的贝塞尔曲线。然后,我们将每个贝塞尔曲线的宽度转换为 100,并将高度根据其宽度进行调整。如果该人的情感信息在数据库中可用,那么程序将匹配哪种情感的高度最接近当前高度,并将最接近的情感作为输出。

pic-26.PNG

如果该人的情感信息不在数据库中,那么程序将计算数据库中所有人的每种情感的平均高度,然后根据平均高度做出决定。

pic-27.PNG

使用程序

我们可以这样使用它

  1. 点击“Browse”按钮选择一张图片。
  2. 然后点击“Skin Color”按钮。
  3. 然后点击“Connected”按钮。
  4. 然后点击“Next”按钮,它会打开一个新窗口。
  5. 然后点击“Binary Image”按钮。
  6. 然后点击“Face”按钮。
  7. 然后点击“eye lip”按钮。
  8. 然后点击“Left_Eye_Next”按钮。
  9. 然后再次点击“Left_Eye_Next”按钮。
  10. 然后再次点击“Left_Eye_Next”按钮。
  11. 然后再次点击“Left_Eye_Next”按钮。
  12. 然后点击“Right_Eye_Next”按钮。
  13. 然后再次点击“Right_Eye_Next”按钮。
  14. 然后再次点击“Right_Eye_Next”按钮。
  15. 然后再次点击“Right_Eye_Next”按钮。
  16. 然后点击“Lip_Next”按钮。
  17. 然后再次点击“Lip_Next”按钮。
  18. 然后再次点击“Lip_Next”按钮。
  19. 然后点击“Emotion”按钮显示情感。
  20. 如果您想将人脸结果输入数据库,请在文本框中写下姓名,并从组合框中选择一个情感,然后点击“Entry”按钮。

历史

  • 2010 年 9 月 18 日:首次发布
© . All rights reserved.