繁体   English   中英

C# - 检测人脸和裁剪图像

[英]C# - Detect face and crop image

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

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

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

您可以在 EmguCV(OpenCV 的 DotNet 端口)中使用 HaarCascade class 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");
        }
    }
}

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

在这里你可以看到更多关于它的信息: FaceAPI

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM