Comencemos:
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
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
En este post mostramos como personalizar el Header (encabezado) de un componente JTable en Java colocando iconos, centra[...]
Continuando con estos post de Cliente/Servidor, en esta oportunidad realizaremos un ejemplo usando un dispositivo móvil[...]
Hola 🙂 publicando de tiempo les dejo esta chiti librería java para convertir números a su equivalente literal. La librer[...]
La autenticación basada en API keys es un método para proteger el acceso a una API. Se utiliza una clave alfanumérica ún[...]
Cuando nos bajamos un proyecto de internet o cuando nos pasan un código de otra pc (que técnicamente viene siendo lo mis[...]
¿Qué es S.O.P.A y PROTECT-IP? SOPA y PROTECT-IP son proyectos de leyes introducidos en la Cámara de Representantes de lo[...]