C # - Определить лицо и обрезать изображение - PullRequest
5 голосов
/ 10 сентября 2011

Я пишу HttpHandler в C #, который обслуживает изображения с измененным размером и бла-бла-бла ... Нет проблем, у нас есть миллионы обработчиков для использования в качестве справки.

Проблема в том, что у меня есть фотографии моих пользователей, сделанные с «традиционными» размерами, такими как 4: 3 и 16: 9. Но этот обработчик должен будет обрабатывать изображение в формате Photo ID (4 см на 3 см) и, очевидно, нуждается в обрезке вокруг лица пользователя . Положение граней сильно различается (не всегда в центре изображения).

Итак, какой алгоритм я мог бы использовать, чтобы определить центр лица и затем обрезать изображение вокруг этой точки?

Ответы [ 4 ]

8 голосов
/ 10 сентября 2011

Вы можете использовать класс HaarCascade в EmguCV (DotNet-порт OpenCV) http://www.emgu.com/wiki/index.php/Face_detection

Примечания для запуска этого примера:

  • Создание приложения Windows Form
  • Добавьте PictureBox и таймер (и включите его) - запустите его в системе x86
  • Убедитесь, что у вас есть соответствующие библиотеки OpenCV (включены в загрузку CV Emgu) в папке, гдеваш код выполняется.
  • Настройте путь для поиска 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");
        }
    }
}

Вот пример, который я написал http://www.overroot.com/blog/wp-content/uploads/2011/03/FaceRecognition.zip

1 голос
/ 12 сентября 2016

Если вы ищете обрезку своего изображения, вы можете использовать Microsoft Cognitive Service с именем Face API, который разделяет лицо всех людей на вашей фотографии, он возвращает вам JSON, который имеет элементы, чтобы вернуть вам структуру Rectangle, тогда вы можете обрезать и изменить размер изображения, как вы хотите.

Здесь вы можете увидеть больше информации об этом: FaceAPI

1 голос
/ 17 ноября 2011

Пример программного обеспечения для распознавания лиц и обрезки можно посмотреть по адресу http://deteksiwajah.blogspot.com/. Это открытый исходный код и библиотека OpenCV.

1 голос
/ 10 сентября 2011
...