1 votos

opencv java reconocimiento facial

Hola, Estoy realizando un proyecto universitario sobre reconocimiento facial en java con opencv, el proyecto consiste en enrolar un grupo de personas(camera usb) y que luego la aplicación sea capaz de reconocer a cada una con su respectivo nombre, he leído varios tutoriales al respecto pero encuentro poca información, he avanzado con lo siguiente: Agradecería la ayuda de cualquier tipo: código de ejemplos o guías o tutoriales. Muchas gracias. email: pugaluiggi@gmail.com

    VideoCapture videoCapture = new VideoCapture(0);//nicializa la camara
    MatOfRect RostrosMat = new MatOfRect();//cantidad de rostros detectados
    MatOfByte imgInBytes = new MatOfByte();//almacena la imagen en bytes para luego poder transaformatla con bufertimage

    Mat frame = new Mat();//la imagen de tipo mat
    Mat frameScalaGris = new Mat();//l imagen en escala de grises

    Rect[] facesArray;//almacenas las caras en rectangulos de vectores, [][][][]
    Graphics g;//para poder dibujar la imagen sobre el panel

    BufferedImage buffer = null;// almacenar la imegen de la camera

    if(videoCapture.isOpened())
    {
        System.out.println("NO ESTA ABIERTA LA CAPTURA");
    }
    else
    {
        System.out.println("SE ABRIO LA CAPTURA");
    }
    int x = 50;
    while(videoCapture.read(frame))//preguntamos si ha detectado una imagen y la ha guardado en frame entra al while
    {x = x+1;
        if(frame.empty())
        {
            System.out.println("no hay registros de imagen");
            break;
        }
        else
        {
            try 
            { 
                mainFrameView = new MainFrameView();
                g = CameraPanelView.panel1.getGraphics();//obtenemos el grafico del panel 
                Imgproc.cvtColor(frame, frameScalaGris, Imgproc.COLOR_BGR2GRAY);//porviene de la libreria de opencv para la convercion de escala de grisis para cpnbertir a otro color
                Imgproc.equalizeHist(frameScalaGris, frameScalaGris);
                double w = frame.width();//guardamos el ancho de la imagen
                double h = frame.height();//guardamos el alto de la imagen
                faceDetector.detectMultiScale(frameScalaGris, RostrosMat, 1.3, 2, 0|CASCADE_SCALE_IMAGE, new Size(30, 30), new Size(w, h) );//cantidad de caras que va a detectar 
                facesArray = RostrosMat.toArray();
                System.out.println("CARAS ENCONTRADAS: "+facesArray.length);//cantidad de caras encontradas

                //lineas para solo tomar imagen de la cara--------------------- 
                Mat m = new Mat();
                Rect r = facesArray[0];
                m = frame.submat(r);
                //---------------------------------------------------------------

                for (int i = 0; i < facesArray.length; i++) 
                {
                    /*DETECTA Y DIBUJA UN ELIPSE A LO QUE CORRESPONDE LA CARA*/
                    Point center = new Point((facesArray[i].x + facesArray[i].width * 0.5), (facesArray[i].y + facesArray[i].height * 0.5));
                    Imgproc.ellipse(frame, center, new Size(facesArray[i].width * 0.5, facesArray[i].height * 0.5), 0, 0, 360, new Scalar(255, 0, 255), 4, 8, 0);
                    /*********************FIN****************/
                    Mat faceROI = frameScalaGris.submat(facesArray[i]);                                
                    Imgproc.rectangle(frame,
                            new Point(facesArray[i].x,facesArray[i].y),
                            new Point(facesArray[i].x+facesArray[i].width,facesArray[i].y+facesArray[i].height),
                            new Scalar(123, 213, 23, 220));
                    Imgproc.putText(frame, "Ancho Cara: "+faceROI.width()+" Alto Cara: "+faceROI.height()+" X = "+facesArray[i].x+" Y = "+facesArray[i].y, new Point(facesArray[i].x, facesArray[i].y-20), 1, 1, new Scalar(255,255,255));                 
                }

                Imgcodecs.imencode(".bmp", frame, imgInBytes);
                Image img = ImageIO.read(new ByteArrayInputStream(imgInBytes.toArray()));//extreamos la matriz de bytes de la imagen para luego path 
                buffer = (BufferedImage)img;
                g.drawImage(buffer, 0, 0,CameraPanelView.panel1.getWidth(), CameraPanelView.panel1.getHeight(), 0, 0, buffer.getWidth(), buffer.getHeight(), null);
            /*  if(g.drawImage(buffer, 0, 0,CameraPanelView.panel1.getWidth(), CameraPanelView.panel1.getHeight(), 0, 0, buffer.getWidth(), buffer.getHeight(), null))
                {
                    System.out.println("luiggi");
                }*/

                if(facesArray.length>0)
                {
                    //System.out.println("luiggi");
                    // Save the visualized detection.
                    String filename = "C:\\Users\\Luiggi\\Desktop\\fotos\\captura"+x+".jpg";
                    System.out.println(String.format("Writing %s", filename));              
                    Imgcodecs.imwrite(filename,frame);

                }else
                {
                    System.out.println("nada");
                }               

            } 
            catch (Exception ex) 
            {
                Logger.getLogger(CameraModel.class.getName()).log(Level.SEVERE,null,ex);
            }
        }

    }

0 votos

Parece muy interesante :) buscando un poco por internet he encontrado este enlace, a ver si te sirve https://etienne.membrives.fr/pebibyte/articles/simple-face-recognition-using-opencv/

0 votos

gracias, Aunque si existiera algo en java se lo agradecería.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: