vista.frmPrincipal.java Source code

Java tutorial

Introduction

Here is the source code for vista.frmPrincipal.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package vista;

import deteccion.opencv.Extra;
import deteccion.opencv.Luminance;
import deteccion.opencv.Picture;
import java.awt.Color;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.DefaultListModel;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import net.sourceforge.tess4j.Tesseract;
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 fabricio
 */
public class frmPrincipal extends javax.swing.JFrame {

    ArrayList<String> lista_placas = new ArrayList<String>();
    ArrayList<String> lista_validas_parte_letra = new ArrayList<String>();
    ArrayList<String> lista_validas_parte_numero = new ArrayList<String>();
    CascadeClassifier faceDetector = new CascadeClassifier("cascade.xml");
    DefaultListModel listModel = new DefaultListModel();;
    DefaultListModel listModel_nombres = new DefaultListModel();
    MatOfRect faceDetections = new MatOfRect();
    // VideoCapture cap = new VideoCapture("rtsp://admin:12345@192.168.10.150:554//Streaming/Channels/1");
    VideoCapture cap = new VideoCapture(0);

    Mat imagen = new Mat();
    Thread hilo;
    Tesseract instance;

    private void initCamara() {
        hilo = new Thread() {

            public void run() {
                if (cap.isOpened()) {
                    while (true) {
                        try {
                            //Thread.sleep(100);
                            cap.read(imagen);
                            if (!imagen.empty()) {
                                Core.putText(imagen, Extra.retornaFecha(), new Point(10, 25), 1, 2,
                                        new Scalar(0, 255, 0), 3);
                                Core.putText(imagen, Extra.retornaHora(), new Point(10, 55), 1, 2,
                                        new Scalar(0, 255, 0), 3);
                                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));
                                    Core.rectangle(imagen, new Point(rect.x, rect.y),
                                            new Point(rect.x + rect.width, rect.y + rect.height),
                                            new Scalar(0, 255, 0), 2);
                                    Core.line(imagen, new Point(rect.x + rect.width / 2, rect.y + rect.height),
                                            new Point(imagen.width() / 2, imagen.height()), new Scalar(0, 255, 0),
                                            3);

                                    //    Imgproc.adaptiveThreshold(imagen, imagen, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 15, 4);
                                    //      Imgproc.Canny(imagen,imagen, 15, 34);
                                    //     Imgproc.threshold(imagen, imagen, -1, 255, 1);
                                    System.out.println("valor?");
                                    //   Imgproc.threshold(imagen, imagen, -1, 255, Imgproc.THRESH_OTSU);

                                    setPlacaImage(convertir(Sub_Image(imagen, rect)));

                                    setPlacaFiltradaImage(
                                            threshold(convertirBufferedImage(Sub_Image(imagen, rect))));
                                    try {
                                        String result = "ABC-0123";
                                        //  result = instance.doOCR(convertirBufferedImage(Sub_Image(imagen, rect)));
                                        //result="XBU-445   ";
                                        System.out.println(result);
                                        result = Extra.posible_placa(result);
                                        //    result=Extra.posible_placa(result);
                                        lista_placas.add(result);
                                        // System.out.println(result);
                                    } catch (Exception e) {
                                        //   System.err.println(e.getMessage());
                                    }
                                }
                                setImage(convertir(imagen));
                            }
                        } catch (Exception ex) {
                            //     Logger.getLogger(frmPrincipal.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }
            }
        };
        hilo.start();
    }

    public BufferedImage threshold(BufferedImage image) {

        int THRESHOLD = 130;
        Picture pic = new Picture(image);

        for (int i = 0; i < pic.width(); i++) {
            for (int j = 0; j < pic.height(); j++) {
                Color color = pic.get(i, j);
                double lum = Luminance.lum(color);
                if (lum >= THRESHOLD)
                    pic.set(i, j, Color.WHITE);
                else
                    pic.set(i, j, Color.BLACK);
            }
        }
        // pic.show();
        return pic.getImage();
    }

    public Mat Sub_Image(Mat image, Rect roi) {
        Mat result = image.submat(roi);
        return result;
    }

