real - C#- Detecta la cara y recorta la imagen
microsoft face api example (4)
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.
El problema es que tengo fotos de mis usuarios tomadas con tamaños "tradicionales", como 4: 3 y 16: 9. Pero este controlador tendrá que servir la imagen en un tamaño de ID de foto (4 cm por 3 cm) y, obviamente, tiene la necesidad de recortar 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?
Puede usar 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 Windows Form
- Agregar un PictureBox y un temporizador (y habilitarlo) - Ejecutarlo 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 se ejecuta el código.
- Ajuste la ruta para encontrar Haarcascade xml (ú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í en http://www.overroot.com/blog/wp-content/uploads/2011/03/FaceRecognition.zip
Hay un ejemplo en CodeProject , parece que sería un muy buen lugar para comenzar.
Puede ver un ejemplo de detección de rostros y software de recorte 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 Cognoscitivo de Microsoft llamado 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 usted puede Recorta y cambia el tamaño de tu imagen como quieras.
Aquí puedes ver más información al respecto: FaceAPI