Foro de elhacker.net

Programación => Java => Mensaje iniciado por: UnchainedGold40 en 6 Enero 2016, 17:56 pm



Título: Ayuda con JFrame y Tratamiento de imagen JAVA
Publicado por: UnchainedGold40 en 6 Enero 2016, 17:56 pm
Buenas! estoy trabajando con OpenCV, una librería de T.D.I., pero me tope con un problema creo yo muy fácil de resolver, solo que no se que pasa :v tengo una función en mi clase que se llama run(), esta toma la imagen de la cámara, hace el tratamiento y repinta el JFrame, y esta se manda llamar con un JButton, o sea que básicamente al pulsar el botón hace una captura de imagen, le hace el tratamiento y la pone en el frame.
Todo iba bien hasta que quise hacer eso video, simplemente haciendo que el run se ejecutara n veces con un for, el problema es que al ejecutarlo, se toma la captura de imagen n veces, se hace el tratamiento n veces, pero se repinta el Frame solo una vez  :(  entonces lo que hace es lo mismo, solo imprime una imagen, pero mas lento xD entonces, no se que rayos le pasa :v algún consejo?

Código:
    public void run() {   
        capture.read(imgcamara); 
        if(!imgcamara.empty()){   
            System.out.println("SI entre al run");


            //////////////tratamiento con OpenCV
            Imgproc.cvtColor(imgcamara, imagenhsv, Imgproc.COLOR_BGR2HSV); 
            Core.inRange(imagenhsv, hsv_min, hsv_max, thresholded);           
            Core.inRange(imagenhsv, hsv_min2, hsv_max2, thresholded2); 
            Core.inRange(distance,hsv_min3, hsv_max3, thresholded2); 
            Core.split(imagenhsv, lhsv);
            S = lhsv.get(1); 
            V = lhsv.get(2); 
            Core.subtract(array255, S, S); 
            Core.subtract(array255, V, V); 
            S.convertTo(S, CvType.CV_32F); 
            V.convertTo(V, CvType.CV_32F); 
            Core.magnitude(S, V, distance);   
            Core.bitwise_and(thresholded, thresholded2, thresholded); 
            Imgproc.GaussianBlur(thresholded, thresholded, new Size(9,9),0,0); //despiexelea
            Imgproc.HoughCircles(thresholded, circles, Imgproc.CV_HOUGH_GRADIENT, 2, thresholded.height()/4, 500, 50, 0, 0);   
            rows = circles.rows(); 
            elemSize = (int)circles.elemSize(); 
            data2 = new float[rows * elemSize/4]; 
            if (data2.length>0){ 
                circles.get(0, 0, data2); 
                for(int i=0; i<data2.length; i=i+3) { 
                    Point center= new Point(data2[i], data2[i+1]); 
                    Core.ellipse( imgcamara, center, new Size((double)data2[i+2], (double)data2[i+2]), 0, 0, 360, new Scalar( 0, 0, 0 ), 3, 0, 0 );
                } 
            }   
            ///////////////fin del tratamiento

            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {}
            panel1.setimagewithMat(imgcamara);
            CapturaDeCamara.repaint();   
            System.out.println("SI repinte");
        }
        System.out.println("SI sali del run");
    }   
    public void actionPerformed(ActionEvent event){
        if(event.getSource() == iniciar){
            for(int k = 0; k<10; k++){
                run();
            }
        }
    }


Título: Re: Ayuda con JFrame y Tratamiento de imagen JAVA
Publicado por: 0xFer en 6 Enero 2016, 18:17 pm
Chamaco un for se ejecuta demasiado rápido, deberías poder un retraso( Sleep) en cada iteración para que se pueda notar el efecto.


Título: Re: Ayuda con JFrame y Tratamiento de imagen JAVA
Publicado por: UnchainedGold40 en 6 Enero 2016, 18:38 pm
Ya había intentado con sleep, pero aun con un retraso de 1 seg, no se repinta, solamente lo hace hasta que termina el for


Título: Re: Ayuda con JFrame y Tratamiento de imagen JAVA
Publicado por: 0xFer en 6 Enero 2016, 18:43 pm
Publica tu código  :-\


Título: Re: Ayuda con JFrame y Tratamiento de imagen JAVA
Publicado por: UnchainedGold40 en 6 Enero 2016, 18:58 pm
Ahí esta, solo puse el run y ActionPerformed, lo demás es declaración de variables, constructor, imports, etc.


Título: Re: Ayuda con JFrame y Tratamiento de imagen JAVA
Publicado por: 0xFer en 7 Enero 2016, 16:33 pm
Pues ni idea  :-( ...


Título: Re: Ayuda con JFrame y Tratamiento de imagen JAVA
Publicado por: Chuidiang en 7 Enero 2016, 23:03 pm
Hola:

En java hay un hilo llamado EDT (Event Dispatch Thread) que es el encargado de atender eventos de ratón (click en botones) y de pintar ventanas. Si con un evento de ratón tardas mucho (tu método actionPerformed()), no se repintará ninguna ventana (ni nada), hasta que tu método acabe.

Cuando se llama a tu actionPerformed() y llamas a run() y te lías a hacer bucles y esperas, NADA se repintara en tus ventanas hasta que terminen todos tus bucles y esperas, es decir, el efecto que dices, sólo se pinta cuando acabas.

Para evitar esto, tu actionPerformed() debe lanzar un nuevo hilo para realizar todas esas operaciones que estás haciendo, de esta forma, el hilo EDT se libera inmediatamente permitiendo el repintado de ventanas mientras el hilo creado por tí trabaja con sus bucles y esperas.

Más info aquí EDT (http://chuwiki.chuidiang.org/index.php?title=El_EDT_(Event_Dispatch_Thread)_de_Java)

Se bueno.


Título: Re: Ayuda con JFrame y Tratamiento de imagen JAVA
Publicado por: 0xFer en 8 Enero 2016, 00:13 am
Muy útil la información @Chuidiang  ;D