reconocimiento de rostros Libreria OpenCV con java
para reconocimientos de caras en java vamos a utilizar la plataforma OpenCV instalada y configurada correctamente , si no saben como descargar e instalar esta aplicacion les dejo un tutorial en el siguiente link Como instalar OpenCV
es importante que lo instalen correctamente o te saldra un mundo de errores.
bueno empezemos explicaremos cada parte del codigo y al final el codigo completo:
1.vamos a crear una clase llamada detectando_caras el nombre del proyecto puede ser cualquiera luego crearemos un metodo con CascadeClassifier el cual se encargara de buscar el rostro de la persona con superficies definidas en una archivo xml :
CascadeClassifier faceDetector = new CascadeClassifier("C:\\opencv\\sources\\data\\lbpcascades\\lbpcascade_frontalface.xml");
fÃjense en la ruta que vaya a ser correcta cargando el archivo .xml :
luego el cuadro donde se va a reconocer el rostro del sujeto :
MatOfRect faceDetections = new MatOfRect();
lo otro es VideoCapture donde estara la camara de nuestro pc é Mat imagen = new Mat();
que tomara cada imagen de lo que este en la camara en ese momento el proceso puede verse lento
dentro de run() nos dice que si VideoCapture se inicializo o esta ejecutandose inicia un ciclo while
y mientras este while es infinito mientras cierre la ventana osea true cargara la imagen y llamara el metodo:
Rect rect : faceDetections.toArray() en un for el for es para determinar la cantidad de rostros detectados
algo sencillo de explicar creo que cualquier programador entenderia facil la otra cuestion es si tu sistema operativo es de x64 bits o de x86 por que demos cargar un .dll para la ejecucion del proyecto y dentro de la carpeta OpenCv nos brinda las 2 opciones mirar la siguiente imagen:
importante que la libreria que vemos opencv-2410.jar esta la debemos cargar desde nuestro proyecto y las carpetas x86 y x64 deben estar al lado de ellas.
cargamos a nuestro proyecto el .jar por defecto :
si vemos la ruta de donde se debio cargar por eso hize un tutorial de como instalar opencv en windows ahora solo nos queda cargar las librerias .ddl esto lo hacemos desde la clase
para terminar de explicar los .dll estan para 2 arquitecturas del sitema operativo x86 y x64 como sabremos cual ejecutar con el siguiente metodo podriamos saberlo:
String currentDir = new File("").getAbsolutePath();
String arch = System.getProperty("sun.arch.data.model");
if (arch.equals("64")) {
}
else{
//ejecutamos x86
}
finalmente el codigo completo:
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import opencv.DetectFaceDemo2;
import opencv.Ventana;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.highgui.VideoCapture;
import org.opencv.objdetect.CascadeClassifier;
/**
*
* @author andres2288
* http://javayotros.blogspot.com/
* http://appyjava.blogspot.com.es/
*/
public class detectando_caras {
CascadeClassifier faceDetector = new CascadeClassifier("C:\\opencv\\sources\\data\\lbpcascades\\lbpcascade_frontalface.xml");
MatOfRect faceDetections = new MatOfRect();
VideoCapture cap = new VideoCapture(0);
Mat imagen = new Mat();
public void run() {
System.out.println("Deteccion de rostros con OpenCV y Webcam en java by andres2288");
Ventana ventana = new Ventana();
if (cap.isOpened()) {
while (true) {
try {
// Thread.sleep(100);
cap.read(imagen);
if (!imagen.empty()) {
faceDetector.detectMultiScale(imagen, faceDetections);
for (Rect rect : faceDetections.toArray()) {
Core.rectangle(imagen, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
System.out.println("detectando cara" + faceDetections.toArray().length);
}
ventana.setImage(convertir(imagen));
}
} catch (Exception ex) {
Logger.getLogger(DetectFaceDemo2.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
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;
}
public static void main(String[] args) throws IOException {
String currentDir = new File("").getAbsolutePath();
String arch = System.getProperty("sun.arch.data.model");
if (arch.equals("64")) {
System.load("C:\\opencv\\build\\java\\x64\\opencv_java2410.dll");
} else {
System.load("C:\\opencv\\build\\java\\x86\\opencv_java2410.dll");
}
detectando_caras d = new detectando_caras();
d.run();
}
}
POSIBLES ERRORES:
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.opencv.highgui.VideoCapture.n_VideoCapture(I)J
este error declara que la libreria que cargastes es erronea
Exception in thread "main" java.lang.UnsatisfiedLinkError: org.opencv.highgui.VideoCapture.VideoCapture_2(I)J
este error declara que la libreria .dll que cargastes es erronea
solo es cuestion de definir las rutas para evitar errores :)
0 Comments