Ayuda con JFrame y Tratamiento de imagen JAVA

Iniciado por UnchainedGold40, 6 Enero 2016, 17:56 PM

0 Miembros y 1 Visitante están viendo este tema.

UnchainedGold40

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?


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

0xFer

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.
Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

UnchainedGold40

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

0xFer

Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

UnchainedGold40

Ahí esta, solo puse el run y ActionPerformed, lo demás es declaración de variables, constructor, imports, etc.

0xFer

Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}

Chuidiang

#6
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

Se bueno.

0xFer

Código (java) [Seleccionar]
int getRandomNumber(){
    return 4; //chosen by fair dice roll
              //guaranteed to be random
}