Tema destacado: Grupo de acebook de elhacker.net
Autor
|
Tema: Manejar WebCam o camaraWeb desde JAVA (Leído 10,735 veces)
|
|
|
|
|
cyberserver
Desconectado
Mensajes: 157
Lo que una mente crea, otra lo destruye
|
Sip ya lo havia provado pero me manda 3 errores --------------------Configuration: <Default>-------------------- C:\Users\Los_flais\Desktop\Camara\SwingCapture.java:151: warning: com.sun.image.codec.jpeg.JPEGImageEncoder is Sun proprietary API and may be removed in a future release JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); ^ C:\Users\Los_flais\Desktop\Camara\SwingCapture.java:151: warning: com.sun.image.codec.jpeg.JPEGCodec is Sun proprietary API and may be removed in a future release JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); ^ C:\Users\Los_flais\Desktop\Camara\SwingCapture.java:152: warning: com.sun.image.codec.jpeg.JPEGEncodeParam is Sun proprietary API and may be removed in a future release JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bi); ^ 3 warnings
Process completed.
me manda un error en los codecs o algo asi pero como lo puedo corregir :S
|
|
|
|
|
En línea
|
|
|
|
cyberserver
Desconectado
Mensajes: 157
Lo que una mente crea, otra lo destruye
|
Listoooo ya pude.....eaea uff mi cabezita tuve k entenderle mazo al temaaaa  y buscar muchos codigos relacionados para armar uno pequeño y simple... import javax.media.Manager; import javax.media.MediaLocator; import javax.media.Player; import javax.swing.*; import java.awt.Component;
public class SwingCapture { public static void main(String[] args) { // TODO Auto-generated method stu otro perro=new otro(); perro.show(); perro.proceso(); } } class otro extends JFrame{ JLabel Imagen; otro(){ Imagen=new JLabel(); Imagen.setBounds(30,40,20,20); add(Imagen); setBounds(400,400,400,400); setLayout( null ); // use a BorderLayou setTitle("Prueba de Camara Web"); } public void proceso(){ Manager.setHint( Manager.LIGHTWEIGHT_RENDERER, true ); try{ MediaLocator ml = new MediaLocator("vfw://0"); Player p = Manager.createRealizedPlayer(ml); Component video = p.getVisualComponent(); video.setBounds(20,30,600,600); if ( video != null ){ // agragar el video al componente add( video); }
p.start(); }catch(Exception e){ e.printStackTrace(); } } }
Saludosssss
|
|
|
|
|
En línea
|
|
|
|
|
|
cyberserver
Desconectado
Mensajes: 157
Lo que una mente crea, otra lo destruye
|
Eaea. que honda amigos pues ya me aplique y cree una api por decirlo asi muy sencilla de usar  funciona asi: Leame.txt VIVA atlacomulco
Para poder hacer uso de la api CamaraWeb necesitas tener instalado JMF y tener los .jar en la ruta \Java\jdk1.6.0_17\jre\lib\ext para poder usarlo desde Jcreator o cualquir otro IDE.
Los Metodos dentro son
public Component VerCamara(int x,int y,int alto,int ancho){ Los parametros de este metodo son para colocar el componente resultante en un Jframe
public int Fotografiar(String Carpeta,Boolean NombreAutomatico,String NombreValoNull){ Los parametros son: Carpeta: Carpeta donde se crearan las imagenes si no existe la crea si existe la respeta NombreAutomatico: false si no quieres colocar un nombre automatico true si quieres un nombre automatico(dia-Hora)
NombreValoroNull: Nombre de la imagen SIN extensión en el caso que se aya dado false en el parametro anterior, de lo contrar se rellena con null El codigo de la api es el siguiente //Paquetes para guardar imagen (Es necesario tener las apis _JMF_) //By: CyberServer crow_15@hotmail.com import javax.swing.*; import java.awt.*; import java.awt.Component; import java.util.Date; import javax.media.*; import javax.media.control.*; import javax.media.util.*; import javax.media.format.*; import javax.imageio.*; import java.io.*; import java.awt.image.RenderedImage;
class CamaraWeb{ public Component componente=null; public Player p=null; public Component video; public MediaLocator ml; CamaraWeb(){ Manager.setHint( Manager.LIGHTWEIGHT_RENDERER, true ); try{ ml = new MediaLocator("vfw://0"); p = Manager.createRealizedPlayer(ml); video = p.getVisualComponent(); p.start(); if ( video != null ){ componente=video; } }catch(Exception e){ JOptionPane.showMessageDialog(null,"Error de Comunicacion con la WebCam " + e); } } public Component VerCamara(int x,int y,int alto,int ancho){ this.componente.setBounds(x,y,alto,ancho); return componente; } public int Fotografiar(String Carpeta,Boolean NombreAutomatico,String NombreValoNull){ Buffer buf=null; Image img=null; File imagenArch; String nombre=null; String formato = null; Date HoraDate; String HoraString=null; File CarpetaFotografias; CarpetaFotografias=new File(Carpeta); if(CarpetaFotografias.exists()==false){ CarpetaFotografias.mkdir(); } FrameGrabbingControl fgc = (FrameGrabbingControl) p.getControl("javax.media.control.FrameGrabbingControl"); buf = fgc.grabFrame(); BufferToImage btoi = new BufferToImage((VideoFormat)buf.getFormat()); img = btoi.createImage(buf); if (img != null){ if(NombreAutomatico==true){ HoraDate=new Date(); HoraString=Integer.toString(HoraDate.getDate())+"-"+Integer.toString(HoraDate.getMonth())+"-"+Integer.toString(HoraDate.getYear())+ "-"+Integer.toString(HoraDate.getHours())+"-"+Integer.toString(HoraDate.getMinutes())+"-"+HoraDate.getSeconds(); nombre=Carpeta + "\\"+HoraString+".jpg"; }else{ nombre=Carpeta + "\\"+NombreValoNull+".jpg"; } imagenArch = new File(nombre); formato = "JPEG"; try{ ImageIO.write((RenderedImage) img,formato,imagenArch); return 1; }catch (IOException ioe){ return 0; } } return 0; } } Y si no quieres saber de codigo y solo usar el api que tiene que estar adjunto a tu proyecto ya que es un .class aqui descargalo... http://cybercerver.webcindario.com/APICamara%20Web.zipSaludos y viva Atlacomulco:P atte: CyberServer
|
|
|
|
|
En línea
|
|
|
|
josco
Desconectado
Mensajes: 163
|
hola cyberserver, entonces como puedo hacer para que se vea la cam en un frame, mira uso netbeans, cree un nuevo proyecto agregue tu clase y un jframe puse un boton y en el codigo le puse: private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: CamaraWeb ver = new CamaraWeb(); ver.VerCamara(200,200,200,200); } cuando corro el programa le doy al boton y prende la camara, pero que tengo que hacer para que me muestre lo que esta viedno la camara?? me sale el error: java.io.IOException: Could not connect to capture device
|
|
|
|
|
En línea
|
|
|
|
cyberserver
Desconectado
Mensajes: 157
Lo que una mente crea, otra lo destruye
|
 Bien Facil men mira. Esta es la firma del metodo para ver la camara... public Component VerCamara(int x,int y,int alto,int ancho){ Si ves nos retorna un valor tipo Component..... esto quiere decir que nos retorna un objeto asi como si fuera un Jcommand, un JText etc  lo que tendriamos que hacer es agregarlo al Jframe o Jpanel como si fuera otro objeto. entonces el codigo para agregar el componente es: JFrame.setlayout(null); JFrame.add(VerCamara(int x,int y,int alto,int ancho));
Claro no esperes que te agregue el panel completo para modificar aspectos visuales, solo te va a agregar el componente de la CamaraWeb y tu ya con las cordenadas que le des pues puedes colocarlo en un lugar para que se vea padre. mira aqui esta el mio con el unico uso de mi clase.  espero que te aya servido y cualquier duda hasme saber atte: CyberServer 
|
|
|
|
« Última modificación: 17 Mayo 2010, 04:32 por cyberserver »
|
En línea
|
|
|
|
josco
Desconectado
Mensajes: 163
|
que tal cyberserver, ahora si ya pude hacer que se muestre la camara en un jtext  pero ahora quisiera tomar una foto, ya lo intente pero me sale un error  mira te explico lo que hago: en un jframe agregue un jtext y dos botones, a un boton le agregue la funcion para que me muestre la camara en el jtext asi: private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: CamaraWeb ver = new CamaraWeb(); this.jLabel1.setLayout(null); this.jLabel1.add(ver.VerCamara(0, 0, 140, 180)); } y al otro boton, segun yo le puse el siguiente codigo para que tomara la foto: private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: CamaraWeb guardar = new CamaraWeb(); guardar.Fotografiar("fotosjava", true, "imagen1");
} pero al darle a este boton me sale este error: error de comunicacion con la webcam javax.media.noplayerexception: error instantiating class: com.sun.media.protocol.vfw.datasource: java.io.IOexception: capture device in use ahora la pregunta es, como le hago para tomar una foto y guardarla. gracias por tu ayuda saludosss 
|
|
|
|
|
En línea
|
|
|
|
cyberserver
Desconectado
Mensajes: 157
Lo que una mente crea, otra lo destruye
|
 facil, mira para entender este error tenemos que ir al codigo en esta parte. CamaraWeb(){ Manager.setHint( Manager.LIGHTWEIGHT_RENDERER, true ); try{ ml = new MediaLocator("vfw://0"); p = Manager.createRealizedPlayer(ml); video = p.getVisualComponent(); p.start(); if ( video != null ){ componente=video; } }catch(Exception e){ JOptionPane.showMessageDialog(null,"Error de Comunicacion con la WebCam " + e); } } Si nos damos cuenta es un contructor. Contructor segun wikipedia: En java es un método especial dentro de una clase, que se llama automáticamente cada vez que se crea un objeto de esa clase.
