ARCmop Java Programacion Solaris Linux

Java-linux-programacion

Java – JMF – Detección de Movimiento (Motion Detect)

Posted by Cmop en junio 23, 2010

jmf-motion-detect

Hola, a raíz de este comentario que me hicieron en un anterior post aqui, en el cual me preguntan como podría hacerse para detectar movimiento usando JMF.

A raíz de esto, estuve investigando y leyendo foros y encontré algunos proyectos desarrollados en java que usando JMF han implementado algoritmos de detección de movimiento, tales como JvigilanciabarkdIDS (este link a veces se encuentra caido por razones que desconozco).

Leyendo encontre que JVigilancia implementa un algoritmo para detectar movimiento diseñado por Konrad Rzeszutek, el cual se encuentra a manera de Codec – liberado bajo licencia GPL – en un claro ejemplo ilustrativo.

Estuve mirando el código y módifiqué algunas cosas, como por ejemplo: agregué el control de la sensibilidad del efecto, disminuí la amplitud en el avance del JSlider porque sino dejaba de detectar el movimiento y se quedaba pegado, ya verán en los comentarios del codigo y podrán comparar con el original.

El Codec permite Ajustar el nivel de “Sensibilidad” al movimiento, en el nivel más bajo detecta el movimiento incluso de un parpadeo, y en el nivel más alto permite mas libertad en algunos movimientos faciales.

En el video que pongo a continuación el video no se detiene (no esta fallando la webcam) sino que al no detectar movimiento la imagen queda congelada.

Adjunto el Proyecto en netbeans 6.8: DetectarMovimiento

Aún me quedan algunas inquietudes en cuanto a la detección de movimiento, tal como:

Como hace para lograr esto?

o este otro, de mayor sencillez pero no menos importante?

Bueno ya son casi las 5  de la mañana asi que haré una pausa, saludos a todos.

24 comentarios to “Java – JMF – Detección de Movimiento (Motion Detect)”

  1. hola yo estoy utilizando este metodo para mi tesis me gustaria que me ayudes como hago para que me guarde el video capturado o o al detectar movimiento me tome una foto y esta me la guarde
    favor ayudenme..

  2. Ibeth said

    hola amigo me parece muy bueno tu aporte…
    estoy trabajando sobre mi proyecto de recidencia y me piden grabar lo que visualize la webcam en un formato .mpg , .mpeg o .avi, en java se que se hace con JMF, he leido al respecto pero no lo he logrado aun podrias ayudarme de favor

    gracias por la ayuda!!!!!!

  3. Cristian Estay said

    Jaja… me estraña que casi tengas los mismos intereses que yo.. bue en fin..
    para lograr eso, nececitas usar ia , existen librerias muy buenas , pero lo mas importate, los que es es la IA en si mismo y lograr entenderla..(luego te voy a recomendar unos libros ya que toy en el ciber y no me acurdo claramente)
    ahora lo que me falta es la manipulacion de imagenes y video… y con eso estaria mas omenos listo para mi tesis…

    salu2 de chile

    • mario diaz said

      Cristian, estoy comenzando un proyecto de reconocimiento de imagenes y captura automatica de fotos, podrias darme algun dato de contacto? necesito una asesoria

  4. Maria said

    Hola, me interesa mucho el tema, me podrias enviar los enlaces de los libros q mencionas . Gracias

  5. Algun codigo que funsione en ubuntu?

  6. Andres said

    Hola amigo,gracias por todos tus aportes sobre java me han servido demasiado.
    queria ver si puedes ayudarme en un problema,lo que pasa es que necesito grabar en el disco el video capturado por la camara web y aun no encuentro como hacerlo usando JMF.

    saludos cordiales y gracias de antemano.

  7. Hola que tal!
    Tengo una duda con el uso de JMF. Lo que pasa es que estoy probando las funcionalidades de RTP(transmitiendo voz), implementando un transmisor y un receptor. Las dos clases funcionan muy bien probando las dos en una misma maquina, sin embargo, cuando implemento las clases en maquinas distintas no funciona. He desactivado firewalls y antivirus, usar el mismo jdk en las 2 maquinas, y nada! Quiza estoy omitiendo algo, podrias ayudarme porfavor?

    Te dejo el codigo de los 2 programas:

    // this class send sound
    import java.io.IOException;
    import java.util.Vector;

    import javax.media.CaptureDeviceInfo;
    import javax.media.CaptureDeviceManager;
    import javax.media.DataSink;
    import javax.media.Manager;
    import javax.media.MediaLocator;
    import javax.media.NoPlayerException;
    import javax.media.NoProcessorException;
    import javax.media.NotRealizedError;
    import javax.media.Player;
    import javax.media.Processor;
    import javax.media.control.FormatControl;
    import javax.media.control.TrackControl;
    import javax.media.format.AudioFormat;
    import javax.media.protocol.ContentDescriptor;
    import javax.media.protocol.DataSource;

    import java.net.InetAddress;
    import java.net.UnknownHostException;

    public class SimpleVoiceTransmiter {

    /**
    * @param args
    */
    public static void main(String[] args) {
    // First find a capture device that will capture linear audio
    // data at 8bit 8Khz
    AudioFormat format= new AudioFormat(AudioFormat.LINEAR,
    8000,
    8,
    1);

    Vector devices= CaptureDeviceManager.getDeviceList( format);

    CaptureDeviceInfo di= null;

    if (devices.size() > 0) {
    di = (CaptureDeviceInfo) devices.elementAt( 0);
    }
    else {
    // exit if we could not find the relevant capturedevice.
    System.exit(-1);
    }

    // Create a processor for this capturedevice & exit if we
    // cannot create it
    Processor processor = null;
    try {
    processor = Manager.createProcessor(di.getLocator());
    } catch (IOException e) {
    System.exit(-1);
    } catch (NoProcessorException e) {
    System.exit(-1);
    }

    // configure the processor
    processor.configure();

    while (processor.getState() != Processor.Configured){
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

    processor.setContentDescriptor(
    new ContentDescriptor( ContentDescriptor.RAW));

    TrackControl track[] = processor.getTrackControls();

    boolean encodingOk = false;

    // Go through the tracks and try to program one of them to
    // output gsm data.

    for (int i = 0; i < track.length; i++) {
    if (!encodingOk && track[i] instanceof FormatControl) {
    if (((FormatControl)track[i]).
    setFormat( new AudioFormat(AudioFormat.GSM_RTP,
    8000,
    8,
    1)) == null) {

    track[i].setEnabled(false);
    }
    else {
    encodingOk = true;
    }
    } else {
    // we could not set this track to gsm, so disable it
    track[i].setEnabled(false);
    }
    }

    // At this point, we have determined where we can send out
    // gsm data or not.
    // realize the processor
    if (encodingOk) {
    processor.realize();
    while (processor.getState() != Processor.Realized){
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    // get the output datasource of the processor and exit
    // if we fail
    DataSource ds = null;

    try {
    ds = processor.getDataOutput();
    } catch (NotRealizedError e) {
    System.exit(-1);
    }

    // hand this datasource to manager for creating an RTP
    // datasink our RTP datasink will multicast the audio
    try {
    //String url= "rtp://192.168.1.105:22224/audio/16";

    String url="rtp://"+InetAddress.getLocalHost().getHostAddress()+":22224/audio/16";

    System.out.println("La direccion establecida es "+url);

    MediaLocator m = new MediaLocator(url);

    DataSink d = Manager.createDataSink(ds, m);
    d.open();
    d.start();
    processor.start();
    } catch (Exception e) {
    System.exit(-1);
    }

    }

    }

    }

    Y esta es la segunda clase:

    import java.io.IOException;
    import java.net.MalformedURLException;

    import javax.media.Manager;
    import javax.media.MediaLocator;
    import javax.media.NoPlayerException;
    import javax.media.Player;

    public class SimpleVoiceReciver{

    /**
    * @param args
    */
    public static void main(String[] args) {
    String url= "rtp://192.168.1.105:22224/audio/16";

    MediaLocator mrl= new MediaLocator(url);

    if (mrl == null) {
    System.err.println("Can't build MRL for RTP");
    System.exit(-1);
    }

    // Create a player for this rtp session
    Player player = null;
    try {
    player = Manager.createPlayer(mrl);
    } catch (NoPlayerException e) {
    System.err.println("Error:" + e);
    System.exit(-1);
    } catch (MalformedURLException e) {
    System.err.println("Error:" + e);
    System.exit(-1);
    } catch (IOException e) {
    System.err.println("Error:" + e);
    System.exit(-1);
    }

    if (player != null) {
    System.out.println("Player created.");
    player.realize();
    // wait for realizing
    while (player.getState() != Player.Realized){
    try {
    Thread.sleep(10);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    player.start();
    } else {
    System.err.println("Player doesn't created.");
    System.exit(-1);
    }
    }

    }

  8. Hola que tal!
    Estoy buscando ayuda con mi aplicacion de JMF, estoy usando RTP para la transmision de voz, usando una clase transmisor y una clase receptor. Probando los 2 codigos en la misma máquina si funciona(se escucha el sonido), sin embargo, al implementarla en maquinas distintas, no se comunican, y el problema es que no me lanza ningun tipo de error, podrias ayudarme?

    Te dejo los codigos que estoy utilizando:

    // this class send sound
    import java.io.IOException;
    import java.util.Vector;

    import javax.media.CaptureDeviceInfo;
    import javax.media.CaptureDeviceManager;
    import javax.media.DataSink;
    import javax.media.Manager;
    import javax.media.MediaLocator;
    import javax.media.NoPlayerException;
    import javax.media.NoProcessorException;
    import javax.media.NotRealizedError;
    import javax.media.Player;
    import javax.media.Processor;
    import javax.media.control.FormatControl;
    import javax.media.control.TrackControl;
    import javax.media.format.AudioFormat;
    import javax.media.protocol.ContentDescriptor;
    import javax.media.protocol.DataSource;

    import java.net.InetAddress;
    import java.net.UnknownHostException;

    public class SimpleVoiceTransmiter {

    /**
    * @param args
    */
    public static void main(String[] args) {
    // First find a capture device that will capture linear audio
    // data at 8bit 8Khz
    AudioFormat format= new AudioFormat(AudioFormat.LINEAR,
    8000,
    8,
    1);

    Vector devices= CaptureDeviceManager.getDeviceList( format);

    CaptureDeviceInfo di= null;

    if (devices.size() > 0) {
    di = (CaptureDeviceInfo) devices.elementAt( 0);
    }
    else {
    // exit if we could not find the relevant capturedevice.
    System.exit(-1);
    }

    // Create a processor for this capturedevice & exit if we
    // cannot create it
    Processor processor = null;
    try {
    processor = Manager.createProcessor(di.getLocator());
    } catch (IOException e) {
    System.exit(-1);
    } catch (NoProcessorException e) {
    System.exit(-1);
    }

    // configure the processor
    processor.configure();

    while (processor.getState() != Processor.Configured){
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

    processor.setContentDescriptor(
    new ContentDescriptor( ContentDescriptor.RAW));

    TrackControl track[] = processor.getTrackControls();

    boolean encodingOk = false;

    // Go through the tracks and try to program one of them to
    // output gsm data.

    for (int i = 0; i < track.length; i++) {
    if (!encodingOk && track[i] instanceof FormatControl) {
    if (((FormatControl)track[i]).
    setFormat( new AudioFormat(AudioFormat.GSM_RTP,
    8000,
    8,
    1)) == null) {

    track[i].setEnabled(false);
    }
    else {
    encodingOk = true;
    }
    } else {
    // we could not set this track to gsm, so disable it
    track[i].setEnabled(false);
    }
    }

    // At this point, we have determined where we can send out
    // gsm data or not.
    // realize the processor
    if (encodingOk) {
    processor.realize();
    while (processor.getState() != Processor.Realized){
    try {
    Thread.sleep(100);
    } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    // get the output datasource of the processor and exit
    // if we fail
    DataSource ds = null;

    try {
    ds = processor.getDataOutput();
    } catch (NotRealizedError e) {
    System.exit(-1);
    }

    // hand this datasource to manager for creating an RTP
    // datasink our RTP datasink will multicast the audio
    try {
    //String url= "rtp://192.168.1.105:22224/audio/16";

    String url="rtp://"+InetAddress.getLocalHost().getHostAddress()+":22224/audio/16";

    System.out.println("La direccion establecida es "+url);

    MediaLocator m = new MediaLocator(url);

    DataSink d = Manager.createDataSink(ds, m);
    d.open();
    d.start();
    processor.start();
    } catch (Exception e) {
    System.exit(-1);
    }

    }

    }

    }

    Y el receptor:

    import java.io.IOException;
    import java.net.MalformedURLException;

    import javax.media.Manager;
    import javax.media.MediaLocator;
    import javax.media.NoPlayerException;
    import javax.media.Player;

    public class SimpleVoiceReciver{

    /**
    * @param args
    */
    public static void main(String[] args) {
    String url= "rtp://192.168.1.105:22224/audio/16";

    MediaLocator mrl= new MediaLocator(url);

    if (mrl == null) {
    System.err.println("Can't build MRL for RTP");
    System.exit(-1);
    }

    // Create a player for this rtp session
    Player player = null;
    try {
    player = Manager.createPlayer(mrl);
    } catch (NoPlayerException e) {
    System.err.println("Error:" + e);
    System.exit(-1);
    } catch (MalformedURLException e) {
    System.err.println("Error:" + e);
    System.exit(-1);
    } catch (IOException e) {
    System.err.println("Error:" + e);
    System.exit(-1);
    }

    if (player != null) {
    System.out.println("Player created.");
    player.realize();
    // wait for realizing
    while (player.getState() != Player.Realized){
    try {
    Thread.sleep(10);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    player.start();
    } else {
    System.err.println("Player doesn't created.");
    System.exit(-1);
    }
    }

    }

    Te agradezco de antemano, pues de verdad necesito ayuda.
    Buen blog!!

  9. Andres said

    Hey amigo me podrias decir como agregar una accion al detectar el movimiento dependiendo del nivel de control de sensibilidad.
    por ejemplo hacer un System.out.println(“se detecto movimiento”); al detectarse el movimiento.
    eso..saludos espero me puedas ayudar.

    • Andres said

      Ya lo resolvi🙂 ….lo que no he podido hacer es capturar una foto usando processor ya que usando un player lo he podido lograr..
      me podrias ayudar porfavor a capturar una foto usando processor.
      saludos

      • Sergio said

        Puede decir que hay que hacer para que cuando detecte un movimiento salte una accion como por ejemplo System.out.println(“se detecto movimiento”);, yo quiero que se capture una foto cuando detecte un movimiento. Gracias por contestar

      • mario diaz said

        Andres, podrias indicarme como hiciste la captura de imagen??

  10. victor said

    de favor pueden compartir el codigo fianl
    bk_soft@hotmail.com

  11. Heranan said

    Holas, esta muy buena la pagina.
    Tengo un problema al ejecutar el codigo me entrega el siguiente error:

    Exception in thread “VFW Request Thread” java.lang.UnsatisfiedLinkError: JMFSecurityManager: java.lang.UnsatisfiedLinkError: no jmvfw in java.library.path
    at com.sun.media.JMFSecurityManager.loadLibrary(JMFSecurityManager.java:206)
    at com.sun.media.protocol.vfw.VFWCapture.(VFWCapture.java:19)
    at com.sun.media.protocol.vfw.VFWSourceStream.doConnect(VFWSourceStream.java:241)
    at com.sun.media.protocol.vfw.VFWSourceStream.run(VFWSourceStream.java:763)
    at java.lang.Thread.run(Thread.java:722)

    me podrias ayudar o dar alguna pista para solucionar el problema.

  12. Gracias por compartir😀
    Os dejo un enlace en el que podréis encontrar bastante información sobre el uso de la webcam en java, información que va en aumento con el tiempo😉
    http://programmingheroes.blogspot.com.es/p/java.html#webcam

  13. geo said

    Al descargar sus proyectos me sale el siguiente error:
    Exception in thread “VFW Request Thread” java.lang.UnsatisfiedLinkError: JMFSecurityManager: java.lang.UnsatisfiedLinkError: no jmvfw in java.library.path
    at com.sun.media.JMFSecurityManager.loadLibrary(JMFSecurityManager.java:206)
    at com.sun.media.protocol.vfw.VFWCapture.(VFWCapture.java:19)
    at com.sun.media.protocol.vfw.VFWSourceStream.doConnect(VFWSourceStream.java:241)
    at com.sun.media.protocol.vfw.VFWSourceStream.run(VFWSourceStream.java:763)
    at java.lang.Thread.run(Thread.java:662)
    BUILD STOPPED (total time: 4 seconds)

    ya instale el JMF y en JMStudio si funciona la captura de imagenes. Alguna sugerencia.??

  14. Andres said

    Hola,muy buenas,leyendo la entrada me encontré con el software que mencionas JVigilancia,descargue el .jar funcionando de maravilla con cámaras instaladas en el sistema,pero me encuentro con un error que no he podido solucionar ya hace un mes que tiene el software con cámaras ip,no hay caso de hacerlo funcionar con cámaras ip,si alguien pueda darme algún consejo se lo agradecería mucho.
    saludos

  15. Ulises said

    Yo logre hacer uno completo. Dejen sus correos para compartir ideas

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: