Ya teniendo OpenCV instalado y funcionando, es hora de ponerlo a trabajar. La mejor manera es cargar una imagen. OpenCV soporta varios tipos de imagenes, entre ellas las mas usadas (jpg, bmp, png). El formato común que no soporta es gif, creo que es debido a cuestiones de las patentes que tiene este formato de imagen que impiden que se use sin pagar regalias.
OpenCV esta constituido de varios modulos como Core, Highgui, Features2d, video, imgproc, etc. El modulo que nos va a servir para cargar la imagen es highgui. Este modulo contiene el metodo imread que pasa una imagen a formato soportado por OpenCV ( imread ).
El codigo es sencillo para realizar la accion:
//Imports al inicio de la clase
import org.opencv.core.*;
import org.opencv.imgproc.*;
import org.opencv.ml.*;
import org.opencv.utils.*;
import org.opencv.highgui.*;
import org.opencv.objdetect.*;
import org.opencv.video.*;
//Metodo de carga de imagen mediante OpenCV
//param: rutaImagenEnPC es la ruta completa o relativa de la imagen que deseas cargar
public static Mat loadImage(String rutaImagenEnPC){
//Definir la matriz que contendra la imagen
Mat imData = null;
//Llenar la matriz con la imagen, tambien se le dice a openCV que la carge como imagen de color
imData = Highgui.imread(rutaImagenEnPC, Highgui.CV_LOAD_IMAGE_COLOR);
// Forzamos a OpenCV tenga los datos como bytes sin signo
//(valores de 0 a 255 por pixel por capa)
imData.convertTo(imData, CvType.CV_8UC3);
return imData;
}
Para poder desplegar la imagen en Java contamos con la clase BufferedImage. Esta clase puede ser desplegada en una aplicacion grafica de java usando AWT o Swing.
Para ello podemos usar la siguiente funcion:
public static BufferedImage convertImage(Mat baseImage) {
//Optenemos el ancho y alto de la imagen
int width = baseImage.width();
int height = baseImage.height();
//creamos una instancia de BufferedImage y le pasamos el ancho y alto
//mas el formato de la imagen que sera RGB
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// Se extrae la clase grafica de BufferedImage, ya que es la que nos permititra
//copiar la imagen de OpenCV a BufferedImage
Graphics2D graphics = (Graphics2D) bi.getGraphics();
//Por default ponemos la imagen en negro
graphics.setBackground(new Color(255, 255, 255, 0));
//Limpiamos toda la imagen, no es necesario, pero solo para estar seguros
graphics.clearRect(0,0, (int)bi.getWidth(), (int)bi.getHeight());
//Ahora recorremos cada pixel de la imagen
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
//Extraemos el pixel, el pixel consta de 3 valores R, G y B
double[] data = baseImage.get(i, j);
int r = 0;
int g = 0;
int b = 0;
r = (int) data[2];
g = (int) data[1];
b = (int) data[0];
//Se procede a crear un valor entero que contenga los 3
//componentes mezclado de la siguiente manera:
// 00RRGGBB
//La anterior es una representacion hexadecimal de un entero
//en java, cada byte ocupa 2 digitos.
//Un entero en java tiene 4 bytes, solo necesitamos 3 para
//poner los valores de R, G y B, asi que el primer byte se queda sin valor
//La siguiente operacion realiza el acomodo de los byte de R, G y B
int col = (r << 16) | (g << 8) | b;
//El entero con la informacion de los colores es pasada a la
//clase BufferedImage
bi.setRGB(j, i, col);
}
}
return bi;
}
Para crear un componente que podemos añadir a un elemento JPanel o JFrame podemos usar la siguiente funcion:
public static ImagePane createImagePanel(BufferedImage img){
//Solo se necesita crear el ImagePanel con BufferedImage como parametro
ImagePanel panel = new ImagePanel(CoreManager.bi);
return panel;
}
La clase ImagePanel esta diseñada para poderse usar directamente en swing como cualquier panel. Voy a omitir el codigo que hace la interface grafica, ya que la mayoria de los editores de java que existen hacen la creacion de interfaces JFrame de manera automatica y permiten la creacion de la interface mediante el arraste de figuras desde una ventana del mismo editor. Aqui un ejemplo de esto por :
Despues de crear tu interface grafica puedes usar los metodos que publico para visualiza la imagen de OpenCV en Java
No hay comentarios:
Publicar un comentario