Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Java / Java Media Framework / Proyectos / Capturar foto desde una webcam con Java Media Framework

Capturar foto desde una webcam con Java Media Framework

Autor jc mouse martes, junio 28, 2011
Como se vio en un post anterior (Capturar video de una webcam con JMF) la captura de un video desde una webcam utilizando la API de Java Media Framework, capturar una imagen, no es cosa del otro mundo, bastara con realizar unas modificaciones a nuestra clase jfmVideo.java

Los requisitos son los mismos, o casi los mismos

Para este ejemplo, se utilizara como dispositivo de captura, «vfw:Microsoft WDM Image Capture (Win32):0» que es el Controlador Universal de Windows para las camaras de video.

Que necesitamos:

  • IDE Netbeans 6.9
  • Libreria JMF (Java Media Framework) instalada y configurada en el sistema
  • Una WebCam, celular con camara tambien sirve
  • Componente jcSlide (Descargar desde aqui) para almacenar las imagenes que capturemos

1. Crea un proyecto en Netbeans y añade las siguientes clases: una clase interfaz video.java y una clas jmfVideo.java

las que estan tachadas son solo imagenes para la interfaz, no son necesarias, no te olvides de añadir la libreria Java Media Framework al proyecto.

2. Para la clase interfaz video.java, se deben añadir los siguientes objetos:

Recuerda crear los objetos con los nombres que estan en la imagen

3. El codigo de la clase jmfVideo.java es:

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.media.*;
import javax.media.cdm.CaptureDeviceManager;
import java.io.*;
import java.awt.*;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.VideoFormat;
import javax.media.util.BufferToImage;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class jmfVideo {
//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
            CaptureDeviceInfo device = CaptureDeviceManager.getDevice(dispositivo);
            //se obtiene la fuente de datos de captura
            MediaLocator localizador = device.getLocator();
            //El localizador es del tipo "vfw://0" video para windows
            //se crea el PLAYER y se ejecuta
            player = Manager.createRealizedPlayer(localizador);
            player.start();
        } catch (IOException ex) {
            Logger.getLogger(jmfVideo.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoPlayerException ex) {
            Logger.getLogger(jmfVideo.class.getName()).log(Level.SEVERE, null, ex);
        } catch (CannotRealizeException ex) {
            Logger.getLogger(jmfVideo.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;
            }
    }

    //Metodo para capturar la imagen de la webcam
    Image img = null;
    public void capturarImagen(){
        FrameGrabbingControl ControlFG = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
        Buffer buffer = ControlFG.grabFrame();
        // creamos la imagen awt
       BufferToImage imagen = new BufferToImage((VideoFormat)buffer.getFormat());
       img = imagen.createImage(buffer);
    }

    public Image getImagen(){
        return img;
    }

    public void setImage(JLabel lb){
        capturarImagen();        
        lb.setIcon( new javax.swing.ImageIcon( img ) );
        System.out.println("ancho= " + img.getWidth(null));
        System.out.println("alto= " + img.getHeight(null));
    }

}
4. Para implementar esta clase en la interfaz, el codigo es el siguiente

Esto se debe colocar en el constructor, no es cuestion de copiar y pegar, analiza el codigo

jmfVideo b = new jmfVideo();
    /** Creates new form video */
    public video() {
        initComponents();
        this.setTitle("Captura de Imagen desde WebCam - by Mouse");
        //formulario al centro de la pantalla
        this.setLocationRelativeTo(null);
        //se coloca un layout tipo CAJA        
        VIDEO.setLayout(new javax.swing.BoxLayout(VIDEO, javax.swing.BoxLayout.LINE_AXIS));
        //se añade el componente de video
        VIDEO.add(b.Componente());
        imagen.setText("");
    }

El codigo para los botones es:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        b.capturarImagen();
        jcSlide1.setImagen(new ImageIcon(b.getImagen()));        
    }                                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        if( jcSlide1.getImagen() != null ){
            imagen.setIcon( jcSlide1.getImagen() );
        }else{
        JOptionPane.showMessageDialog(this,"Por favor. Debe seleccionar una imagen...");
        }
    }

