Capturar webcam con VB.NET

¿Que haremos? Crearemos una aplicación en Visual Studio, la cual hará uso de una webcam para capturar el video en frames independientes y depositarlos en memoria para despues mostralos al usuario a través de un picturebox y un Timer para crear la ilusión de movimiento. ¿Porque lo haremos? Porque es justo y necesario ¿Que necesitamos? [...]

Envío de correo con JavaMail/Netbeans

JavaMail es una expansión de Java que facilita el envío y recepción de e-mail desde código java. JavaMail implementa el protocolo SMTP (Simple Mail Transfer Protocol) así como los distintos tipos de conexión con servidores de correo -TLS, SSL, autentificación con usuario y password, etc [Según SantaWikipedia] ¿Qué necesitamos? JavaMail 1.4.5 Java y Netbeans 6.9 [...]

Proyecto de base de datos Firebird VB

En este proyecto realizaremos una aplicación de base de datos Firebird con el lenguaje de programación de Visual Basic de Microsoft, este proyecto tendrá las funciones básicas de gestión INSERT, DELETE, UPDATE y una interfaz de usuario para utilizarlas. ¿Que necesitamos? Visual Studio 2008 o superior Firebird última versión Firebird ADO.NET Data Provider. Conocimientos básicos [...]

Imprimir imagen con Print

La siguiente clase hace uso de PRINT para imprimir una imagen que se encuentra en un variable de tipo FileInputStream, esta clase a su vez es implementada desde una interfaz que hace fácil su uso, la clase así como todo el proyecto esta comentado. import java.io.File; import javax.print.Doc; import java.io.IOException; import javax.print.DocFlavor; import javax.print.SimpleDoc; import java.io.FileInputStream; [...]

Code Army Bolivia

8/3/11

Imagen en Blanco y Negro en Java

JAN29

 (Imagen A: Color, B: Escala de Grises, C: Blanco y Negro)
Una imagen en Blanco y Negro (Black and White) a diferencia de las imagenes en escala de grises donde cada color RGB tiene su tonalidad equivalente en gris, la imagen en blanco/negro es monocromo, es decir solo acepta el blanco y el negro sin ninguna escala intermedia.

Java nos permite trabajar con imagenes en blanco y negro y realizar la conversion facilmente utilizando la clase BufferedImage.TYPE_BYTE_BINARY. En este tutorial, veremos dos maneras de realizar la conversion a Blanco/Negro.

Primer metodo: 
Para convertir una imagen en color a su equivalente en Blanco/Negro, basta con crear una imagen en memoria del tipo BufferedImage utilizando BufferedImage.TYPE_BYTE_BINARY, despues se debe pasar pixel a pixel los valores de la imagen a colores a la nueva imagen blanco/negro, la clase BufferedImage.TYPE_BYTE_BINARY hara el resto.
Este metodo tiene un inconveniente, dependiendo de la luminosidad de la imagen, la calidad u otros factores, el resultado puede variar.

Segundo metodo
Este segundo metodo es una extension del primer metodo, ya que igualmente se utiliza la clase BufferedImage.TYPE_BYTE_BINARY para crear una imagen monocroma, pero tambien para poder controlar la cantidad de negro o blanco que deseemos en la imagen, se hace uso de una variable de tipo entero que llamaremos "umbral", esta variable puede tomar valores entre 0 y 255 y su valor por defecto sera 127.
Seudocodigo:

umbral = 127
color = imagen_color.getColorRGB(i,j);

R = color.leer_Rojo
G = color.leer_Verde
B = color.leer_Azul

si R > umbral entonces
   R = 255
sino
   R = 0
fin si

si G > umbral entonces
   G = 255
sino
   G = 0
fin si

si B > umbral entonces
   B = 255
sino
   B = 0
fin si

imagen_blanco_negro.setColor(i,j, color(R,G,B) )


Cuando se utliza la clase BufferedImage.TYPE_BYTE_BINARY para obtener una imagen monocroma, en realidad los pixeles aun contienen valores RGB diferentes de 0 y 255, aunque en pantalla vemos solo el blanco y negro, aprovechando esto, leeremos los valores RGB de cada pixel de la imagen y dependiendo de sus valores se los colocara en 0 o en 255, (ver seudocodigo). Asi podremos obtener varias imagenes con diferentes resultados, dependiendo del valor que tome "umbral".


El Codigo de la clase WB.java con ambos metodos


import java.awt.Color;
import java.awt.image.BufferedImage;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class WB {    
    private int r,g,b;
    private Color color;
    int umbral = 127;// 

    public WB(){}

   public BufferedImage set_Blanco_y_Negro(BufferedImage f){
        BufferedImage bn = new BufferedImage(f.getWidth(),f.getHeight(), BufferedImage.TYPE_BYTE_BINARY);
        //se traspasan los colores Pixel a Pixel
        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;
   }

   public BufferedImage set_Blanco_y_Negro_con_Umbral(BufferedImage f){
        BufferedImage bn = new BufferedImage(f.getWidth(),f.getHeight(), BufferedImage.TYPE_BYTE_BINARY);        
        //se traspasan los colores Pixel a Pixel
        for(int i=0;i<f.getWidth();i++){
          for(int j=0;j<f.getHeight();j++){
               color = new Color(f.getRGB(i, j));
               //se extraen los valores RGB
                r = color.getRed();
                g = color.getGreen();
                b = color.getBlue();
                //dependiendo del valor del umbral, se van separando los
                // valores RGB a 0 y 255  
                r =(r>umbral)? 255: 0;
                g =(g>umbral)? 255: 0;
                b =(b>umbral)? 255: 0;
                bn.setRGB(i, j, new Color(r,g,b).getRGB());            
          }
        }        
        return bn;
    }
 
}


continue reading

5/3/11

Capturar video de una webcam con JMF

JAN29


Java Media Framework permite la reproduccion de archivos multimedia (video, musica), pero tambien permite capturar desde dispositivos externos (una webcam por ejemplo) video y audio, eso es lo que haremos hoy.

En un tutorial pasado se vio la manera de detectar los dispositivos que se encuentren actualmente en nuestro sistema, si no lo viste, date una vuela por aqui "Buscar Dispositivos". 

Para este ejemplo, se utilizara como dispositivo de captura, "vfw:Microsoft WDM Image Capture (Win32):0"  que es el Controlador Universal de Windows para las camaras de video.


Que necesitamos:
  • IDE Netbeans 6.9
  • Libreria JMF (Java Media Framework) instalada y configurada en el sistema
  • Una WebCam, celular con camara tambien sirve

Proyecto:

1. crea un nuevo proyecto en Netbeans, llamalo "jmfvideosimple", crea una clase "jmfVideo.java" y una clase mas de tipo JFrame, llamalo "video.java", debes tener algo como esto:
Debes añadir la libreria JMF al proyecto, para esto clic derecho donde dice "Bibliotecas" y clic en "Agregar Biblioteca", si no sabes como agregar una libreria a Netbeans, busca en el blog que hay un tuto que indica como.


2. A nuestra clase "jmfVideo.java" añade el siguiente codigo:


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.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;
            }
    }

}

Esta clase utiliza el dispositivo vfw:Microsoft WDM Image Capture (Win32):0, para crear un Player y devolver un componente de VIDEO.

3. Ahora, en la clase interfaz "video.java", debemos implementar la clase anterior, para ello,solo trabajaermos en el Constructor de la clase.


public class video extends javax.swing.JFrame {
    jmfVideo b = new jmfVideo();
    /** Creates new form video */
    public video() {
        initComponents();
        this.setTitle("WebCam - by Mouse");
        //formulario al centro de la pantalla
        this.setLocationRelativeTo(null);
        //se da un tamaño al jFrame
        this.setSize(320, 240);
        //se coloca un layout tipo CAJA
        getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.LINE_AXIS));
        //se añade el componente de video
        this.add( b.Componente());
    }

Como se ve en el ejemplo, se crea una instancia a nuestra clase "jmfVideo.java" y esta se añade al JFrame , el resto del codigo, solo es para dar un tamaño inicial al JFrame y una alineacion tipo CAJA (BOX) utilizando Layout.

4. Eso es todo, solo queda ejecutar el proyecto, teniendo la webcam ya conectada claro :), (creame, pasa hasta en las mejores familias)

Y Si hicimos todo bien, ya podremos ver el video dede nuestra webcam
Como modelo en el video podemos ver a mi perro haciendo lo que mejor sabe hacer, "dormir", hubiera querido filmar otra cosa, pero un cementerio tiene mas vida que el lugar donde vivo asi que toco grabar al perro :)

Proyecto
IDE: Netbeans 6.9.1
Click para descargar
Recuerda si te bajas el Codigo Fuente, esta bien, aprenderas, pero si realizas el proyecto tu solo, aprenderas mucho mejor

continue reading

Imagen a Escala de Grises

JAN29


Para cambiar una imagen a Escala de Grises en Java se utiliza la clase ColorConvertOp al cual se le pasa como parametro ColorSpace.CS_GRAY


Codigo Fuente:

import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class Gris {
    private BufferedImage foto=null;

    public Gris(){}

     public void set_Escala_de_Grises(BufferedImage f){
       ColorConvertOp ccop = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
       foto = ccop.filter((BufferedImage)f,null);
    }

    public BufferedImage getFotoGris(){
        return this.foto;
    }

}

Implementado la clase "Gris.java" tenemos:
Eso es todo, que tal la ponja :), asi si da ganas enfermarse ;)

continue reading

4/3/11

JMF: Buscar Dispositivos

JAN29

Java Media Framwork ademas de permitir reproducir archivos multimedia, tambien permite trabajar con dispositivos de captura Audio/Video, para ello tiene a disposicion una amplia gama de comandos, entre los mas importantes, detectar que dispositivos se tienen instalados en la PC.


La siguiente clase, permite obtener una lista de los dispositivos actualmente instalados en la PC mediante la clase de JMF, CaptureDeviceManager, este nos permite obtener una lista de los dispositivos instalados. El CaptureDeviceManager también se utiliza para registrar la captura de nuevos dispositivos.


import javax.media.*;
import javax.media.cdm.CaptureDeviceManager;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class Buscar_Dispositivos {    

    public Buscar_Dispositivos(){}

    public void Escaner(){
        //se recorre la cantidad de Dispositivos que encuentra disponibles
        for(int i=0; i<CaptureDeviceManager.getDeviceList().size();i++){
            //se muestra uno por uno en pantalla
           System.out.println( ( (CaptureDeviceInfo) CaptureDeviceManager.getDeviceList().get(i) ).getName() );
        }
    }
}

Se ejecuta la clase desde un Main:


public class Main {
    public static void main(String[] args) {
      new Buscar_Dispositivos().Escaner();
    }
}

Resultado

continue reading

3/3/11

Posterizar imagenes en Java2d (Filtro Posterize)

JAN29


Posterizar una imagen es reducir el tono de sus colores a una gama mas uniforme tipo "Poster"



Teniendo una gama de colores :

RGB: 66,66,91
RGB: 131,138,211
RGB: 73,80,214

Se reducira la diferencia entre estos mediante la formula:

NuevoColorRGB = Color_RGB - (Color_RGB MOD NIVEL)

Donde Nivel podra tomar valores entre 1 y 255

Ej:
Nivel: 100

RGB: 66,66,91

R: 66 - (66 mod 100) = 0
G: 66 - (66 mod 100) = 0
B: 91 - (91 mod 100) = 0

RGB: 131,138,211

R: 131 - (131 mod 100) = 100
G: 138 - (138 mod 100) = 100
B: 211 - (211 mod 100) = 200

RGB: 73,80,214
    
R: 73 - (73 mod 100) = 0
G: 80 - (80 mod 100) = 0
B: 214 - (214 mod 100) = 200

Gama de Colores Original


Despues del Posterizado


Clase: posterize.java
Codigo Fuente:

import java.awt.Color;
import java.awt.image.BufferedImage;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class posterize {
    private BufferedImage foto;    
    private int r,g,b;
    private Color c;
    
    public posterize(){}

    public void SetPosterize(BufferedImage f, int nivel){
        this.foto = f;        
        for(int i=0;i<foto.getWidth();i++){
          for(int j=0;j<foto.getHeight();j++){  
                //Se obtiene el color RGB de cada pixel
                c = new Color(foto.getRGB(i, j));              
                r = c.getRed();
                g = c.getGreen();
                b = c.getBlue();
                //Se calcula el valor para la Posterización
                r = (r - (r % nivel));
                g = (g - (g % nivel));
                b = (b - (b % nivel));
                //se añade los nuevos valores
                foto.setRGB(i, j, new Color(r,g,b).getRGB());                                                                    
          }
        }        
    }
    
    public BufferedImage getFoto(){
        return this.foto;
    }
    
}

Implementando esta clase, tenemos a diferentes valores del parametro de calculo "Nivel":

