2011-09-10 39 views
5

Estoy escribiendo un HttpHandler en C# que sirve imágenes de tamaño y blah blah blah ... No hay problemas, tenemos millones de controladores para usar como referencia.C# - Detectar imagen de la cara y el recorte

El problema es que tengo imágenes de mis usuarios tomadas con tamaños "tradicionales", como 4: 3 y 16: 9. Pero este controlador deberá servir la imagen en un tamaño de ID de foto (4 cm por 3 cm) y, obviamente, tiene necesidad de 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?

Respuesta

8

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

Notas con el fin de ejecutar este ejemplo:

  • Crear una aplicación de Windows Forms
  • Añadir un cuadro de imagen y a Temporizador (y habilítelo) - Ejecútelo en un sistema x86
  • Asegúrese de tener los dlls relevantes de OpenCV (incluidos con la descarga del CV de Emgu) en la carpeta donde codifica el comando es.
  • Ajustar el camino para encontrar el xml 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 escribí http://www.overroot.com/blog/wp-content/uploads/2011/03/FaceRecognition.zip

1

Hay un example on CodeProject, parece que sería un muy buen lugar para comenzar.

+0

Este artículo ya no está disponible en CodeProject ya que es una réplica directa de otro trabajo en línea (comprobar el enlace). –

1

Si está buscando recortar su imagen, puede usar el Servicio Cognoscitivo de Microsoft denominado Face API que delimita el rostro de todas las personas en su foto, le devuelve un JSON que tiene los elementos para devolverle una estructura Rectangle , entonces puedes recortar y cambiar el tamaño de tu imagen como quieras.

Aquí se puede ver más informationa al respecto: FaceAPI

Cuestiones relacionadas