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.
JMyron es muy simple de usar. http://webcamxtra.sourceforge.net/
myron = new JMyron();
myron.start(imgw, imgh);
myron.update();
int[] img = myron.image();
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 .
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();
}
}