Estos días he estado experimentando con java (aunque siempre he intentado evitarlo) debido a un requerimiento de un cliente para un proyecto de desarrollo.
Java y sus herramientas de desarrollo no están del todo feas como pensaba, de hecho me ha parecido muy productivo el desarrollar acá, rápidamente hice una aplicación de escritorio que se conectaba a MySQL tanto para hacer consulta como para guardar registros en par de días, sin embargo mi problema empezó al intentar hacer funcionar la webcam, pensé que un lenguaje como java podría tener muchas maneras de hacer esto y no me equivocaba, pero muchas de las cosas están desactualizadas o no funcionan, por ejemplo me parecía lógico usar el proyecto gstreamer y su bridge en java, pero el proyecto está desactualizado desde 2011.
Entre tantas pruebas y cosas que realice pude tener buenos resultados usando la librería opencv, ya se que usar opencv para manejar una webcam es una operación muy simple para todas las cosas que hace esta librería sin embargo fue donde pude tener todo funcionando además que me pareció lo más fácil de implementar que me permitiera tener funcionando lo mismo en Windows o Mac OSX con solo instalar opencv en esa plataforma (por aquello de multiplataforma).
He hecho un código de demo como proyecto de NetBeans usando pedazos de código que encontré en Internet y haciéndolo funcionar como quería en un Frame de swing desplegando el video en un jLabel y además permite tomar fotografías del video con solo presionar un botón, el código puede ser descargado acá:
[info]SwingWebCam.tar.gz[/info]
Para que funcione el código debe tener opencv instalado (disponible en los repositorios oficiales de cualquier distribución linux), además de cargar los archivos .jar del proyecto opencv en sus librerías del proyecto, no se preocupe mucho por los jar, el código mostrara errores en el Netbeans si no tiene los archivos .jar necesarios y deberá cargarlos para que pueda ejecutar el proyecto sin errores.
Espero les sirva de ayuda, cualquier duda con el código usen los comentarios, por lo demás este código no pretende ser más de lo que es (un demo), así que cualquier mejora es bienvenida pero no creo que será implementada directamente en el código.
OF COURSE Java doesn’t suck, that’s why RedHat, IBM, Oracle, and Twitter (to name a few) are investing resources into it. The FUD campaign against Java has been restless, since about 1997… http://ho.io/sunblock Yet, FUD can only fool so many…
See here:
http://www.redhat.com/summit/2012/pdf/2012-DevDay-OpenJDK-Bhole.pdf
And wait until you learn that you DON’T have to code in Java to write Java apps, thanks to JVM languages and Invokedynamic…
http://www.drdobbs.com/jvm/a-long-look-at-jvm-languages/240007765
Jython, JRuby, NetRexx, and many more…
http://en.wikipedia.org/wiki/List_of_JVM_languages
… let you access the power of the JVM and external Java libraries without having to write a single line of Java code. That’s the beauty of Java, it’s NOT ONLY a language, it’s also a Software Platform (JVM) and a level playing field software ecosystem…
Some gems you might not have heard about:
Apache Commons – Reusable Java components
http://commons.apache.org/
One-Jar, the right way to package Java apps 🙂
http://one-jar.sourceforge.net/
Java-Gnome
http://java-gnome.sourceforge.net/
OpenJFX, the future of Java GUIs
http://openjdk.java.net/projects/openjfx/
Thanks for your decision to try Java, despite the FUD! 🙂
FC
Excelente artículo Richzendy, muchas gracias por compartirlo. Justo ahora estaba evaluando apis que me permitieran el manejo de dispositivos de video con Java. También estoy apenas retomando la programación con Java, luego de varios años, y la verdad no ha sido tan malo como pensaba. :-). Buen blog, ya estaré pendiente de nuevos aportes.
Saludos.
HM
Probaste el código? si es así, te funciono todo?
Así es pana, mil gracias. De hecho lo estoy adaptando para hacerlo funcionar en OSX y probando algunas utilidades de JavaCV relacionadas a reconocimiento de caracteres y otras cosillas por ahí. Tu código me ayudo a retomar Java y a conocer JavaCV. Saludos.
oye quise replicar una parte del codigo a un proyecto prpio que es el de toma de video y me sale un erro me podrias ayudar es este Exception in thread «Thread-1» java.lang.NoClassDefFoundError: com/googlecode/javacpp/Pointer
y el ejemplo solo tal cual como está le funciona?
hola esta muy bueno tu codigo y ejemplo.. trato de adaptarlo a un sistema de alta de trabajadores.. pero para guardar la imagen en un gestor de base de datos.. necesito la ruta donde realmente se ha creado la imagen.. ojala puedas contestar
fíjate en el código en la variable a_path del fichero WebCam.java:
String a_path = «WebCamCapture_» + new java.sql.Timestamp(System.currentTimeMillis()) + «.jpg» ;
La variable a_path, contiene la ruta al archivo, físicamente no se guarda en el pc (técnicamente si, pero no accesible directamente), se guarda en el directorio resources de la aplicación.
Puedes manipular la variable y guardar el fichero en base de datos en un campo tipo blob.
pero no me es muy util, estoy guardandolas en bytes, en un campo bytea de postgres..
modificando el codigo pude hacerlo una vez, porque quedo guardada una imagen que tome desde mi aplicaion y su codigo adaptado.. y a esa variable path no le puedo dejar el new java.sql.Timestamp(System.currentTimeMillis()) porq no me la reconoce como una ruta.. gracias!!!
Hola buen dia estoy utilizando esta herramienta pero me genera un error
Exception in thread «Thread-1» java.lang.NoClassDefFoundError: com/googlecode/javacpp/Pointer
agradezco tu colaboración
saludos
Al parecer tiene que ver que no tienes javacv correctamente instalando, puedes chequear este enlace como referencia:
http://ganeshtiwaridotcomdotnp.blogspot.com/2011/12/javacv-capture-image-from-webcam.html?showComment=1334645752189#c2497329639007098814
Así lucen mis bibliotecas para el proyecto: http://i.imgur.com/dghEBik.png
Los archivos jar, deberían estar en el zip, pero creo que tienes que cargarlos manualmente además de tener instalado opencv.