Si todo salio bien, solo es cuestion ejecutar el proyecto

Algunas imagenes tomadas con la webcam
un par de chicas que pasaban por ahi
Unas gradas 🙂 si, como dije ese dia hizo frio y no habia mucha gente
Sin comentarios 😉
Un video de como funciona la aplicación, lastimosamente ese dia amanecio nublado  asi que no hubo mucho que filmar 🙂
Lo que todos esperaban, el código fuente
Felices capturas  – FIN

Tags

Si te ha gustado podrías compartirlo o dejar un comentario. ¡Muchas gracias!
Autor: JC Mouse

Yo soy yo :) JC Mouse, Soy orgullosamente boliviano soy fundador y CEO de la web jc-Mouse.net uno de las pocas web en emprendimiento y tecnología en Bolivia.

Toda la información que encuentres en este sitio es y sera completamente gratis siempre, puedes copiar, descargar y re-publicar si así lo deseas en otros blogs o sitios web, solo te pido a cambio que dejes una referencia a esta web. Esto nos ayuda a crecer y seguir aportando. Bye

Enjoy! :)

También Te Podría Interesar

Ada Lovelace

Ada Lovelace

Augusta Ada King (1815-1852) , mas conocida como condesa de Lovelace o simplemente Ada Lovelace, fue una matemática brit...

Crear componente Switch de Android para Java Swing

Crear componente Switch de Android para Java Swing

En este post crearemos un componente que solo hay en android y que no esta disponible en la paleta de controles de Netbe...

Rompecabezas con forma irregular

Rompecabezas con forma irregular

En este post vemos una manera de como crear un juego de rompecabezas en java sin el uso de java2d, ademas, las piezas de...

El indice TIOBE

El indice TIOBE

