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.