Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube
JC Mouse Bolivia
Index / Java / Java Media Framework / Filtros con JMF y una webcam [Proyecto]

Filtros con JMF y una webcam [Proyecto]

Autor jc mouse viernes, julio 22, 2011
En esta oportunidad dejo a consideracion un proyecto para la captura de video desde una webcam, utilizando filtros como ser (Filtro Blanco y Negro, Filtro Escala de Grises, Filtro Negativo/Invertir), en post anteriores deje el codigo de varios otros filtros, los cuales pueden ser añadidos sin problemas a este proyecto.

Comencemos:

  • Necesitamos las librerias de Java Media Framework
  • Un IDE, en este caso Netbeans 6.9
  • Una webcam
  • 15 minutos de su tiempo

El proyecto:

Creamos un nuevo proyecto en netbeans y agregamos un JFrame, este sera nuestra interfaz de usuario, la llamamos «interfaz.java», entonces debemos añadir los siguientes componentes, como se muestra en la imagen de abajo

Antes de continuar recordemos que es un video sino una secuencia de images, tambien llamados frames, pues bien, lo que haremos sera capturar el video de la webcam utilizando el API de JMF, extraer un frame y antes de mostrarlo en pantalla, aplicarle un filtro, una vez hecho esto, la imagen estara lista para ser vista por el usuario, realizaremos esto para cada frame del video capturado.
Debemos crear una nueva clase en el proyecto, la llamaremos jmfVideo.java, esta clase que implementa el API de JMF, nos permite capturar el video desde la web, ademas le agregamos unos metodos para filtrar las imagenes antes de mostrarlas al usuario, el codigo esta comentado, pero si tienes alguna duda, te sugiero que visites los post anteriores sobre JMF para aclararlas. Para este proyecto dejo por hecho que ya conoces el uso e implementacion de JMF en Java.
import javax.media.*;
import javax.media.cdm.CaptureDeviceManager;
import java.io.*;
import java.awt.*;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.VideoFormat;
import javax.media.util.BufferToImage;
import javax.swing.JOptionPane;
/**
 * @web https://www.jc-mouse.net/
 * @author Mouse
 */