El índice TIOBE (TIOBE, The Importance of Being Earnest – «La importancia de ser honesto» – referencia a la...

Conectar java con Firebird

Conectar java con Firebird

En este tutorial veremos la forma de conectarse a una base de datos de Firebird utilizando el lenguaje Java y el IDE Net...

Botón en java de Windows 8 Modern UI

Botón en java de Windows 8 Modern UI

En este tutorial crearemos un botón con el estilo del nuevo windows 8 Modern UI que primero se conoció como Metro UI.  E...

19 comentarios en “Capturar foto desde una webcam con Java Media Framework”

  1. fox2236 dice:

    Gracias oh sabio y poderoso…

    probare tu codigo. gracias por compartirlo, saludos y poderes magicos.

  2. Andres dice:

    Gracias esta muy bueno,por casualidad sabes alguna forma de grabar en el disco el video capturado por la webcam a traves de jmf.

    saludos.

  3. rdrriera dice:

    de pana que esta muy bien este programa…

    recuerda que estas motivando a la programacion sigue asi, muchas personas te lo vamos a agradecer

  4. Oswaldo dice:

    Muy buen tema Mouse, tengo una pregunta al momento de pasar la imagen capturada a la jlabel como le puedo dar un tamaño determinado, ya que la imagen sale muy grande.

    Saludos desde Chihuahua Mex.

    1. Mouse dice:

      cuando capturas la imagen con JFM esta toma el tamaño de la camara a menos que le indiques lo contrario, ahora que si quieres pasarla al jlabel, puedes redimensionarla en memoria utilizando java2d

  5. mrk0z4 dice:

    Excelente tema el que has escrito.

    Solo tengo un pequeño inconveniente al momento de correr tu ejemplo. Tal vez sea problema mío, pero quería comentártelo de todas maneras. Cuando intentas correr el proyecto, marca un problema cuando quieres instanciar la clase MediaLocator, desde la clase jmfVideo.

    ¿A crees que se pueda deber?

    De antemano, te agradezcto tu atención.

    1. Mouse dice:

      :/ pues tendria que hecharle un ojo al codigo, tiempo que no veo jmf, pero talvez sea que estes utilizando windows 7, ya muchos me contaron que JMF tiene problemas con ese sistema operativo

  6. andres dice:

    como agrego el componente jcSlide? si no me aparece en la palette de netbeans?, ya agrege la libreria del jcSlide

    1. Mouse dice:

      en el palette, clic derecho -> administrador de paleta -> añadir archivo de jar, buscas el jar que descargaste y dentro buscas el archivo jcSlide, OJO solamente ese archivo y le dices terminar 🙂

      1. andres dice:

        ya lo agrege, gracias, ahora tengo otra duda, cuando corro el programa me aparece un NullPointerException y no se porque, tienes idea del porque?

  7. hugo dice:

    Hola. como podría hacer lo mismo pero con una cámara ip.
    que en ves de que me tome un dispositivo del ordenador le ponga directo la dirección ip.

    Espero puedas contestarme.

    Gracias por compartir.

  8. Jose Rios dice:

    Mouse Faltan las librearas NO las encuentro por ningún lado

    1. Mouse dice:

      las librerías de JMF las descargas de su web (http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140239.html) y la libreria jcslide de mi blog (http://jc-mouse.blogspot.com/2011/03/jcslide-contenedor-de-imagenes.html‎) :/ creo que esa ya venia en el rar del proyecto 🙂

  9. Victor dice:

    Hola Jc-mouse primero que nada muchas gracias por el tutorial me a sido de mucha ayuda, pero tengo una duda:
    como puedo darle un formato yuv de 176 x 174 a la imagen para que se guarde con el mismo tamaño, en lugar de los 640 x 480 que me sale por defecto? para adaptarlo bien a mi proyecto

    Saludos

    1. Mouse dice:

      depende de la cámara que uses, debes verificar si soporta ese tamaño, sino, lo que puedes hacer es una ves que capturas la foto, la recortas a las dimensiones que tu desees

  10. john dice:

    Mouse……

    Me puedes colaborar con el siguiente error debido que me sale al ejecutarlo.

    Exception in thread «AWT-EventQueue-0» java.lang.NullPointerException
    at jmfvideoimage.jmfVideo.Componente(jmfVideo.java:28)
    at jmfvideoimage.video.(video.java:21)
    at jmfvideoimage.video$3.run(video.java:160)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
    Me puedes colaborar con esto. Gracias

    1. Mouse dice:

      java.lang.NullPointerException en la linea 28 del archivo jmfVideo 🙂

  11. Eduar Navarro dice:

    Hola Gracias Mouse he Hecho todo y me funciona perfecto, tengo un problema cuando me genera el jar no me reconoce nada de jmf no me sale para seleccionar la camara,
    he hecho de todo he copiado las librerias a la carpeta dist/lib y aun sigue el error , no se porque no me muestra la camara, pero desde netbeans si lo muestra todo, el problema es cuando genero el jar de la aplicacion, espero me ayudes, gracias

    1. Mouse dice:

      cuando creas el JAR las librerias por lo general se colocan en la carpeta DIST a lado de tu JAR, si no es asi, debes revisar las propiedades de tu proyecto y ver que las librerias de JMF esten correctamente agregadas a tu proyecto en netbeans

Los comentarios estan cerrados

Los comentarios están cerrados para este post
Comparte lo que sabes

Categorias

Últimas entradas

Por lo general se usan transacciones a nivel base de datos y posteriormente se llaman estos a través de procedimientos a...

En este post, aprenderemos como conectar Visual Basic 6 con SQL Server, abrir una tabla, leer su contenido y mostrar est...

Lo que veremos en este post es la configuración del driver para PHP de SQL Server que ha creado Microsoft el cual permit...

Google Bard la inteligencia artificial de Google se actualiza con una mejora que entra a competir con el resto de IAs y...

Herramientas

Generador de Enlaces a Whatsapp