Pergunta

Estou escrevendo um HttpHandler em C # que exibe imagens redimensionadas e blá, blá, blá ... Sem problemas, temos milhões de manipuladores para usar como referência.

O problema é que tenho fotos dos meus usuários tiradas com tamanhos "tradicionais", como 4: 3 e 16: 9.Mas esse manipulador precisará exibir a imagem em um tamanho de identificação com foto (4 cm por 3 cm) e, obviamente, precisa cortar ao redor do rosto do usuário .As posições dos rostos variam muito (nem sempre estão no centro da imagem).

Então, que tipo de algoritmo eu poderia usar para detectar o centro do rosto e, em seguida, cortar a imagem em torno deste ponto?

Foi útil?

Solução

Você pode usar a classe HaarCascade em EmguCV (porta DotNet do OpenCV) http:// www.emgu.com / wiki / index.php / Face_detection

Notas para executar este exemplo:

  • Crie um aplicativo Windows Form
  • Adicione uma PictureBox e um Timer (e ative-os) - execute-o em um sistema x86
  • Certifique-se de ter as dlls relevantes do OpenCV (incluídas no download do Emgu CV) na pasta onde o código é executado.
  • Ajuste o caminho para encontrar o Haarcascade xml (última linha do 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");
        }
    }
}

Aqui está o exemplo que escrevi http://www.overroot.com/blog/wp-content/uploads/2011/03/FaceRecognition.zip

Outras dicas

Há um exemplo em CodeProject , parece que seria um ótimolugar para começar.

Você pode ver um exemplo de software de detecção de rosto e corte em http://deteksiwajah.blogspot.com/.É código aberto e usa a biblioteca OpenCV.

Se você está procurando cortar sua imagem, pode usar o Microsoft Cognitive Service denominado Face API, que delimita o rosto de todas as pessoas em sua foto, ele retorna um JSON que tem os elementos para retornar uma estrutura Rectangle,então você pode cortar e redimensionar sua imagem como quiser.

Aqui você pode ver mais informaçõesa sobre ele: FaceAPI

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top