    public BufferedImage filtrar(BufferedImage bi) {
        BufferedImage biDestino = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
                .getDefaultConfiguration()
                .createCompatibleImage(bi.getWidth(), bi.getHeight(), Transparency.OPAQUE);
        for (int x = 0; x < bi.getWidth(); x++) {
            int d = 0;
            for (int y = 0; y < bi.getHeight(); y++) {
                int r = 0;
                int g = 0;
                int b = 0;
                Color c1 = new Color(bi.getRGB(x, y));
                r = c1.getRed();
                g = c1.getGreen();
                b = c1.getBlue();
                int m = (r + g + b) / 3;
                d = d + m;
                if (m > 150) {
                    m = 255;
                } else if (m < 110) {
                    m = 0;
                }

                biDestino.setRGB(x, y, new Color(r, g, b).getRGB());
                if ((d / bi.getHeight()) > 125) {
                    for (int i = 0; i < bi.getHeight(); i++) {
                        biDestino.setRGB(x, i, new Color(255, 0, 0).getRGB());
                    }
                }
            }
        }
        return biDestino;
    }

    public void setImage(Image imagen) {

        ImageIcon icon = new ImageIcon(
                imagen.getScaledInstance(jl_display.getWidth(), jl_display.getHeight(), Image.SCALE_SMOOTH));
        jl_display.setIcon(icon);

        //  panel.add(etiqueta);
        // panel.updateUI();
    }

    public void setPlacaImage(Image imagen) {
        //  panel.removeAll();

        ImageIcon icon = new ImageIcon(
                imagen.getScaledInstance(jl_placa.getWidth(), jl_placa.getHeight(), Image.SCALE_SMOOTH));
        jl_placa.setIcon(icon);

        //  panel.add(etiqueta);
        // panel.updateUI();
    }

    public void setPlacaFiltradaImage(BufferedImage img) {
        //  panel.removeAll();
        ImageIcon fot = new ImageIcon(img);
        Icon icono = new ImageIcon(fot.getImage().getScaledInstance(jl_placa_filtrada.getWidth(),
                jl_placa_filtrada.getHeight(), Image.SCALE_DEFAULT));
        jl_placa_filtrada.setIcon(icono);

        //  panel.add(etiqueta);
        // panel.updateUI();
    }

