【问题标题】:C# - Detect face and crop imageC# - 检测人脸并裁剪图像
【发布时间】:2011-11-14 04:27:04
【问题描述】:

我正在用 C# 编写一个HttpHandler,它提供调整大小的图像和等等等等……没问题,我们有数百万个处理程序可供参考。

问题是我的用户照片是用“传统”尺寸拍摄的,如 4:3 和 16:9。但是这个处理程序需要以照片 ID 大小(4 厘米 x 3 厘米)提供图片,并且显然需要在用户面部周围裁剪。面部位置变化很大(并不总是在图片中心)。

那么,我可以使用什么样的算法来检测人脸中心,然后围绕该点裁剪图像?

【问题讨论】:

    标签: c# image-processing face-detection


    【解决方案1】:

    您可以在 EmguCV 中使用 HaarCascade 类(OpenCV 的 DotNet 端口)http://www.emgu.com/wiki/index.php/Face_detection

    运行此示例的注意事项:

    • 创建 Windows 窗体应用程序
    • 添加 PictureBox 和 Timer(并启用它) - 在 x86 系统上运行它
    • 确保在执行代码的文件夹中有 OpenCV 相关的 dll(Emgu CV 下载中包含)。
    • 调整路径找到Haarcascade xml(代码最后一行)
    using System;
    using System.Windows.Forms;
    using System.Drawing;
    using Emgu.CV;
    using Emgu.Util;
    using Emgu.CV.Structure;
    using Emgu.CV.CvEnum;
     
    namespace opencvtut
    {
        public partial class Form1 : Form
        {
                    private Capture cap;
                    private HaarCascade haar;
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void timer1_Tick(object sender, EventArgs e)
            {
                    using (Image<Bgr, byte> nextFrame = cap.QueryFrame())
                    {
                            if (nextFrame != null)
                            {
                                    // there's only one channel (greyscale), hence the zero index
                                    //var faces = nextFrame.DetectHaarCascade(haar)[0];
                                    Image<Gray, byte> grayframe = nextFrame.Convert<Gray, byte>();
                                    var faces =
                                            grayframe.DetectHaarCascade(
                                                    haar, 1.4, 4,
                                                    HAAR_DETECTION_TYPE.DO_CANNY_PRUNING,
                                                    new Size(nextFrame.Width/8, nextFrame.Height/8)
                                                    )[0];
     
                                    foreach (var face in faces)
                                    {
                                            nextFrame.Draw(face.rect, new Bgr(0,double.MaxValue,0), 3);
                                    }
                                    pictureBox1.Image = nextFrame.ToBitmap();
                            }
                    }
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                // passing 0 gets zeroth webcam
                            cap = new Capture(0);
                // adjust path to find your xml
                            haar = new HaarCascade(
                    "..\\..\\..\\..\\lib\\haarcascade_frontalface_alt2.xml");
            }
        }
    }
    

    【讨论】:

    • 您好,zip 文件不再位于该路径中。能买到吗?
    • 抱歉,我没有邮编了。我现在从答案中删除了链接。
    【解决方案2】:

    您可以在http://deteksiwajah.blogspot.com/ 上查看人脸检测和裁剪软件的示例。它是开源的,使用 OpenCV 库。

    【讨论】:

      【解决方案3】:

      如果您正在寻找裁剪图像,您可以使用名为 Face API 的 Microsoft 认知服务来分隔照片上所有人的脸,它会返回一个 JSON,其中包含返回 Rectangle 结构的元素,然后您可以根据需要裁剪和调整图像大小。

      您可以在这里查看更多信息a:FaceAPI

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-25
        • 1970-01-01
        • 2014-04-28
        • 2015-03-11
        • 2016-07-03
        • 2013-01-23
        • 2011-04-27
        • 2018-03-07
        相关资源
        最近更新 更多