Pregunta

estoy escribiendo un HttpHandler en C# que sirve imágenes redimensionadas y bla, bla, bla...No hay problema, tenemos millones de controladores para usar como referencia.

El problema es que tengo fotografías de mis usuarios tomadas con tamaños "tradicionales", como 4:3 y 16:9.Pero este controlador deberá entregar la imagen en un tamaño de identificación con foto (4 cm por 3 cm) y obviamente necesita recortando alrededor de la cara del usuario.Las posiciones de las caras varían mucho (no siempre están en el centro de la imagen).

Entonces, ¿qué tipo de algoritmo podría usar para detectar el centro de la cara y luego recortar la imagen alrededor de este punto?

¿Fue útil?

Solución

Puede utilizar la clase HaarCascade en EmguCV (puerto DotNet de OpenCV) http://www.emgu.com/wiki/index.php/Face_detection

Notas para ejecutar este ejemplo:

  • Crear una aplicación de formulario de Windows
  • Agregue un PictureBox y un temporizador (y habilítelo): ejecútelo en un sistema x86
  • Asegúrese de tener los archivos DLL relevantes de OpenCV (incluidos con la descarga de Emgu CV) en la carpeta donde se ejecuta su código.
  • Ajuste la ruta para encontrar el xml de Haarcascade (última línea del código)
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");
        }
    }
}

Aquí está la muestra que escribí. http://www.overroot.com/blog/wp-content/uploads/2011/03/FaceRecognition.zip

Otros consejos

Hay un ejemplo en CodeProject, parece que sería un muy buen punto de partida.

Puede ver un ejemplo de software de detección y recorte de rostros en http://deteksiwajah.blogspot.com/.Es de código abierto y utiliza la biblioteca OpenCV.

Si está buscando recortar su imagen, puede usar el Servicio Cognitivo de Microsoft llamado Face API, que delimita la cara de todas las personas en su foto, le devuelve un JSON que tiene los elementos para devolverle una estructura Rectángulo, luego puede Recorta y cambia el tamaño de tu imagen como quieras.

Aquí puedes ver más información al respecto: cara API

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top