in Programming

Handwritten Java visualizer example (Corpus Semeion)

This post shows a simple Java-code to visualize the handwritten digits of semeion dataset.

 

/**
	@author vlarobbyk
	Clase en Java que permite generar una imagen del digito que se ha escrito.
*/

public class Visualizador extends javax.swing.JFrame{
	
	private String fichero;
	private final int TAM=16;
	private int digito[][]=null;

	public Visualizador(String fichero){
		super("Visualizador de Digitos");
		this.fichero=fichero;
		setSize(510,510);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		getContentPane().setBackground(java.awt.Color.WHITE);
		javax.swing.JMenuBar barra=new javax.swing.JMenuBar();
		javax.swing.JMenu archivo=new javax.swing.JMenu("Archivo");
		javax.swing.JMenuItem sel=new javax.swing.JMenuItem("Seleccionar Fila");
		sel.addActionListener(new java.awt.event.ActionListener(){
			public void actionPerformed(java.awt.event.ActionEvent e){
				String valor=javax.swing.JOptionPane.showInputDialog(Visualizador.this,"Ingrese la fila");
				try{
					Integer val=new Integer(valor);
					if(!(val>=0 && val<1593)){
						javax.swing.JOptionPane.showMessageDialog(Visualizador.this,"El rango valido de filas es [0,1592]");
					}else{
						digito=visualizar(val);
						System.out.println("Visualizando fila: "+val);
						repaint();
					}
				}catch(Exception ex){
					javax.swing.JOptionPane.showMessageDialog(Visualizador.this,"No es un numero valido...");
				}
			}
		});
		archivo.add(sel);
		barra.add(archivo);
		setJMenuBar(barra);
	}
	
	public void paint(java.awt.Graphics g){
		super.paint(g);
		java.awt.Graphics2D g2d=(java.awt.Graphics2D) g;
		java.awt.Dimension d=getSize();
		if(digito!=null){
			System.out.println(d.getWidth()+"!!"+d.getHeight());
			double dy=d.getWidth()/TAM;
			double dx=d.getHeight()/TAM;
			double paso1=dx;
			double paso2=dy;
			g2d.setColor(java.awt.Color.BLUE);
			java.awt.geom.Line2D.Double linea=null;
			java.awt.geom.Rectangle2D.Double rect=null;
			for(int i=0;i<TAM;i++){
				linea=new java.awt.geom.Line2D.Double(0.d,paso1,d.getWidth(),paso1);
				g2d.draw(linea);
				linea=new java.awt.geom.Line2D.Double(paso2,0.d,paso2,d.getHeight());
				g2d.draw(linea);
				paso1+=dx;
				paso2+=dy;
			}
			paso1=dx;
			paso2=dy;
			for(int i=0;i<TAM;i++){
				for(int j=0;j<TAM;j++){
					if(digito[i][j]==1){
						paso1=dx*j;
						paso2=dy*i;
						rect=new java.awt.geom.Rectangle2D.Double(paso1,paso2,dx,dy);
						g2d.fill(rect);
					}
				}
			}
		}
	}
	
	public int[][] visualizar(int fila){
		try{
			int matriz[][]=new int[TAM][TAM];
			java.io.BufferedReader buffer=new java.io.BufferedReader(new java.io.FileReader(fichero));
			int cont=0;
			String data=null;
			while((cont<fila)){
				data=buffer.readLine();
				cont++;
			}
			data=buffer.readLine();
			String datos[]=data.trim().split("(\\s)+");
			for(int i=0;i<datos.length;i++){
				System.out.print(datos[i]+"|");
			}
			for(int i=0,k=0;i<matriz.length;i++){
				for(int j=0;j<matriz[0].length;j++,k++){
					matriz[i][j]=new Double(datos[k]).intValue();
				}
			}
			return matriz;
		}catch(Exception e){
			e.printStackTrace();
			return null;
		}
	}
	
	public static void main(String[]args){
		new Visualizador("corpus_digitos.data").setVisible(true);
	}

}

 

Write a Comment

Comment