reconocer rostros en imagenes con OpenCv

Technology

header ads

reconocer rostros en imagenes con OpenCv

algunos buscaran como reconocer un rostro o varias caras en unas imagenes cargadas del pc , y guardar la imagen cargada con la cara detectada en el pc, y esto es lo que vamos a hacer en este tutorial de java , primero que todo vamos a instalar OpenCv , si no saben como instalarlo aqui les dejo un tutorial  ¿Como Instalar OpenCv?

1. esta aplicacion no siempre nos reconoce las caras al 100% ya que puede haber un rastro que se paresca una cara pero igualmente es muy util , yo cree una aplicacion que carga cualquier imagen desde un boton con el Jfilechoooser y a cada imagen se asigna el reconocimeinto y la guarda al lado del proyecto, primero vamos a crear un nuevo formulario JFrame  este formulario lo llamaremos carga alli agregamos un JLabel donde se cargara la imagen,  un campo de texto donde mostrara la ruta de la imagen un boton cargar imagen como lo muestra la siguiente imagen:


luego de esto agregamos la libreria opencv-2410.jar que se encuentro dentro la carpeta de OpenCV en la siguiente imagen se muestra como debe quedar y la ruta del archivo:


en la primeras lineas de codigo agregamos lo siguiente:


 CascadeClassifier faceDetector = new CascadeClassifier("C:\\opencv\\sources\\data\\lbpcascades\\lbpcascade_frontalface.xml");

fijense en la ruta de Lbpcascade_frontalface.xml

luego vamos a crear 3 metodos el de cargar la imagen, el de tomar la imagen y el de convertir la imagen y guardarla estos metodos los insertamos en el codigo:



  public void cargar(){
     JFileChooser fc = new JFileChooser();
        //Mostrar la ventana para abrir archivo y recoger la respuesta
//http://javayotros.blogspot.com/2014/11/reconocer-rostros-en-imagenes-con-opencv.html
        //En el parámetro del showOpenDialog se indica la ventana
        //  al que estará asociado. Con el valor this se asocia a la
        //  ventana que la abre.
        int respuesta = fc.showOpenDialog(this);
        //Comprobar si se ha pulsado Aceptar
        if (respuesta == JFileChooser.APPROVE_OPTION) {
            //Crear un objeto File con el archivo elegido
            File archivoElegido = fc.getSelectedFile();
            //Mostrar el nombre del archvivo en un campo de texto
            t1.setText(archivoElegido.getAbsolutePath());
            detecta_rostro(archivoElegido.getAbsolutePath());
        }
    }
    
    public void detecta_rostro(String ruta){
    System.out.println("\nRunning DetectFaceDemo");
// Instancia detector de rostros mediante archivo de confiacion xml
// Obtiene como recurso una imagen en la ruta especificada

//Mat image = Highgui.imread(ruta,Highgui.CV_LOAD_IMAGE_COLOR);
Mat image = Highgui.imread(ruta);
// Detecta rostros en la imagen cargada
// MatOfRect es un contenedor especial para rect
//http://javayotros.blogspot.com/2014/11/reconocer-rostros-en-imagenes-con-opencv.html
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Rostros detectados: %s ", faceDetections.toArray().length));
// Dibujar cuadro en cada rostro detectado
for (Rect rect : faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
}
// Nombre de la imagen (copia) con rostros señalados
String filename = "deteccion2.png";
//Escritura de la imagen anterior

//
 Image ima = convertir(image);
            int width=ima.getWidth(null);
            int height=ima.getHeight(null);
j1.setIcon(new ImageIcon(ima));
j1.repaint();
//
Highgui.imwrite(filename, image);
    }
     private Image convertir(Mat imagen) {
        MatOfByte matOfByte = new MatOfByte();
        Highgui.imencode(".jpg", imagen, matOfByte);
        byte[] byteArray = matOfByte.toArray();
        BufferedImage bufImage = null;
        try {
            InputStream in = new ByteArrayInputStream(byteArray);
            bufImage = ImageIO.read(in);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return (Image)bufImage;
    }

obviamente llamamos al metodo cargar cuando damos click en el boton cargar imagen:

ejecutamos nuestro proyecto y cargamos una imagen con un rostro debería mostrarnos algo así:




Post a Comment