Hoy traigo para ustedes un breve aporte sobre como visualizar un video tomado en tiempo real por nuestra webcam en un Panel dentro de una ventana en Java.
Utilizaremos un API que facilita mucho esta tarea: webcam-capture (ver en Github). Estoy trabajando en un proyecto donde necesito capturar imágenes de una webcam en tiempo real y este API me pareció simplemente maravillos. No es complicado en lo absoluto y la programación de una interfaz con las imágenes capturadas por nuestra webcam es cuestión de solo unos minutos.
Veamos cómo lograrlo.
Creación de proyecto Maven
Maven es simplemente fabuloso. Recomiendo leer el siguiente artículo:
Vamos a Netbeans y creamos un proyecto Maven.
Lo llamaremos webcam_test.
En nuestro archivo pom.xml definimos las siguientes dependencias:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<dependencies> <dependency> <groupId>com.github.sarxos</groupId> <artifactId>webcam-capture</artifactId> <version>0.3.11-SNAPSHOT</version> <type>jar</type> </dependency> <dependency> <groupId>org.jclarion</groupId> <artifactId>image4j</artifactId> <version>0.7</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.2</version> <type>jar</type> </dependency> <dependency> <groupId>com.nativelibs4java</groupId> <artifactId>bridj</artifactId> <version>0.7.0</version> <type>jar</type> </dependency> </dependencies> |
Hacemos clic derecho sobre nuestro proyecto y le damos clic en «Clean and Build».
Con esto se descargará automáticamente todos los archivos necesarios (dependencias) para lograr lo que queremos.
Ahora creamos 2 clases, una que llamaremos webcam_test que no hará más nada que iniciar nuestra ventana cuando se ejecute el programa. La otra ventana será un JFrame que llamaremos JFrameWindow.
El código de la clase webcam_test es el siguiente:
1 2 3 4 5 6 7 8 9 |
package com.mycompany.webcam_test; public class webcam_test { public static void main(String args[]) { JFrameWindow window = new JFrameWindow(); window.setVisible(true); } } |
Esto hará que al darle «play» a nuestra aplicación, se abra la ventana que por ahora no contiene nada.
En nuestro JFrame agregamos un JPanel que llamaremos jPanelCamera. Tenemos que declarar algunas variables como globales:
1 2 3 4 |
private Executor executor = Executors.newSingleThreadExecutor(); private AtomicBoolean initialized = new AtomicBoolean(false); private Webcam webcam = null; private WebcamPanel panel = null; |
A continuación el código que permitirá visualizar las imágenes de nuestra webcam (lo colocaremos en el constructor del JFrame):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public JFrameWindow() { initComponents(); webcam = Webcam.getDefault(); webcam.setViewSize(webcam.getViewSizes()[0]); panel = new WebcamPanel(webcam, false); panel.setPreferredSize(webcam.getViewSize()); panel.setOpaque(true); panel.setBackground(Color.BLACK); panel.setBounds(0, 0, 400, 300); jPanelCamera.add(panel); if (initialized.compareAndSet(false, true)) { executor.execute(new Runnable() { @Override public void run() { panel.start(); } }); } } |
Nuestro código debe lucir así:
Cuando ejecutamos el código, el resultado debe ser el siguiente:
Justo lo que queremos, fácil y rápido. Ahora vamos a agregarle una pequeña función: capturar la imagen en un momento dado.
Agregamos un botón con la siguiente programación:
1 2 3 4 5 6 7 |
try { BufferedImage image = webcam.getImage(); //nombre y formato de la imagen de salida ImageIO.write(image, "PNG", new File("webcam_test.png")); } catch (IOException ex) { Logger.getLogger(JFrameWindow.class.getName()).log(Level.SEVERE, null, ex); } |
La interfaz luciría así:
Cuando se ejecuta:
Al presionar el botón de «Capturar Imagen» verificamos la ruta en la cual se encuentra nuestro proyecto de Netbeans guardado y veremos lo siguiente:
Si abrimos el fichero webcam_test.png veremos:
Los archivos de este proyecto se encuentran en nuestro repositorio de Github. Espero que la información suministrada sea de utilidad para ustedes.
Saludos.
Hola, qué tal. Revisé el código y funciona muy bien. Pero tengo una duda.
Si quisiera mostrar la imagen capturada en otro JPanel y que éste cambiara conforme tomo una nueva foto (y se sustituyera la anterior) cómo tendría que hacerlo?
He intentado utilizando el método de JPanel «updateImage», agregando un Jlabel y asignando un ícono al JLabel (sí muestra la imagen, pero no la actualiza si tomo más fotos).
No he probado a hacerlo. Pero trataré de documentarlo pronto
Hola, excelente post, tengo una duda y problema quisiera poder escoger la camara que controlare es decir si utilizo la herramienta para tomar fotografias para almacenarlas en la ficha de personal por ejemplo
Explicate un poco mejor
Hola, pues veras tu codigo muestra acceso a las camaras conectadas a mi equipo para seleccionar la correcta para tomar la fotografia, en tu caso usaste la camara por defecto que generalmente en las laptos ubicada en la parte frontal, yo necesito abrir una 2da o 3ra camara
te anexo captura.
https://uploads.disquscdn.com/images/eb5d05473fda2d39373c70aa73532e2a81b7ed19462c8b71df62a8e7ac1340b1.jpg
Hola, una pregunta.
Cuando ejecuto el código me aparece este error:
Failed to execute goal on project webcam_test: Could not resolve dependencies for project com.mycompany:webcam_test:jar:1.0-SNAPSHOT: Could not find artifact com.github.sarxos:webcam-capture:jar:0.3.11-SNAPSHOT -> [Help 1]
To see the full stack trace of the errors, re-run Maven with the -e switch.
Re-run Maven using the -X switch to enable full debug logging.
For more information about the errors and possible solutions, please read the following articles:
[Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
De casualidad sabes que está pasando?
Hola Eduardo, pudiste resolverlo? Me encuentro con el mismo inconveniente.
No sé si pudiste solucionarlo pero se corrige yendo al POM.xml y borrarle el «SNAPSHOT» a la version de la dependencia
Hola buenas ha sido de gran utilidad esta explicación. Sin embargo me gustaría saber si puedo establecer la ruta en la que guardo la imagen? espero puedas leerme gracias
Hola. ¿Sabes en qué cambiaría si usásemos Eclipse en vez de Maven?
Un saludo y gracias.
Eclipse es un IDE, Maven es un gestor de repositorios. Son dos cosas distintas.
Dentro de Eclipse debe haber soporte para Maven