public class jmfVideo {
//Controlador universal de windows
    private String dispositivo = "vfw:Microsoft WDM Image Capture (Win32):0";
    private Player player = null;
    private int Opcion = 1;
    private Image img=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) {            
        } catch (NoPlayerException ex) {            
        } catch (CannotRealizeException 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
    public Image capturarImagen2(){
       FrameGrabbingControl ControlFG = (FrameGrabbingControl) player.getControl("javax.media.control.FrameGrabbingControl");
       Buffer buffer = ControlFG.grabFrame();
        // creamos la imagen awt
       BufferToImage imagen = new BufferToImage((VideoFormat)buffer.getFormat());
       //se convierte a BufferedImage
       BufferedImage photo = (BufferedImage) imagen.createImage(buffer);       
       switch (Opcion){
           case 1: img = imagen.createImage(buffer);
           case 2: photo = set_Blanco_y_Negro(photo); img = toImage(photo); break;
           case 3: photo = set_Escala_de_Grises(photo); img = toImage(photo); break;
           case 4: photo = SetInvertir(photo); img = toImage(photo); break;
       }      
       return img;
    }

    public void setOpcion(int op){
        this.Opcion = op;
    }

   /* Metodos para los filtros */
   private BufferedImage set_Blanco_y_Negro(BufferedImage f){
        BufferedImage bn = new BufferedImage(f.getWidth(),f.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
        for(int i=0;i<f.getWidth();i++){
          for(int j=0;j<f.getHeight();j++){
                bn.setRGB(i, j, f.getRGB(i, j));
          }
        }
        return bn;
    }

    private BufferedImage set_Escala_de_Grises(BufferedImage f){
       ColorConvertOp ccop = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
       return ccop.filter((BufferedImage)f,null);
    }

    private int r,g,b;
    private Color color;
    private BufferedImage SetInvertir(BufferedImage ff){
        BufferedImage f = ff;
        for(int i=0;i<f.getWidth();i++){
          for(int j=0;j<f.getHeight();j++){
                //se obtiene el color del pixel
                color = new Color(f.getRGB(i, j));
                //se extraen los valores RGB
                r = color.getRed();
                g = color.getGreen();
                b = color.getBlue();
                //se coloca en la nueva imagen con los valores invertidos
                f.setRGB(i, j, new Color(255-r,255-g,255-b).getRGB());
          }
        }
        return f;
    }

    private Image toImage(BufferedImage bufferedImage) {
        return Toolkit.getDefaultToolkit().createImage(bufferedImage.getSource());
    }
}

Como dijimos anteriormente, realizaremos un ciclo para capturar imagenes de la webcam, filtrarlas y mostrarlas al usuario, para facilitar la tarea, utilizaremos un Thread o hilo en español, este hilo ademas nos permitira graduar la velocidad del proceso de captura-filtrado. la clase se llama «cuerda.java», ¿a que los deje sorprendidos?

import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
/**
 * @web https://www.jc-mouse.net/
 * @author Mouse
 */
public class Cuerda extends Thread {
    private int velocidad;
    private JLabel photo;
    jmfVideo jmf;

    public Cuerda(JLabel lb,jmfVideo a2){
        this.velocidad=200;
        this.photo = lb;
        jmf=a2;
    }

 @Override
    public void run() {
     while (true)
     {
         try {
            sleep(velocidad);
            Image y = jmf.capturarImagen2();
            photo.setIcon( new ImageIcon(y));
         } catch (InterruptedException ex) {}
     }
    }

}

Eso es todo, ya solo nos queda, implementar estas clases en la interfaz.

public class interfaz extends javax.swing.JFrame {

    jmfVideo JMF_Componente = new jmfVideo();//componente JMF
    Cuerda miCuerda;//Thread

    /** Creates new form interfaz */
    public interfaz() {
        initComponents();
         this.setTitle("JMF Filtros - 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(JMF_Componente.Componente());
        imagen.setText("");
        miCuerda = new Cuerda(imagen,JMF_Componente);
    }

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
         miCuerda.start();
         jButton1.setEnabled(false);
         jButton2.setEnabled(true);
         jButton3.setEnabled(true);
         jButton4.setEnabled(true);
    }                                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        JMF_Componente.setOpcion(2);
    }                                        

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        JMF_Componente.setOpcion(3);
    }                                        

    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        JMF_Componente.setOpcion(4);
    }

El codigo superior, es solo una parte del codigo de la clase interfaz.java, no copies y pegues, es una referencia de su implementacion, por favor, analiza y ve donde donde va cada porcion del codigo, si creaeste el jframe con los nombres que deje mas arriba, entonces no debes tener problemas.

Cuando ya terminamos todo, solo que da ejecutar el proyecto

El codigo del proyecto esta aqui

Click para descargar

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

Radio.Garden .:. La web donde puedes escuchar Radios de todo el mundo

Radio.Garden .:. La web donde puedes escuchar Radios de todo el mundo

Radio.Garden es un proyecto interactivo desarrollado por el Instituto Holandés para el Sonido y la Visión en cooperación...

Control de Paginación (Pagination) en tus Apps FX

Control de Paginación (Pagination) en tus Apps FX

El control de paginación de JavaFX (Pagination) se usa para navegar a través de varias paginas de contenido divididas en...

Añadir Splash Screen en Java/Netbeans

Añadir Splash Screen en Java/Netbeans

¿Splash Screen? El splash screen o traducido al aspañol 😉  es una «Pantalla de bienvenida» que se muestra cuando se ejec...

Personalizar nodos de un JTree con HTML

Personalizar nodos de un JTree con HTML

Una clase JTree permite mostrar datos de una forma jerárquica y en realidad este objeto no contiene sus datos; es decir,...

Blog MVC en PHP (Código Fuente)

Blog MVC en PHP (Código Fuente)

En este post dejo el código fuente de un blog en PHP desarrollado siguiendo el patrón de diseño MVC (Modelo, Vista y Con...

Reporte Padrón electoral con imágenes y Data Matrix

Reporte Padrón electoral con imágenes y Data Matrix

En este post diseñaremos un reporte de un padrón electoral con dos columnas que contendrá los certificados de sufragio e...

10 comentarios en “Filtros con JMF y una webcam [Proyecto]”

  1. JZ dice:

    No hay Link de Descarga Amigo XD…

    1. Mouse dice:

      Enlace actualizado

  2. armando dice:

    hola jc disculpa pero no vale el link de descarga podrias actualizarlo gracias

  3. sebastian dice:

    Estimado mouse muchas gracias por tu aportes ya que me han servido de mucho, ahora estoy incursionando con el JMF estoy usando la versión multi plataforma pero no puedo hacer la funcionar a pesar de que e agregados los jar a la librería de netbeans pero no funciona me manda error

    1. Mouse dice:

      ¿y cual es el error?

  4. fabian_programmer dice:

    hola caballero, primero que nada gracias por tu aporte, estoy implementando un programa tipo «skype» el cual requiere los clientes java-java y servidor c# , navegando por aca encontre esto me parecio interesante y lo implemente, solo que tengo un problema, cuando abro el programa no tira errores pero me parece que se queda «enciclado» como comunmente decimos , dice running pero no avanza , debe ser algun error en el hilo?? mira :
    Exception in thread «AWT-EventQueue-0» java.lang.NullPointerException
    at camaraweb.jmfVideo.Componente(jmfVideo.java:34)
    at camaraweb.framecam.(framecam.java:42)
    at camaraweb.framecam$2.run(framecam.java:178)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:721)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:682)
    at java.awt.EventQueue$3.run(EventQueue.java:680)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:691)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
    BUILD STOPPED (total time: 35 seconds)

    mi Jframe se llama frame cam por las dudas jaja… y bueno esto debo entregarlo en 3 dias (son puntos extra en mi universidad por eso tan poco tiempo) … ya probe quitando algunos exception pero me da error sin ni siquiera correrlo, quiere decir que todos los exception que hay son estrictamente necesarios, siendo asi no se donde esta el error, tambien puede ser en el metodo MAIN, ya que lo tengo dentro del Jframe, NO como un metodo(y clase) por aparte … y de nuevo gracias ojala me aclararas la duda

    1. Mouse dice:

      Según el error:

      Exception in thread “AWT-EventQueue-0″ java.lang.NullPointerException
      at camaraweb.jmfVideo.Componente(jmfVideo.java:34)

      existe un valor NULL en el componente de JMF que esta en la linea 34

      debes tener cuidado en crear los componentes y asignarles una fuente (vídeo), en este caso SKYPE supongo que se crea todo correctamente pero creo que no hay video, tal vez el uso de streaming o.O

  5. Nasario dice:

    Excelente informacion, siempre me ayuda entrar al blog y buscar info, excelentes tutoriales te felicito

  6. karen dice:

    hola excelente tu blog, una duda, si quiero sacar filtros a una sola imagen que se muestra en un label, como podría hacerlo????

    1. Mouse dice:

      Un video no es mas que muchas imágenes juntas una después de la otra 🙂 y al poner filtros al video de una webcam, lo que hacemos es poner el filtro a cada frame de este antes de mostrar en pantalla el resultado, trabajamos en memoria, por lo que si quieres guardar o mejor dicho sacar una foto con el filtro, debes trabajar con el bufferedimage.
      Ahora que si ya tienes la imagen en disco y solo quieres aplicar filtro, mucho mas fácil, 🙂 pero encontraras varios ejemplos en esta misma página donde se aplican muchos filtros 🙂

Los comentarios estan cerrados

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