    private BufferedImage convertirBufferedImage(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 bufImage;
    }

    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;
    }

    /**
     * Creates new form frmPrincipal
     */
    public frmPrincipal() {
        initComponents();
        instance = Tesseract.getInstance(); // JNA Interface Mapping
        this.initCamara();
    }

    public void validar_placa() {
        String parte_numero = "";
        String parte_letra = "";
        String placa = "";
        lista_validas_parte_letra.clear();
        lista_validas_parte_numero.clear();
        for (int i = 0; i < lista_placas.size(); i++) {
            if (lista_placas.get(i) != null) {
                if ((lista_placas.get(i).length() == 7) || (lista_placas.get(i).length() == 8)) {
                    System.out.println("TAMAO CORRECTO");
                    parte_letra = lista_placas.get(i).substring(0, 3);
                    parte_numero = lista_placas.get(i).substring(4, lista_placas.get(i).length());
                    if ((Extra.conversionLetra(parte_letra) != null)
                            && (Extra.conversionNumero(parte_numero) != null)) {
                        lista_validas_parte_letra.add(parte_letra);
                        lista_validas_parte_numero.add(parte_numero);
                        System.out.println("placa: " + parte_letra + "-" + parte_numero);
                    }
                }
            }
        }
        parte_letra = Extra.moda(lista_validas_parte_letra);
        parte_numero = Extra.moda(lista_validas_parte_numero);
        //  System.out.println(parte_letra);
        System.out.println(parte_numero);
        if (!parte_letra.equals("") && !parte_numero.equals("")) {
            placa = parte_letra + "-" + parte_numero;
            listModel_nombres.addElement(placa);
            //    jlista_placas.setModel(listModel);
            jlista_placas.setModel(listModel_nombres);
        }

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jl_display = new javax.swing.JLabel();
        jl_placa = new javax.swing.JLabel();
        jl_placa_filtrada = new javax.swing.JLabel();
        jScrollPane3 = new javax.swing.JScrollPane();
        jlista_placas = new javax.swing.JList();
        jButton1 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        btnCerrar = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosed(java.awt.event.WindowEvent evt) {
                formWindowClosed(evt);
            }
        });

        jlista_placas.setFont(new java.awt.Font("DejaVu Sans", 1, 18)); // NOI18N
        jScrollPane3.setViewportView(jlista_placas);

        jButton1.setText("Detectar placa");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jLabel1.setText("Placa detectada:");

        jLabel2.setText("Placa procesada:");

        jLabel3.setText("Video:");

        btnCerrar.setText("Salir");
        btnCerrar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCerrarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(layout.createSequentialGroup().addContainerGap().addComponent(
                                        jl_display, javax.swing.GroupLayout.PREFERRED_SIZE, 519,
                                        javax.swing.GroupLayout.PREFERRED_SIZE))
                                .addGroup(layout.createSequentialGroup().addGap(21, 21, 21).addComponent(jLabel3)))
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(layout.createSequentialGroup()
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 35,
                                                Short.MAX_VALUE)
                                        .addGroup(layout
                                                .createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                                .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 184,
                                                        javax.swing.GroupLayout.PREFERRED_SIZE)
                                                .addGroup(layout
                                                        .createParallelGroup(
                                                                javax.swing.GroupLayout.Alignment.TRAILING)
                                                        .addComponent(jScrollPane3,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE, 184,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                                        .addComponent(jl_placa,
                                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE, 165,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                                        .addComponent(jl_placa_filtrada,
                                                                javax.swing.GroupLayout.Alignment.LEADING,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE, 154,
                                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                                        .addComponent(jLabel2,
                                                                javax.swing.GroupLayout.Alignment.LEADING)
                                                        .addComponent(jLabel1,
                                                                javax.swing.GroupLayout.Alignment.LEADING)))
                                        .addGap(69, 69, 69))
                                .addGroup(layout.createSequentialGroup().addGap(79, 79, 79).addComponent(btnCerrar)
                                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))));
        layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(layout.createSequentialGroup().addGap(15, 15, 15).addComponent(jLabel1))
                                .addGroup(layout.createSequentialGroup().addContainerGap().addComponent(jLabel3)))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(layout.createSequentialGroup()
                                        .addComponent(jl_placa, javax.swing.GroupLayout.PREFERRED_SIZE, 90,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGap(20, 20, 20).addComponent(jLabel2)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addComponent(jl_placa_filtrada, javax.swing.GroupLayout.PREFERRED_SIZE, 94,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGap(18, 18, 18)
                                        .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE,
                                                javax.swing.GroupLayout.DEFAULT_SIZE,
                                                javax.swing.GroupLayout.PREFERRED_SIZE)
                                        .addGap(18, 18, 18).addComponent(jButton1)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                        .addComponent(btnCerrar).addContainerGap(11, Short.MAX_VALUE))
                                .addGroup(javax.swing.GroupLayout.Alignment.TRAILING,
                                        layout.createSequentialGroup()
                                                .addComponent(jl_display, javax.swing.GroupLayout.DEFAULT_SIZE,
                                                        javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                .addGap(29, 29, 29)))));

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        System.out.println("VALIDANDO PLACA");
        validar_placa();
    }//GEN-LAST:event_jButton1ActionPerformed

    private void formWindowClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosed
        System.exit(0);
    }//GEN-LAST:event_formWindowClosed

    private void btnCerrarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCerrarActionPerformed
        // TODO add your handling code here:

        System.exit(0);
        hilo.destroy();
    }//GEN-LAST:event_btnCerrarActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnCerrar;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JLabel jl_display;
    private javax.swing.JLabel jl_placa;
    private javax.swing.JLabel jl_placa_filtrada;
    private javax.swing.JList jlista_placas;
    // End of variables declaration//GEN-END:variables
}