Los requisitos son los mismos, o casi los mismos
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
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)); } }
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
Felices capturas - FIN
44 comentarios:
Gran sitio, estoy tratando de hacer este tutorial pero no funciona, el error:
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:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
lo que podría ser?
el error dice que no encuentra tu dispositivo de captura (osea tu camara), utiliza el JMStudio para ver si el JMF detecta tu dispositivo.
date una vuelta por aqui para aclarar dudas:
http://jc-mouse.blogspot.com/2011/03/jmf-buscar-dispositivos.html
El dispositivo es el siguiente:
vfw:Microsoft WDM Image Capture (Win32):0
pero el error continúa.
oye yp ya tengo este proyecto pero como mejora nos pidieron que implementemos botones para manejar lo que es guardar las imagenes, borrar, cargar una imagen que son las opciones que tienen dentro del jc-slider pero como es una libreria no tengo acceso a los eventos que manejas, me podrias decir como o mandarme el proyecto del slider para netbeans gracias y saludos
jc pon el codigo de la libreria jc-Slide para vere como funciona pues hermano pilas gracias
Adriana:
No comprendo, no puede ser que sí te funcione el primer código y no el segundo, si ambos son practicamente los mismos
Anonimo:
La libreria jcSlide es el resultado de todo lo que puedes ver en este blog, todas las funciones a las que haces mencion, estan aqui, no me invente nada
pero seria mucho mas facil si la publicaras jc para no estar buscando por favor publica la libreria jcslide plis
Hola, estoy desarrollando una app usando jmf.No es standalone, sino que arranca desde javaWebStart descargando desde un servidor jboss centralizado. Mi problema es que, aunque la maquina tiene instalado el JMF y tiene detectado el dispositivo, aparentemente JMF necesita encontrar un archivo jmf.properties y no encuentro la manera de hacer que lo encuentre una vez arrancado. Te ha sucedido? Muchas gracias desde ya por cualquier pista que me puedas dar.
Me gustaría guardar la imagen capturada en los valores bytea postgresql, pero no saben cómo
convertir al tipo y luego de recuperar como imagen jcSlide.
oye tengo problemas con la resolucion ya que es muy grande
que se podria hacer para redicir el tamaño de las imagenes
Me gustaría guardar la imagen capturada en los valores bytea postgresql, pero no saben cómo
convertir al tipo y luego de recuperar como imagen jcSlide.
primera vez que acceso a este blog y se ven muchos temas interesantes gracias por que la informacion que esta aki es muy buena felicidades....
att ivan.....
Hey amigo tu blog esta exelente! estoy creando un Sistema de Asistencia en Netbeans... y en el momento de ingresar un nuevo trabajador, necesito que le saque una fotografia con la webcam.
Me he descargado tu aplicacion para guiarme, pero tengo el mismo problema que adriana :S
cabe destacar que en le he puesto las librerias jmf y jcSlide
Ojalas me puedas ayudar un saludo grande !
.------------
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:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
PC: para conversion a bytes y su guardado en la base de datos, ya existe un post dedicado a eso junto a su ejemplo, utiliza el buscador por favor
Ivan: gracias
Anonimo: ese es error de dispositivo, prueba con otra camara haber que sucede
Saludos Mouse, gracias por tu tutorial... En mi caso, quisiera saber como hacer una aplicacion sin interfaz, que se ejecute solamente via linea de comandos, y que su comportamiento sea el siguiente: se llama via codigo, ejm: java -jar webcam.jar, y lo que produce es una captura de la webcam, resultando en una imagen jpg, almacenada en la misma ubicacion del ejecutable en este caso el archivo webcam.jar. todo esto sin que la accion se note, que se ejecute como si fuera en segundo plano. Ejm. Se llama a la aplicacion, hace su trabajo y se cierra la aplicacion hasta que vuelva a ser llamada. Es para el proyecto Prey, habemos muchos usuarios con problemas de la webcam, y creo que una pequeña aplicacion que reemplace a la actual(snapshot), seria una maravilla. Ese modulo hace exactamente lo que te comente anteriormente, te lo comento a ti porque veo que tienes conocimiento de JMF, y me parece una opcion viable contribuir con este proyecto. Gracias!!
Vioscar lo que tienes que hacer es simplemente programar la aplicacion para que inicie -> tome la foto de la webcam -> y se cierre, para eso solo debes hacer uso de un ciclo y de sleep para calcular el tiempo sin interfaz, la interfaz es solo un adorno
saludos
Te voy a ser sincero... no se programar Java... pero si esta en tus posibilidades que me expliques como hacer para que inicie -> tome la foto de la webcam -> y se cierre, te lo agradeceria... si te es posible un poco mas de ayuda (o de los lectores porque no? :P). Si tienes un tutorial mas o menos que explique como crear la conexion con la camara, mandar la orden de captura, especificar el sitio de guardado, seria mejor. No te pido que me lo hagas, pero veo que conoces mas del tema y pudieras orientarme como hacerlo. gracias!!
hola me sale este error cuando le doy capturar imagen, quisiera saber que me hace falta. muy buen programa gracias por tu ayuda.
Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: Uncompilable source code - incompatible types
required: java.nio.Buffer
found: javax.media.Buffer
at jmfvideoimage.jmfVideo.capturarImagen(jmfVideo.java:57)
at jmfvideoimage.video.jButton1ActionPerformed(video.java:142)
at jmfvideoimage.video.access$000(video.java:9)
at jmfvideoimage.video$1.actionPerformed(video.java:73)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6504)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6269)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4860)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4686)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2713)
at java.awt.Component.dispatchEvent(Component.java:4686)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:707)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:680)
at java.awt.EventQueue$4.run(EventQueue.java:678)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:677)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
HOLA MOUSE, ME SIRVIO DE MUCHO ESTE TUTORIAL, Y LO ENTENDI A LA PERFECCION Y LO PUDE ADAPTAR A MI NECESIDAD...
PERO TENGO UNA INQUIETUD Y ES QUE CADA VEZ QUE EJECUTO LA APLICACION, ME SALE UNA VENTANA DONDE TENGO QUE ESCOGER EL ORIGEN DE LA CAPTURA, EN ESTE CASO LA WEBCAM INTALADA EN MI ORDENADOR, Y LO QUE ME GUSTARIA ES SABER COMO HACER PARA QUE ESCOJA POR DEFECTO LA QUE TENGO INSTALADA SIN NECESIDAD DE ACEPTAR SIEMPRE EL DISPOSITIVO DE VIDEO QUE QUIERO...
SALUDOS Y GRACIAS DE ANTEMANO POR TU COLABORACION....
La idea de programar en Java es que compiles y pueda correr en cualkier SO, la pregunta es:
¿tu sistema es multiplataforma?
parece que no, pues veo que usas un driver universal de windows para acceder a la webcam, si me ekivoco, podrías decirme como hago para correr la aplicacion en GNU/Linux?
o almenos que parte del código tendría que modificar?
Hola está full chevere tu blog, ya encontré la manera de que mi programa hiciera lo que quiero, gracias por el tutorial, aunke está algo obsoleto pues la clase jcSlide de swing ya no viene en los paquetes, creo ke fué removida u obsoletizada. No obstante estudiando tu codigo y googleando tutoriales aprendí bastante sobre JMF.
gracias brother, saludos.
JARC: que raro, mas que error de codigo creo que debe ser error del driver de tu webcam, porque no tratas con otra camara o si puedes en otra PC para ver los resultados
KrisOO7: me alegro que te sirviera, y si, utilizó el driver de windows, pero supongo que para linux, no debe ser mucha la diferencia, a por cierto, la libreria JCSLIDE no es que este obsoleta, esa libreria es mia :) la puedes encontrar en el blog
Antes que nada una felicitacion por tu blog, la verdad no soy muy diestro programando en java, con decirte que ni he podido guardar video usando JMF simplemente no encuentro muchos tutoriales explicitos, así que decídi emular video guardando imagenes de la webcam, ya he logrado tomar snapshots, pero me gustaría saber como puedo hacer para que esté tomando varios cada intervalo de tiempo, muchas gracias.
HOLA MOUSE, YO HE TRATADO DE HACERLO EN UBUNTU, PERO AL PARECER TENGO PROBLEMAS EN VFW://0, PODRIAS AYUDARME PARA PODER REALIZARLO EN UBUNTU.
GRACIAS.
hola MOUSE tengo una duda... como saber el nombre de dispositivo de mi webcam porq parece q mi error esta en ahi....gracias
hola muy bueno pero, como puedo hacer que esta imagen se guarde en una base de datos y a su vez poder imprimirla como reporte
a mi el jar que das (que descargue la rar llamada Aplicacion, me funciona, un poco lentillo debido a que me consume unos pocos recursos) pero el proyecto completo no me enlista las camaras web (aunque sea solo una no me la enlista y de ahi no paso) caso contrario que con el jar, aunque tarda poquillo; con lo de enlistar los dispositivos pues no tarda nada, solo cuando redimensiona y toma la foto, pero la aplicacion se queda sin hacer nada, alquna idea!!!?
Muito Bom seu Blog.
Estou criando um cadastro de Cliente. Vou usar esse exemplo que você fez. Gostaria de saber como guardar a imagem em disco. Como faço?
Obrigado.
q tal mouse, comentarte q esto funciona al pelo, pero en winXP, lo he probado en win7 de 32 bits, y no da, desde el jmf registry, detecta el vfw:micro......, con una camara usb, pero con la por defecto de la portatil, no la detecta, y el codigo para poder detectar los dispositivos tampoco lo detecta, el error es:
java.lang.NullPointerException
at jmfvideoimage.jmfVideo.Componente
.....
y asi, me va dando las posiciones donde se va generando el error, y pues es por q no detecta la camara, alguna idea...
agradecido de antemano por su tiempo
Para el penultimo:
al capturar la imagen con JMF guarda esta en memoria BufferedImage y despues la guardas en disco
Anonimo:
La libreria JMF tiene errores en windows seven, creo que ya no actualizaron JMF, deberias tratar en otro windows su puedes o utilizar linux
mouse tengo un problema y es que no se como hacer que me funcione el jcslide. Lo pongo en el paquete donde tengo el proyecto pero la clase video me bota errores con todo lo q tenga q ver con el jcslide.
que puedo hacer????
lucc:
ola mouse , sigo tu blog desde un tiempo gracias por los tutoriales
tengo un error a ver si me das una mano.
java.io.IOException: Could not connect to capture device
java.io.IOException: Could not connect to capture device
javax.media.NoPlayerException: Error instantiating class: com.sun.media.protocol.vfw.DataSource : java.io.IOException: Could not connect to capture device
at javax.media.Manager.createPlayerForContent(Manager.java:1362)
at javax.media.Manager.createPlayer(Manager.java:417)
at javax.media.Manager.createRealizedPlayer(Manager.java:553)
at aplicacion.captua.de.imagen.Imagencam.Componente(Imagencam.java:51)
at aplicacion.captua.de.imagen.Camara.(Camara.java:26)
at aplicacion.captua.de.imagen.Camara$2.run(Camara.java:133)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:701)
at java.awt.EventQueue.access$000(EventQueue.java:102)
at java.awt.EventQueue$3.run(EventQueue.java:662)
at java.awt.EventQueue$3.run(EventQueue.java:660)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:671)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at aplicacion.captua.de.imagen.Imagencam.Componente(Imagencam.java:64)
at aplicacion.captua.de.imagen.Camara.(Camara.java:26)
at aplicacion.captua.de.imagen.Camara$2.run(Camara.java:133)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:701)
at java.awt.EventQueue.access$000(EventQueue.java:102)
at java.awt.EventQueue$3.run(EventQueue.java:662)
at java.awt.EventQueue$3.run(EventQueue.java:660)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:671)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
David Garcia dijo: ¿que error?
Anonimo: el error te dice java.io.IOException: Could not connect to capture device
no reconce tu dispositivo de captura, revisa que JMF lo reconosca
yaaa encontre la solucion de que no reconoce la webcam ,despues de romperme la cabeza durante horas.. para que se ahorren ese sufrimiento importen el archivo jmf.jar en la biblioteca del proyecto y listo problema solucionado espero les ayude en algo
me ayudas quiero usar el JMF para conectar mi programa a un scanner puedes hacer un tuto?
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
EL METODO DE EMININAR IMAGEN NO SIRVE!!!!!!! apesta apesta apesta!
Amigo como puedo modificar el menu emergente del complemento para añadirle dos funciones mas. gracias
Lo siento el codigo fuente del componente no esta disponible
OE MUY BUENO TU TUTORIAL,,SE ME IZO DIFICIL AL PRINCIPIO,PERO AL FINAL LO LOGRE..GRACIAS Y SALUDOS DESDE PERU
Amigo como haria para enviar la imagen tomada a un Label que esta en otro formulario....GRACIAS
Hola!!! estoy desarrollando la app, pero al ejecutarse me aparece lo siguiente:
Exception in thread "main" java.lang.NullPointerException
at jmfvideoimage.jmfVideo.Componente(jmfVideo.java:37)
at jmfvideoimage.video.(video.java:21)
at jmfvideoimage.Main.main(Main.java:7)
de antemano agradezco tu atencion
Buenos dias amigo, tengo problema con la cámara web en ubuntu, que necesito para ponerla a funcionar? creo que esos controladores no son compatibles para software libre. espero su pronta respuesta
Publicar un comentario