seleccionar imagen desde capturar camara cam java image webcam capture

java - imagen - web cam api



Captura de imagen de la webcam en java? (16)

Utilicé la API de captura de Webcam ... puedes descargar desde esta http://webcam-capture.sarxos.pl/

webcam = Webcam.getDefault(); webcam.open(); if (webcam.isOpen()) { //if web cam open BufferedImage image = webcam.getImage(); JLabel imageLbl = new JLabel(); imageLbl.setSize(640, 480); //show captured image imageLbl.setIcon(new ImageIcon(image)); int showConfirmDialog = JOptionPane.showConfirmDialog(null, imageLbl, "Image Viewer", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, new ImageIcon("")); if (showConfirmDialog == JOptionPane.YES_OPTION) { JFileChooser chooser = new JFileChooser(); chooser.setDialogTitle("Save Image"); chooser.setFileFilter(new FileNameExtensionFilter("IMAGES ONLY", "png", "jpeg", "jpg")); //this file extentions are shown int showSaveDialog = chooser.showSaveDialog(this); if (showSaveDialog == 0) { //if pressed ''Save'' button String filePath = chooser.getCurrentDirectory().toString().replace("//", "/"); String fileName = chooser.getSelectedFile().getName(); //get user entered file name to save ImageIO.write(image, "PNG", new File(filePath + "/" + fileName + ".png")); } } }

¿Cómo puedo capturar imágenes de una cámara web de forma continua?

Quiero experimentar con el reconocimiento de objetos (tal vez usando el framework java media).

Estaba pensando en crear dos hilos

un hilo:

  • Nodo 1: captura de imagen en vivo
  • Nodo 2: guardar la imagen como "1.jpg"
  • Nodo 3: espera 5 segundos
  • Nodo 4: repetir ...

otro hilo:

  • Nodo 1: espere hasta que se capture la imagen
  • Nodo 2: utilizando el "1.jpg" obtiene colores de cada píxel
  • Nodo 3: guardar datos en matrices
  • Nodo 4: repetir ...

Creo que el software de aplicación de cámara web que acompaña a la cámara web o el software nativo de cámara web de Windows se puede ejecutar en un script por lotes (secuencia de comandos windows / dos) después de encender la cámara web (es decir, si necesita una alimentación externa suministro). En el script bacth, puede agregar la demora apropiada para capturar después de cierto período de tiempo. Y sigue ejecutando el comando de captura en bucle.

Supongo que esto debería ser posible

-ANUNCIO


Esta implementación JavaCV funciona bien.

Código:

import org.bytedeco.javacv.*; import static org.bytedeco.javacpp.opencv_core.IplImage; import static org.bytedeco.javacpp.opencv_core.cvFlip; import static org.bytedeco.javacpp.opencv_imgcodecs.cvSaveImage; /** * Created by gtiwari on 1/3/2017. */ public class Test implements Runnable { final int INTERVAL = 100;///you may use interval CanvasFrame canvas = new CanvasFrame("Web Cam"); public Test() { canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); } public void run() { FrameGrabber grabber = new VideoInputFrameGrabber(0); // 1 for next camera OpenCVFrameConverter.ToIplImage converter = new OpenCVFrameConverter.ToIplImage(); IplImage img; int i = 0; try { grabber.start(); while (true) { Frame frame = grabber.grab(); img = converter.convert(frame); //the grabbed frame will be flipped, re-flip to make it right cvFlip(img, img, 1);// l-r = 90_degrees_steps_anti_clockwise //save cvSaveImage((i++) + "-aa.jpg", img); canvas.showImage(converter.convert(img)); Thread.sleep(INTERVAL); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { Test gs = new Test(); Thread th = new Thread(gs); th.start(); } }

También hay una publicación sobre la configuración para JavaCV

Puede modificar los códigos y guardar las imágenes en intervalos regulares y hacer el resto del procesamiento que desee.


Este tipo de respuesta desaparece de la respuesta de gt_ebuddy usando JavaCV, pero mi salida de video es de una calidad mucho más alta que su respuesta. También agregué algunas otras mejoras aleatorias (como cerrar el programa cuando se presionan ESC y CTRL + C , y cerrando los recursos que el programa usa correctamente).

import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.image.BufferedImage; import javax.swing.AbstractAction; import javax.swing.ActionMap; import javax.swing.InputMap; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.KeyStroke; import com.googlecode.javacv.CanvasFrame; import com.googlecode.javacv.OpenCVFrameGrabber; import com.googlecode.javacv.cpp.opencv_core.IplImage; public class HighRes extends JComponent implements Runnable { private static final long serialVersionUID = 1L; private static CanvasFrame frame = new CanvasFrame("Web Cam"); private static boolean running = false; private static int frameWidth = 800; private static int frameHeight = 600; private static OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0); private static BufferedImage bufImg; public HighRes() { // setup key bindings ActionMap actionMap = frame.getRootPane().getActionMap(); InputMap inputMap = frame.getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW); for (Keys direction : Keys.values()) { actionMap.put(direction.getText(), new KeyBinding(direction.getText())); inputMap.put(direction.getKeyStroke(), direction.getText()); } frame.getRootPane().setActionMap(actionMap); frame.getRootPane().setInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW, inputMap); // setup window listener for close action frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { stop(); } }); } public static void main(String... args) { HighRes webcam = new HighRes(); webcam.start(); } @Override public void run() { try { grabber.setImageWidth(frameWidth); grabber.setImageHeight(frameHeight); grabber.start(); while (running) { final IplImage cvimg = grabber.grab(); if (cvimg != null) { // cvFlip(cvimg, cvimg, 1); // mirror // show image on window bufImg = cvimg.getBufferedImage(); frame.showImage(bufImg); } } grabber.stop(); grabber.release(); frame.dispose(); } catch (Exception e) { e.printStackTrace(); } } public void start() { new Thread(this).start(); running = true; } public void stop() { running = false; } private class KeyBinding extends AbstractAction { private static final long serialVersionUID = 1L; public KeyBinding(String text) { super(text); putValue(ACTION_COMMAND_KEY, text); } @Override public void actionPerformed(ActionEvent e) { String action = e.getActionCommand(); if (action.equals(Keys.ESCAPE.toString()) || action.equals(Keys.CTRLC.toString())) stop(); else System.out.println("Key Binding: " + action); } } } enum Keys { ESCAPE("Escape", KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0)), CTRLC("Control-C", KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK)), UP("Up", KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0)), DOWN("Down", KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0)), LEFT("Left", KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0)), RIGHT("Right", KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0)); private String text; private KeyStroke keyStroke; Keys(String text, KeyStroke keyStroke) { this.text = text; this.keyStroke = keyStroke; } public String getText() { return text; } public KeyStroke getKeyStroke() { return keyStroke; } @Override public String toString() { return text; } }


FMJ puede hacer esto, al igual que la biblioteca de apoyo que utiliza, LTI-CIVIL. Ambos están en sourceforge.


Hace algún tiempo creé una biblioteca genérica de Java que se puede usar para tomar fotos con la cámara web de una PC. La API es muy simple, no está sobrecargada, puede funcionar de manera independiente, pero también admite controladores adicionales de webcam como OpenIMAJ, JMF, FMJ, LTI-CIVIL, etc. y algunas cámaras IP.

El enlace al proyecto es https://github.com/sarxos/webcam-capture

Código de ejemplo (tomar foto y guardar en test.jpg):

Webcam webcam = Webcam.getDefault(); webcam.open(); BufferedImage image = webcam.getImage(); ImageIO.write(image, "JPG", new File("test.jpg"));

También está disponible en Maven Central Repository o como un ZIP separado que incluye todas las dependencias requeridas y los JAR de terceros.


Hay una interfaz bastante agradable para esto en el procesamiento , que es una especie de pidgin java diseñado para gráficos. Se usa en algunos trabajos de reconocimiento de imágenes, como ese enlace.

Dependiendo de lo que necesite, puede cargar la biblioteca de videos que se usa allí en Java, o si solo está jugando con ella, es posible que pueda obtener usando el procesamiento mismo.


He usado JMF en una aplicación de videoconferencia y funcionó bien en dos computadoras portátiles: una con cámara web integrada y otra con una cámara web USB anterior. Requiere JMF ser instalado y configurado de antemano, pero una vez que haya terminado puede acceder al hardware a través del código Java con bastante facilidad.


Intente usar JMyron Cómo usar la cámara web usando Java . Creo que usar JMyron es la forma más fácil de acceder a una cámara web usando java. Traté de usarlo con un procesador de 64 bits, pero me dio un error. Sin embargo, funcionó bien en un procesador de 32 bits.



Normalmente, a Java no le gusta acceder al hardware, por lo que necesitará un programa de controlador de algún tipo, como dijo GoldenMean. Lo he hecho en mi computadora portátil al encontrar un programa de línea de comando que toma una foto. Entonces es lo mismo que goldenmean explicó; ejecuta el programa de línea de comando desde su programa java en la rutina takepicture (), y el resto de su código se ejecuta igual.

Excepto por la parte sobre la lectura de valores de píxeles en una matriz, es mejor que guarde el archivo en BMP, que ya casi tiene ese formato, y luego use las bibliotecas de imágenes java estándar.

El uso de un programa de línea de comando agrega una dependencia a su programa y lo hace menos portátil, pero también lo fue la cámara web, ¿verdad?


Puedes probar Marvin Framework . Proporciona una interfaz para trabajar con cámaras. Además, también proporciona un conjunto de funciones de procesamiento de video en tiempo real, como seguimiento de objetos y filtrado.

¡Echar un vistazo!

Demostración de procesamiento de video en tiempo real:
http://www.youtube.com/watch?v=D5mBt0kRYvk

Puedes usar la fuente a continuación. Simplemente guarde un marco usando MarvinImageIO.saveImage () cada 5 segundos.

Demostración de video de cámara web:

public class SimpleVideoTest extends JFrame implements Runnable{ private MarvinVideoInterface videoAdapter; private MarvinImage image; private MarvinImagePanel videoPanel; public SimpleVideoTest(){ super("Simple Video Test"); videoAdapter = new MarvinJavaCVAdapter(); videoAdapter.connect(0); videoPanel = new MarvinImagePanel(); add(videoPanel); new Thread(this).start(); setSize(800,600); setVisible(true); } @Override public void run() { while(true){ // Request a video frame and set into the VideoPanel image = videoAdapter.getFrame(); videoPanel.setImage(image); } } public static void main(String[] args) { SimpleVideoTest t = new SimpleVideoTest(); t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }

Para aquellos que solo quieren tomar una sola foto:

WebcamPicture.java

public class WebcamPicture { public static void main(String[] args) { try{ MarvinVideoInterface videoAdapter = new MarvinJavaCVAdapter(); videoAdapter.connect(0); MarvinImage image = videoAdapter.getFrame(); MarvinImageIO.saveImage(image, "./res/webcam_picture.jpg"); } catch(MarvinVideoInterfaceException e){ e.printStackTrace(); } } }


Recommand usando FMJ para la aplicación Java relativa de multimedia.


También puedes probar la biblioteca Java Webcam SDK . El applet de demostración de SDK está disponible en el link .


Here hay una pregunta similar con algunas respuestas aún no aceptadas. Uno de ellos menciona a FMJ como una alternativa de Java a JMF.


http://grack.com/downloads/school/enel619.10/report/java_media_framework.html

Usando el jugador con Swing

El reproductor también se puede usar fácilmente en una aplicación Swing. El siguiente código crea un programa de captura de TV basado en Swing con la salida de video mostrada en toda la ventana:

import javax.media.*; import javax.swing.*; import java.awt.*; import java.net.*; import java.awt.event.*; import javax.swing.event.*; public class JMFTest extends JFrame { Player _player; JMFTest() { addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) { _player.stop(); _player.deallocate(); _player.close(); System.exit( 0 ); } }); setExtent( 0, 0, 320, 260 ); JPanel panel = (JPanel)getContentPane(); panel.setLayout( new BorderLayout() ); String mediaFile = "vfw://1"; try { MediaLocator mlr = new MediaLocator( mediaFile ); _player = Manager.createRealizedPlayer( mlr ); if (_player.getVisualComponent() != null) panel.add("Center", _player.getVisualComponent()); if (_player.getControlPanelComponent() != null) panel.add("South", _player.getControlPanelComponent()); } catch (Exception e) { System.err.println( "Got exception " + e ); } } public static void main(String[] args) { JMFTest jmfTest = new JMFTest(); jmfTest.show(); } }