Manejar WebCam o camaraWeb desde JAVA

Iniciado por cyberserver, 15 Mayo 2010, 20:32 PM

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

josco

bueno, sigo en las mismas  :rolleyes: :rolleyes:, como en la escuela solo nos ensenan a programar en java con netbeans, y no nos ensenan a crear botones desde cero, tengo dudas respecto al ultimo codigo  :-\ :-\, ya le intente de muchas maneras pero no lo puedo hacer jalar.
bueno te explico las dudas:

1.- no se donde poner exactamente este codigo:

clase ejemplo implements ActionListener{

public CamaraWeb ver;
ver = new CamaraWeb();


public void actionPerformed(ActionEvent e){

if(e.getSource()==jButton1){
this.jLabel1.setLayout(null);
        this.jLabel1.add(ver.VerCamara(0, 0, 140, 180));
}
if(e.getSource()==jButton2){
                int resultado;
resultado=ver.Fotografiar("fotosjava", true, "imagen1");
        if(resultado==1){
                    //Se tomo la fotografia
                }else{
                   //Error en la fotografia
               }
}
}

}


donde dice: clase ejemplo implements ActionListener{

no es en clase class??

este codigo va en la misma clase CamaraWeb?? o en el jframe?? o donde??

bueno te dejo un video para que veas lo que hago puedes adelantarle al minuto 7:30 es la parte donde termino de matar moscas a canonazos jaja, y empiezo a intentar con tu codigo:

el video lo puedes descargar de aqui: http://www.megaupload.com/?d=3KPBBLV1

pesa como 27 MB

espero no te moleste, ojala y me puedas ayudar saludosss ;D ;D ;D ;D

cyberserver

#11
OK MEN ya entendi lo siento si te confundi. por cierto estuvo chido el video se ve que ya te dominas el NetBeans!!!!

Mira segun lo que yo pude ver (corrigeme si me equivoco).

Tus metodos para los eventos del boton los genera automaticamente el IDE pero estos se van agregarndo a tu clase que se llama ventana.java dentro esta tambien el public static void main (String[] args).

Mira el error que te manda mi clase es por k estas instanciando dos veces( instancias es cuando crear un objeto de tipo de la clase CamaraWeb objeto=new CamaraWeb()), por decirlo de otro cuando ases esto automaticamente la clase por medio del constructor inicializa la camaraweb sin que tu te des cuenta pero tu no puedes verla asta que llames al evento VerCamara(), entonces si instancias 2 veces estas cargando una camara web que ya en uso la primera ves.!!! es por eso que te marca ese error de

Citarcapture device in use

Entonces para solucionar este error y juntarlo con tu codigo tenemos que declarar una variable GLOBAL(esta se declara fuera de cualquier metodo y su funcion es k pueda ser accesible desde cualquier metodo de la clase).

Declarar una Variable global:

class ventana{

public CamaraWeb Ver=new CamaraWeb();

public static void main (String[] args) {

    }

}



en el codigo de arriva declaramos a Ver de tipo CamaraWeb como Variable GLOBAL entonces podremos acceder y hacer uso de ella desde cualquier metodo que este dentro de la clase ventana.

ahora pues. para resolver el problema de tu codigo tendremos que hacer esto.

class ventana{

public CamaraWeb Ver=new CamaraWeb();
//Es Ver con malluscula la primera no te vallas a confundir abajo

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        this.jLabel1.setLayout(null);
        this.jLabel1.add(Ver.VerCamara(0, 0, 140, 180));
    }

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        int resultado=Ver.Fotografiar("fotosjava", true, "imagen1");
        if(resultado==0){
JOptionPane.showMessageDialog(null,"Error en la Fotografia");
}

    }

public static void main (String[] args) {

    }
}


Y Bingo, con esto resolvimos el dilema de instanciar dos veces a la clase...... viste que solo lo hisimos una ves con el objeto o variable "Ver".....  ;D

Espero haber sido lo mas claro posible, y cualquier duda hasmela saber. atte: CyberServer






josco

gracias men. ya funciona a la perfeccion este es el codigo de la ventana: me sale un warning el declarar:
public CamaraWeb Ver = new CamaraWeb();
pero ya funciona ;-) ;-) ;-) ;-) ;-)

aqui esta todo el  codigo de la ventana:


package camara;


import javax.swing.JOptionPane;

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

/*
* ventana.java
*
* Created on 18/05/2010, 12:53:18 PM
*/

/**
*
* @author Noe
*/

public class ventana extends javax.swing.JFrame {

    /** Creates new form ventana */
public CamaraWeb Ver = new CamaraWeb();

    public ventana() {
        initComponents();

    }

    /** 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">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("                                            ");
        jLabel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

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

        jButton2.setText("Fotografiar");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(21, 21, 21)
                .addComponent(jButton1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 206, Short.MAX_VALUE)
                .addComponent(jButton2)
                .addGap(27, 27, 27))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(44, Short.MAX_VALUE)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 301, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(60, 60, 60))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(19, 19, 19)
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 218, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 29, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        this.jLabel1.setLayout(null);
        this.jLabel1.add(Ver.VerCamara(0, 0, 300, 250));
     
    }                                       

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        int resultado=Ver.Fotografiar("fotosjava", true, "imagen1");
        if(resultado==0){
        JOptionPane.showMessageDialog(null,"Error en la Fotografia");
        }
 
    }                                       

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ventana().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify
    public javax.swing.JButton jButton1;
    public javax.swing.JButton jButton2;
    public javax.swing.JLabel jLabel1;
    // End of variables declaration

}




y dejo tambien el proyecto en netbeans. lo pueden descargar de aca:

http://www.4shared.com/get/293555022/a77f647f/camara_web_netbeans_proyect.html

gracias por la ayuda cyberserver. ahora si va a quedar bien chido mi proyecto de la biblioteca jaja  ;D ;D ;D

cyberserver

Orale compa ya estas!! que bueno que te aya servidor :P saludos desde Atlacomulco  ;-) ;-) ;-)






gochiman

Amigo esta muy bien tu clase... te cuento que yo estoy desarrollando un aplicacion y basicamente hago lo mismo que tu ..pero mi aplicacion difiere un tanto.. yo uso (o pretento usar) varias webcam o fuenets de capturas... el problema viene con JMF registry

Código:

CamaraWeb(){
      Manager.setHint( Manager.LIGHTWEIGHT_RENDERER, true );
      try{
         ml = new MediaLocator("vfw://0");
         p = Manager.createRealizedPlayer(ml);
         video = p.getVisualComponent();
         p.start();
          if ( video != null ){
                  componente=video;
         }
      }catch(Exception e){
         JOptionPane.showMessageDialog(null,"Error de Comunicacion con la WebCam " + e);
      }
   }



pues bien... para manejar varios dispositvos no hago esa asigancion fija al MediaLocator.. sino uso el metodo getDeviceList(Format).... bien esto me funciona pasando como formtao el RGB, pero solo me devuelve una posicion al vector... es decir ; solo ve una camara; y desde el JMF registry al agregar dispositivos y ponerlo a detectar solo me detecta uno-... y claro lo llama vfw:.......:0 = vfw://0 yo necesitaria poder usar el vfw://1 //2 // 3

no se si me he explicado.... yo estoy convencido que el codigo no es el problema sino lo es el hecho que el registry solo me muestra cualquier webcam como un dispositivo vfw://0

en resumidas cuentas... como harias tu para manejar varias camaras? ¿han tenido ese problema antes?  ¿como se puede solucionar?

A: las camaras las reconoce y son compatibles ya que he probado la aplicacion corriendo una sola camara y lo hace a la perfecccion indistintamente de cual este conectada...

Si me pueden ayudar lo agradeceria mill veces he visto cualqueir cantidad de foros y de verdad ya no se como solucionar esto...

Nakatsukasa Itero

he estado viendo su post y a mi jefe le gustó y descargo e implementó la captura de la fotografía con camaras web y java pero dice que en un futuro quiere implementar los sistemas que creamos de tal forma que el cliente no deba hacer pasos extras de instalacion, simplemente el del sistema, entonces se encontró que cada vez que debemos de instalar un sistema tenemos que fijarnos en el sistema operativo para tener los componentes/librerias necesarios, entonces surge la duda en que si hay alguna libreria ue sea multiplataforma :D que no tenga que instalarse, sino que ya vaya (o podamos) empaquetada con el proyecto y que incluso si eso se puede, por medio de un asistene que nosotros empezamos a implementar (como un instalador) solo descargue la aplicacion de la pagina de la empresa y el asistente mismo le instala la aplicacion ya "compilada".

dijo que encontro una libreria con un nombre que no recuerdo que tenia una "L" que segun el leyó la susodicha letra es por Linux, pero no ha encontrado nada parecido o su homónima para Ventanas alguien tiene alguna idea.

por su ayuda en ambas o alguna de las preguntas se los agradezco
Kanashimi no Itero

Proteus1989

Sabéis porque me puede dar este error cuando se lanza el hilo?

Código (java) [Seleccionar]

Exception in thread "VFW Request Thread" java.lang.UnsatisfiedLinkError: JMFSecurityManager: java.lang.UnsatisfiedLinkError: no jmvfw in java.library.path
at com.sun.media.JMFSecurityManager.loadLibrary(JMFSecurityManager.java:206)
at com.sun.media.protocol.vfw.VFWCapture.<clinit>(VFWCapture.java:19)
at com.sun.media.protocol.vfw.VFWSourceStream.doConnect(VFWSourceStream.java:241)
at com.sun.media.protocol.vfw.VFWSourceStream.run(VFWSourceStream.java:763)
at java.lang.Thread.run(Unknown Source)

Iwan

Hola, tenía un código muy parecido al tuyo cyberserver pero me aparecía el error "java.io.IOException: Could not connect to capture device" así que he probado a copiar el tuyo literalmente, el caso es que en el momento de la llamada p = Manager.createRealizedPlayer(ml); sigo teniendo exactamente el mismo problema: me salta una ventana con titulo "Origen de video"  y dentro una pestaña que dice "origen de la captura". En ella selecciono la única opción que es el nombre de mi webcam me da la excepción y entonces me salta nuevamente la ventana me vuelve a dar la excepcion y ya salta a la excepción propia del contructor. He consultado ya en mil sitios pero no encuentro solución... alguna sugerencia??

Un saludo y gracias de antemano

josco

Descarga el proyecto que esta para netbeans lo hice yo josco mas arriiva esta. ese deberia funcionar

Iwan

#19
No se, es todo muy raro, ahora me sigue dando el mismo error pero parece que traga con él, se abre el JFrame que se tiene que abrir pero en el Jpanel que añado el componente aparece una pantalla rosa. Cuando minimizo el JFrame, en la parte que estaba al Jpanel y sobre cualquier tipo de ventana (escritorio, navegador, otras ventanas, el propio NetBean) aparece una captura de la webCam correspondiente al momento de minimizar la ventana... Dejo el código por si sirviese de ayuda para solucionar esto que me trae ya de cabeza...:

el actionPerformance que llama al Jframe:
   
       
       private void VideoCamActionPerformed(java.awt.event.ActionEvent evt) {                                        
       // TODO add your handling code here:
       //Se pide el nombre del nuevo directorio. Y se crean los directorios de las
       //distintas emociones en él.
       IODialog entradaSalida = new IODialog();
       String pathBaseDD;
       String directorioFuente = entradaSalida.readLine("Introduce el \n"
                              + "nombre de la nueva base de datos");

       pathBaseDD = CreaDirectoriosBaseDatos(directorioFuente);
       
       // Se crea el objeto        
       VentanaWebCam h1 = new VentanaWebCam();
       // se añade al jDesktopPane
       jDesktopPane1.add(h1);
       h1.SetPath(pathBaseDD);
       //se muestra en pantalla
       h1.setVisible(true);        
   }


la parte del JFrame implicada:


   public VentanaWebCam() {
       initComponents();
       VideoPanel.add(video.Componente());
   }


La clase que maneja la webCam:


public class VideoJMF {
   //Controlador universal de windows
   private String dispositivo = "vfw:Microsoft WDM Image Capture (Win32):0";
   private Player player = null;

   public Component Componente(){
   Component componente_video;
       try {
           
           // Se obtiene el dispositivo        
           
           MediaLocator localizador = new MediaLocator("vfw:\\Device\\0000008b");  

           player = Manager.createRealizedPlayer(localizador); //Aqui sale la ventana //que me pregunta por el dispositivo de captura de video y da el error //java.io.IOException: Could not connect to capture device sin embargo ya solo //sale una vez y la aplicacion sigue su curso. Salvo por el problema de la pantallita //rosa :S

           player.start();            
       } catch (IOException ex) {
           Logger.getLogger(VideoJMF.class.getName()).log(Level.SEVERE, null, ex);
       } catch (NoPlayerException ex) {
           Logger.getLogger(VideoJMF.class.getName()).log(Level.SEVERE, null, ex);
       } catch (CannotRealizeException ex) {
           Logger.getLogger(VideoJMF.class.getName()).log(Level.SEVERE, null, ex);
       }
       //Si se pudo crear el PLAYER, se obtiene el componente de video
       if ((componente_video = player.getVisualComponent()) != null) {
               //se da un tamaño al componente
               //componente_video.setSize(320, 240);
               return componente_video;
           } else {
               JOptionPane.showMessageDialog(null,"No se pudo crear el video...");
               return null;
           }
   }

}


Saludos