Manejar WebCam o camaraWeb desde JAVA

Iniciado por cyberserver, 15 Mayo 2010, 20:32 PM

0 Miembros y 1 Visitante están viendo este tema.

cyberserver

Hola amigos, veran e buscado mucho al respecto y se que se puede hacer con JMF (Java Media Framework) pero no e podido encontrar ejemplos de como hacerlo, las instrucciones que se dan se me hacen muy confusas ya que son pasa manejar aspectos de la camara mas elavorados. pero yo lo unico que quiero es poder ver la camara desde java!!!!

miren aqui esta una de las paginas que le comento, http://www.google.com.mx/imgres?imgurl=http://cmop17.files.wordpress.com/2010/01/snag-0000.png&imgrefurl=http://cmop17.wordpress.com/2010/01/14/&usg=__4c2Xe_PJ3zHynQfT3e07bK2MrA4=&h=631&w=521&sz=256&hl=es&start=1&um=1&itbs=1&tbnid=AiPAP_vE_OvEMM:&tbnh=137&tbnw=113&prev=/images%3Fq%3Dwebcam%2Bdesde%2Bjava%2Bjmf%26um%3D1%26hl%3Des%26safe%3Doff%26sa%3DN%26tbs%3Disch:1 pero yo apenas comienzo a saber que es JMF y eso me revuelve

Alguien tiene un ejemplo sencillo pero funcional de como hacerlo!!! les agradecere mucho su ayuda!!!


De anetamo gracias  ;-)







cyberserver

Sip ya lo havia provado pero me manda 3 errores
Citar--------------------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






cyberserver

Listoooo ya pude.....eaea uff mi cabezita tuve k entenderle mazo al temaaaa  :rolleyes: 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






josco

me parece muy interesante tu proyecto, yo estoy haciendo una biblioteca y me gustaria tomar fotos de usuarios desde la camara web de mi lap, podrias subir tu proyecto para echarle un vistaso??? ;D ;D ;D

cyberserver

Eaea. que honda amigos pues ya me aplique y cree una api por decirlo asi muy sencilla de usar :P funciona asi:

Citar
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.zip

Saludos y viva Atlacomulco:P atte: CyberServer






josco

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

cyberserver

#7
 ;D ;D ;D 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 ;D

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.

:P espero que te aya servido y cualquier duda hasme saber atte: CyberServer












josco

que tal cyberserver, ahora si ya pude hacer que se muestre la camara en un jtext  ;D ;D ;D 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  ;-) ;-) ;-)


cyberserver

 ;D ;D 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:
CitarEn 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;
Citarcapture device in use


La solucion seria mandar a llamar VerCamara() y Fotografias() en la misma clase.!!! :P y instanciando una sola ves!!!!!! :P

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