c# - 裁剪掉不包括人脸的图像部分

标签 c# face-detection biometrics

我已经检测到图像中的人脸(只有 1 个人)并且有人脸矩形的坐标。

enter image description here

由于图像可以是任意大小,我只需要图像中重要的部分(head.shoulders)。这样做的目的是将检测到的矩形的边界扩展一些因素,以便重要部分包括。 这是正确的方法吗?

更新:
我试过这个 .. 但它没有给出正确的结果。请注意,我已将 1.7 更改为 2,因为它只接受整数参数。并且 Top 和 Left 是只读属性。

foreach (Rectangle f in objects)
{
    int x, y;
    x = f.Top - (f.Height / 8);
    y = f.Left - (f.Width / 2);

    Rectangle myrect = new Rectangle(x, y, f.Width * 2, f.Height * 2);

    g.DrawRectangle(Pens.Gray, myrect);
}

检测到人脸矩形

Top----->62
Right----->470
Left----->217
Bottom----->315

根据答案扩展矩形

Top----->91
Right----->537
Left----->31
Bottom----->597

扩展矩形

enter image description here

最佳答案

作为我的 previous answer作为题外话,我会在这里写下我的正确答案:


因为我不完全熟悉 Emgu CV ,我会有以下方法:

  1. 由于 Emgu CV 是开源的,您可以彻夜不眠,更改库中的代码并重新编译它们等。

(我的首选方法):

  1. 您从生物学角度考虑,意思是:
    您知道面部矩形的位置和大小。如果您还知道 body 比例,则可以计算出肩膀的估计宽度和垂直偏移量(相对于面部中心)。

生物学方法的更多细节:

想象图。 №1 开始为真,假设您有以下图像和人脸矩形:

Bitmap
  | .Width == 100
  | .Height == 160

Face // type: System.Drawing.Rectangle
  | .Top == 20
  | .Left == 50
  | .Width == 60
  | .Height == 60

那么根据提供的图片,新的Rectangle应该是:

f := Face // face rectangle

Face_and_Shoulder
  | .Top = f.Top - (f.Height / 8)
  | .Left = f.Left - (f.Width / 2)
  | .Width = f.Width * 2
  | .Height = f.Height * 1.7

这将产生以下值:

Face_and_Shoulder
  | .Top == 12.5
  | .Left == 20
  | .Width == 120
  | .Height == 102

在图像上绘制时,生成的矩形 (Face_and_Shoulder) 应包括肩膀和头发等。

但是这种方法有一个小缺点:如果面部旋转了一定度数(我相信超过 5..10°),它就不起作用。


要计算相应的矩形,我建议您使用此代码(您似乎混淆了代码示例中的XY):

foreach (Rectangle f in objects)
{
    float x = f.Left - (f.Width / 2f);
    float y = f.Top - (f.Height / 8f);

    Rectangle myrect = new Rectangle((int)x, (int)y, f.Width * 2, (int)(f.Height * 1.3));

    g.DrawRectangle(Pens.Gray, myrect);
}

fig. №1
图。 №1 (来源:http://www.idrawdigital.com/wp-content/uploads/2009/01/prop_var.gif)

关于c# - 裁剪掉不包括人脸的图像部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34461137/

相关文章:

c# - WPF 中的上下文文本编辑器

c# - Prism 中 CompositePresentationEvent<> 的多个参数

iOS 如何只检测正面?

android - 在我的生物识别加密方法应用程序中从 android 扫描仪获取指纹图像

vb.net - Zkteco SDK更改用户状态功能

c# - 如何在 NUnit 中编写集成测试?

C# int 到 enum 的转换

android - 浏览图像和人脸检测

Android decodeYUV420SP 导致绿色图像?

image - 指纹图像比较库