Posee el mismo nombre de la clase a la cual pertenece y no puede regresar ningún valor (ni siquiera se puede especificar la palabra reservada void). Por ejemplo si añadiéramos a la clase SSuma un constructor, tendríamos que llamarlo también SSuma. Cuando en una clase no se escribe propiamente un constructor, java asume uno por defecto. Constructor por defecto [editar]
Un constructor por defecto es un constructor sin parámetros que no hace nada. Sin embargo será invocado cada vez que se construya un objeto sin especificar ningún argumento, en cuyo caso el objeto será iniciado con los valores predeterminados por el sistema (los atributos numéricos a ceros, los alfanuméricos a nulos, y las referencias a objetos a null). Esto quiere decir que en este se definen e inacializan las variables y metodos que vamos a utilizar a lo largo de la clase. En nuestro caso dentro de nuestro constructor CamaraWeb() se inicializa la conexión de la CamaraWeb para con el metodo de VerCamara() se proyecte en un componente. Entonces ese error aparece por que estas instanciando 2 veces la Clase "CamaraWeb" y en la segunda ves estas tratando de cargar la camaraweb cuando esta ya esta cargada, es por eso que el error te dice; capture device in use La solucion seria mandar a llamar VerCamara() y Fotografias() en la misma clase.!!!  y instanciando una sola ves!!!!!!  NOTA: con relacio a tu codigo creo que estas tratando de matar moscas a cañonazos en cuestion de los eventos de los botones mira Tu codigo: private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: CamaraWeb ver = new CamaraWeb(); this.jLabel1.setLayout(null); this.jLabel1.add(ver.VerCamara(0, 0, 140, 180)); }
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: CamaraWeb guardar = new CamaraWeb(); guardar.Fotografiar("fotosjava", true, "imagen1");
} Cuando podrias sintetisarlo asi: clase ejemplo implements ActionListener{
public CamaraWeb ver; ver = new CamaraWeb();
public void actionPerformed(ActionEvent e){ if(e.getSource()==jButton1){ this.jLabel1.setLayout(null); this.jLabel1.add(ver.VerCamara(0, 0, 140, 180)); } if(e.getSource()==jButton2){ int resultado; resultado=ver.Fotografiar("fotosjava", true, "imagen1"); if(resultado==1){ //Se tomo la fotografia }else{ //Error en la fotografia } } }
}
y asi ya utilizas los dos metodos de la clase CamaraWeb instanciadola una sola ves Saludos y espero que aya sido claro... saludos atte: CyberServer
|
|
|
|
|
En línea
|
|
|
|
josco
Desconectado
Mensajes: 163
|
bueno, sigo en las mismas  , como en la escuela solo nos ensenan a programar en java con netbeans, y no nos ensenan a crear botones desde cero, tengo dudas respecto al ultimo codigo  , ya le intente de muchas maneras pero no lo puedo hacer jalar. bueno te explico las dudas: 1.- no se donde poner exactamente este codigo: clase ejemplo implements ActionListener{
public CamaraWeb ver; ver = new CamaraWeb();
public void actionPerformed(ActionEvent e){ if(e.getSource()==jButton1){ this.jLabel1.setLayout(null); this.jLabel1.add(ver.VerCamara(0, 0, 140, 180)); } if(e.getSource()==jButton2){ int resultado; resultado=ver.Fotografiar("fotosjava", true, "imagen1"); if(resultado==1){ //Se tomo la fotografia }else{ //Error en la fotografia } } }
} donde dice: clase ejemplo implements ActionListener{ no es en clase class?? este codigo va en la misma clase CamaraWeb?? o en el jframe?? o donde?? bueno te dejo un video para que veas lo que hago puedes adelantarle al minuto 7:30 es la parte donde termino de matar moscas a canonazos jaja, y empiezo a intentar con tu codigo: el video lo puedes descargar de aqui: http://www.megaupload.com/?d=3KPBBLV1pesa como 27 MB espero no te moleste, ojala y me puedas ayudar saludosss 
|
|
|
|
|
En línea
|
|
|
|
cyberserver
Desconectado
Mensajes: 157
Lo que una mente crea, otra lo destruye
|
OK MEN ya entendi lo siento si te confundi. por cierto estuvo chido el video se ve que ya te dominas el NetBeans!!!! Mira segun lo que yo pude ver (corrigeme si me equivoco). Tus metodos para los eventos del boton los genera automaticamente el IDE pero estos se van agregarndo a tu clase que se llama ventana.java dentro esta tambien el public static void main (String[] args). Mira el error que te manda mi clase es por k estas instanciando dos veces( instancias es cuando crear un objeto de tipo de la clase CamaraWeb objeto=new CamaraWeb()), por decirlo de otro cuando ases esto automaticamente la clase por medio del constructor inicializa la camaraweb sin que tu te des cuenta pero tu no puedes verla asta que llames al evento VerCamara(), entonces si instancias 2 veces estas cargando una camara web que ya en uso la primera ves.!!! es por eso que te marca ese error de capture device in use Entonces para solucionar este error y juntarlo con tu codigo tenemos que declarar una variable GLOBAL(esta se declara fuera de cualquier metodo y su funcion es k pueda ser accesible desde cualquier metodo de la clase). Declarar una Variable global: class ventana{
public CamaraWeb Ver=new CamaraWeb();
public static void main (String[] args) {
}
}
en el codigo de arriva declaramos a Ver de tipo CamaraWeb como Variable GLOBAL entonces podremos acceder y hacer uso de ella desde cualquier metodo que este dentro de la clase ventana. ahora pues. para resolver el problema de tu codigo tendremos que hacer esto. class ventana{
public CamaraWeb Ver=new CamaraWeb(); //Es Ver con malluscula la primera no te vallas a confundir abajo
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: this.jLabel1.setLayout(null); this.jLabel1.add(Ver.VerCamara(0, 0, 140, 180)); }
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: int resultado=Ver.Fotografiar("fotosjava", true, "imagen1"); if(resultado==0){ JOptionPane.showMessageDialog(null,"Error en la Fotografia"); }
}
public static void main (String[] args) {
} } Y Bingo, con esto resolvimos el dilema de instanciar dos veces a la clase...... viste que solo lo hisimos una ves con el objeto o variable "Ver".....  Espero haber sido lo mas claro posible, y cualquier duda hasmela saber. atte: CyberServer
|
|
|
|
« Última modificación: 19 Mayo 2010, 06:21 por cyberserver »
|
En línea
|
|
|
|
josco
Desconectado
Mensajes: 163
|
gracias men. ya funciona a la perfeccion este es el codigo de la ventana: me sale un warning el declarar: public CamaraWeb Ver = new CamaraWeb(); pero ya funciona  aqui esta todo el codigo de la ventana: package camara;
import javax.swing.JOptionPane;
/* * To change this template, choose Tools | Templates * and open the template in the editor. */
/* * ventana.java * * Created on 18/05/2010, 12:53:18 PM */
/** * * @author Noe */
public class ventana extends javax.swing.JFrame {
/** Creates new form ventana */ public CamaraWeb Ver = new CamaraWeb();
public ventana() { initComponents();
}
/** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() {
jLabel1 = new javax.swing.JLabel(); jButton1 = new javax.swing.JButton(); jButton2 = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jLabel1.setText(" "); jLabel1.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
jButton1.setText("ver la cam"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } });
jButton2.setText("Fotografiar"); jButton2.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton2ActionPerformed(evt); } });
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(21, 21, 21) .addComponent(jButton1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 206, Short.MAX_VALUE) .addComponent(jButton2) .addGap(27, 27, 27)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap(44, Short.MAX_VALUE) .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 301, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(60, 60, 60)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(19, 19, 19) .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 218, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 29, Short.MAX_VALUE) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jButton1) .addComponent(jButton2)) .addContainerGap()) );
pack(); }// </editor-fold>
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: this.jLabel1.setLayout(null); this.jLabel1.add(Ver.VerCamara(0, 0, 300, 250)); }
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: int resultado=Ver.Fotografiar("fotosjava", true, "imagen1"); if(resultado==0){ JOptionPane.showMessageDialog(null,"Error en la Fotografia"); } }
/** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new ventana().setVisible(true); } }); }
// Variables declaration - do not modify public javax.swing.JButton jButton1; public javax.swing.JButton jButton2; public javax.swing.JLabel jLabel1; // End of variables declaration
}
y dejo tambien el proyecto en netbeans. lo pueden descargar de aca: http://www.4shared.com/get/293555022/a77f647f/camara_web_netbeans_proyect.htmlgracias por la ayuda cyberserver. ahora si va a quedar bien chido mi proyecto de la biblioteca jaja 
|
|
|
|
|
En línea
|
|
|
|
|
|
gochiman
Desconectado
Mensajes: 1
|
Amigo esta muy bien tu clase... te cuento que yo estoy desarrollando un aplicacion y basicamente hago lo mismo que tu ..pero mi aplicacion difiere un tanto.. yo uso (o pretento usar) varias webcam o fuenets de capturas... el problema viene con JMF registry
Código:
CamaraWeb(){ Manager.setHint( Manager.LIGHTWEIGHT_RENDERER, true ); try{ ml = new MediaLocator("vfw://0"); p = Manager.createRealizedPlayer(ml); video = p.getVisualComponent(); p.start(); if ( video != null ){ componente=video; } }catch(Exception e){ JOptionPane.showMessageDialog(null,"Error de Comunicacion con la WebCam " + e); } }
pues bien... para manejar varios dispositvos no hago esa asigancion fija al MediaLocator.. sino uso el metodo getDeviceList(Format).... bien esto me funciona pasando como formtao el RGB, pero solo me devuelve una posicion al vector... es decir ; solo ve una camara; y desde el JMF registry al agregar dispositivos y ponerlo a detectar solo me detecta uno-... y claro lo llama vfw:.......:0 = vfw://0 yo necesitaria poder usar el vfw://1 //2 // 3
no se si me he explicado.... yo estoy convencido que el codigo no es el problema sino lo es el hecho que el registry solo me muestra cualquier webcam como un dispositivo vfw://0
en resumidas cuentas... como harias tu para manejar varias camaras? ¿han tenido ese problema antes? ¿como se puede solucionar?
A: las camaras las reconoce y son compatibles ya que he probado la aplicacion corriendo una sola camara y lo hace a la perfecccion indistintamente de cual este conectada...
Si me pueden ayudar lo agradeceria mill veces he visto cualqueir cantidad de foros y de verdad ya no se como solucionar esto...
|
|
|
|
|
En línea
|
|
|
|
|
| Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Manejar Herencia en Java
Java
|
**Adem**
|
1
|
10,465
|
2 Marzo 2008, 17:38
por Casidiablo
|
|
|
Manejar archivo .txt desde java (ingresar datos, modificar datos, buscar datos y
Java
|
chuystoty
|
9
|
20,401
|
20 Mayo 2012, 06:13
por ELMED
|
|
|
Manejar webcam en VS 2010
.NET
|
eldiegofg
|
4
|
2,435
|
8 Junio 2010, 05:21
por 43H4FH44H45H4CH49H56H45H
|
|
|
Manejar plc con java?
Java
|
josco
|
3
|
1,947
|
18 Noviembre 2010, 20:50
por josco
|
|
|
Manejar SMF desde Java
Java
|
undercode2
|
1
|
759
|
30 Julio 2011, 03:11
por Leyer
|
|