Top Ad unit 728 × 90

Recientes

recent

Curso OpenCV y C++ con Visual Studio 2013 (9-25) - Detección de Rostros desde imagen con OpenCv

Si queremos implementar una aplicación que pueda reconocer un conjunto de patrones específicos como rostros, ojos, cuerpos, etc, podemos utilizar Opencv que nos facilita esta tarea pues ya cuenta con clasificadores entrenados para realizar esta tarea  llamados Haar-like features,  almacenados en archivos xml.

Detección de Rostros de una Imagen con OpenCv


1. Para detectar un rostro primero debemos cargar la imagen en la cual deseamos buscar uno o varios o rostros.
Mat imagen = imread("D:\\pruebaopencv\\familia2.jpg");
2. Convertir la imagen a escala de grises, necesario para el correcto funcionamiento de los algoritmos de detección de rostros usados por opencv. 
cvtColor(imagen, gris, CV_BGR2GRAY);
3. Necesariamente después aplicaremos ecualización de histograma a la imagen en grises para estandarizar el contraste y brillo de la imagen, esto para que la detección del rostro no se vea afectada debido a distintas condiciones de iluminación.
equalizeHist(gris, destino);
4. Lo que hacemos después es cargar el Clasificador Haar que utilizaremos que es un archvo Xml ubicado en C:\opencv\sources\data\ aquí encontraremos varias carpetas que contienes distintos clasificadores, en la carpeta haarcascades se encuentran varios clasificadores por ejemplo haarcascade_frontalface_alt.xml para detectar rostros, para detectar cuerpo completo podemos usar haarcascade_fullbody.xml, para detectar ojos contamos con haarcascade_eye.xml, y varios más.
CascadeClassifier detector;
 if (!detector.load("C:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml"))
            cout << "No se puede abrir clasificador." << endl;


Las caras detectadas serán almacenadas en el vector rect, solo debemos recorrerlo y dibujar un rectángulo sobre los rostros detectados.


Código: Ejemplo Detección de rostros desde imágenes en OpenCv y C++

// CursoOpenCV2410.cpp: Juan Carlos Arcila Díaz.

#include "stdafx.h"
#include "opencv2\opencv.hpp"

using namespace cv;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
      //Declaramos los objetos de la clase Mat donde se almacenarán las imágenes
      Mat destino, gris;
      //Cargamos la imagen a procesar
      Mat imagen = imread("D:\\pruebaopencv\\familia2.jpg");

      //Instanciamos al clasificador Haar
      CascadeClassifier detector;

      if (!detector.load("C:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml"))
            cout << "No se puede abrir clasificador." << endl;

      //Convertimos a escala de Grises la imagen
      cvtColor(imagen, gris, CV_BGR2GRAY);
      //Ecualizamos la imagen para estandarizar el contraste
      equalizeHist(gris, destino);

      //Declaramos el vector donde se almacenrán las características de los rostros encontrados
      vector rect;
      detector.detectMultiScale(destino, rect);

      //Dibujamos un rectángulo por cada rostro encontrado
      for (Rect rec : rect)
      {
            rectangle(imagen,
                  Point(rec.x, rec.y),
                  Point(rec.x + rec.width, rec.y + rec.height),
                  CV_RGB(0, 255, 0), 2);
      }
      //Mostramos la imagen normal con los rostros detectados, la imagen con escala de grises
      //y la imagen con ecualización de Histogramas
      imshow("Imagen original", imagen);
      imshow("Imagen en escala de grises", gris);
      imshow("Imagen al aplicar ecualizacion de histograma", destino);

      waitKey(0);
}


//
Saludos Imperio, un abrazo a la distancia!
Curso OpenCV y C++ con Visual Studio 2013 (9-25) - Detección de Rostros desde imagen con OpenCv Reviewed by Juan Carlos Arcila Díaz on 20:58 Rating: 5

3 comentarios:

  1. Hola, tengo un problema con el código, me arroja el siguiente error : "Run-Time Check Failure #2 - Stack around the variable 'detector' was corrupted " alguna idea ? Gracias

    ResponderEliminar
  2. hola, he estado trabajando en este proyecto mucho tiempo y me estancado en un lugar que espero puedan ayudarme.
    la pregunta es como puedo almacenar los rostros a mi base de datos MSQL y como puedo realizar las comparaciones realizando las respectivas consultas

    ResponderEliminar
  3. hola, he estado trabajando en este proyecto mucho tiempo y me estancado en un lugar que espero puedan ayudarme.
    la pregunta es como puedo almacenar los rostros a mi base de datos MSQL y como puedo realizar las comparaciones realizando las respectivas consultas

    ResponderEliminar

All Rights Reserved by www.IncanatoIT.com - Desarrollando Software © 2014 - 2015
Powered By Blogger, Designed by Sweetheme

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

IncanatoIt.com. Con la tecnología de Blogger.