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:
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Ã:
1 Comments
Gracias por compartir sobre esta librerÃa, me has dado una idea para trabajar un tema para mi blog de programación. Saludos compañero.
ReplyDelete