Nivel : 50
Nivel: 100
Nivel: 150
A mayor valor de "Nivel", la imagen se ira haciendo más uniforme

continue reading

28/2/11

Invertir imagen en Java (Filtro Negativo)

JAN29

Java nos permite mediante la clase BufferedImage manipular archivos de imagen byte por byte, por ejemplo para conseguir el efecto de "negativo" para una foto como hace el filtro de photoshop, corel o gimp.

Para este ejemplo, utilizaremos una foto de "rikku", un personaje de Final Fantasy, con un lindo par de ojos ;) para invertir la imagen, obtendremos todos los pixeles de la foto, de cada pixel se extraeran sus valores RGB (rojo, verde, azul) y se les restara 255,este nuevo  valor, se insertara en una nueva imagen de tipo BufferedImag, esto se realizara para cada pixel de la image. Osea:

255 - Valor_R = Valor_R_invertido
255 - Valor_G = Valor_G_invertido
255 - Valor_B = Valor_B_invertido

La clase que hace todo esto es:


import java.awt.Color;
import java.awt.image.BufferedImage;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class invertir {
    private BufferedImage foto;
    private int r,g,b;
    private Color color;
    public invertir(){}
     
 /* Invierte los bytes de una imagen */
  public void SetInvertir(BufferedImage f){
        this.foto = f;
        for(int i=0;i<foto.getWidth();i++){
          for(int j=0;j<foto.getHeight();j++){
                //se obtiene el color del pixel
                color = new Color(foto.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
                foto.setRGB(i, j, new Color(255-r,255-g,255-b).getRGB());                                                                    
          }
        }        
    }
    
    public BufferedImage getFoto(){
        return this.foto;
    }  
    
}
Esta simple clase, recibe un objeto de tipo BufferedImage y procesa byte por byte los colores de la imagen y las invierte, esta clase tambien retorna una imagen del tipo BufferedImage invertida.

Implementando esta clase y pasando como parametro la imagen anterior, obtenemos como resultado la imagen invertida.

continue reading

21/2/11

Personalizar ToolTipText

JAN29

¿Que es ToolTipText?
Pues es el texto que se muestra en pantalla cuando se coloca el mouse encima de un objeto en java (Botones, paneles, labels, etc).

¿Para que sirve?
Sirve para mostrar ayuda visual al usuario en forma de texto.

La clase ToolTipText, acepta codigo HTML, esta caracteristica , nos permite modificar el formato del texto que se ve en pantalla, por ejemplo:

- Para colocar dos lineas en un ToolTipText de un jButton, se debe escribir:


BOTON.setToolTipText( "<html>Estoy en primera linea<br>Y yo estoy en segunda linea</html>" );
Esto nos da como resultado:
- Y asi se puede utilizar las etiquetas HTML para personalizar el ToolTipText, por ejemplo utilizando las etiquetas H1,H2,H3,H4,H5 para modificar el tamaño de las letras:

BOTON.setToolTipText( "<html><h1>Soy Grande</h1><br><h5>Y yo soy un enano<h5></html>" );

- Tambien podemos poner imagen:

BOTON.setToolTipText( "<html><img src=\""+getClass().getResource("mouse.jpg")+"\"></html>" );
Para colocar una imagen en ToolTipText, se utiliza las etiquetas HTML para imagen ( IMG ), y colocamos como ruta de la imagen, el archivo de imagen que se encuentre dentro de nuestra JAR, para eso utilizamos GETCLASS().GETRESOURCE(), que retorna la direccion del archivo.
Y tenemos:
Para terminar el post, se pueden crear complejas presentaciones para ToolTipText utilizando HTML y codigo CSS, pero sin exagerar que esto relentiza un poco la aplicación. De todas formas esta "ayuda" que brinda ToolTipText, pocas veces se utiliza por el usuario final y solo queda como un complemento mas que se puede añadir a las aplicaciones.

Codigo Fuente del ejemplo, en Netbeans 6.9.1
Click para descargar
Me actualice :)

continue reading

18/2/11

Preparar el espacio de trabajo para el modelado 3D

JAN29


Para modelar un nuevo personaje 3d o algún otro objeto en el programa 3D Max, se debe comenzar primero a preparar el espacio de trabajo, este proceso que es algo muy basico pero ademas muy importante, es lo veremos en el siguiente tutorial.

Enlace: Preparar el espacio de tranajo para el modelado 3d

continue reading

Post recomendado