Catturare l’immagine dalla webcam in java?

Come posso acquisire continuamente immagini da una webcam?

Voglio sperimentare il riconoscimento degli oggetti (magari usando java media framework).

Stavo pensando di creare due thread

una discussione:

  • Nodo 1: cattura l’immagine live
  • Nodo 2: salva l’immagine come “1.jpg”
  • Nodo 3: attendere 5 secondi
  • Nodo 4: ripetere …

altro thread:

  • Nodo 1: attendi fino a quando l’immagine non viene catturata
  • Nodo 2: usando il “1.jpg” ottieni colors da ogni pixle
  • Nodo 3: salva i dati negli array
  • Nodo 4: ripetere …

Questa implementazione JavaCV funziona correttamente.

Codice:

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);// lr = 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(); } } 

C’è anche un post sulla configurazione per JavaCV

È ansible modificare i codici ed essere in grado di salvare le immagini in intervalli regolari e fare il resto dell’elaborazione desiderata.

Qualche tempo fa ho creato una libreria Java generica che può essere utilizzata per scattare foto con una webcam per PC. L’API è molto semplice, non sovradimensionata, può funzionare autonomamente, ma supporta anche driver di webcam aggiuntivi come OpenIMAJ, JMF, FMJ, LTI-CIVIL, ecc. E alcune telecamere IP.

Il link al progetto è https://github.com/sarxos/webcam-capture

Esempio di codice (scatta una foto e salvala in test.jpg):

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

È anche disponibile in Maven Central Repository o come ZIP separato che include tutte le dipendenze richieste e i JAR di terze parti.

JMyron è molto semplice da usare. http://webcamxtra.sourceforge.net/

 myron = new JMyron(); myron.start(imgw, imgh); myron.update(); int[] img = myron.image(); 

Ecco una domanda simile con alcune risposte, anche se non accettate. Uno di questi menziona FMJ come alternativa java a JMF.

Questo tipo di risposta di gt_ebuddy viene eseguita utilizzando JavaCV, ma il mio output video ha una qualità molto più alta della sua risposta. Ho anche aggiunto alcuni altri miglioramenti casuali (come la chiusura del programma quando si preme ESC e CTRL + C e ci si assicura di chiudere le risorse che il programma usa correttamente).

 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 actionPerformsd(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; } } 

Puoi anche provare la libreria Java Webcam SDK . L’applet demo SDK è disponibile al link .

Ho usato JMF su un’applicazione di videoconferenza e ha funzionato bene su due laptop: uno con webcam integrata e l’altro con una vecchia webcam USB. Richiede che JMF sia installato e configurato in precedenza, ma una volta terminato è ansible accedere all’hardware tramite codice Java abbastanza facilmente.

Puoi provare Marvin Framework . Fornisce un’interfaccia per lavorare con le fotocamere. Inoltre, fornisce anche un set di funzionalità di elaborazione video in tempo reale, come il tracciamento degli oggetti e il filtraggio.

Guarda!

Demo di elaborazione video in tempo reale:
http://www.youtube.com/watch?v=D5mBt0kRYvk

Puoi usare la fonte qui sotto. Basta salvare una cornice usando MarvinImageIO.saveImage () ogni 5 secondi.

Demo video webcam:

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

Per coloro che vogliono solo fare una singola 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(); } } } 

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

Usando il giocatore con Swing

Il Player può essere facilmente utilizzato anche in un’applicazione Swing. Il codice seguente crea un programma di acquisizione TV basato su Swing con l’output video visualizzato nell’intera finestra:

 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(); } } 

A Java di solito non piace accedere all’hardware, quindi avrete bisogno di un programma di driver di qualche tipo, come ha detto goldenmean. L’ho fatto sul mio portatile trovando un programma a riga di comando che scatta un’immagine. Quindi è lo stesso spiegato da goldenmean; si esegue il programma da riga di comando dal programma java nella routine takepicture () e il resto del codice viene eseguito allo stesso modo.

Ad eccezione della parte relativa alla lettura dei valori dei pixel in una matrice, potrebbe essere meglio salvare il file in BMP, che è già quasi quel formato, quindi utilizzare le librerie di immagini java standard su di esso.

L’uso di un programma a riga di comando aggiunge una dipendenza al tuo programma e lo rende meno portabile, ma lo era anche la webcam, giusto?

Ho usato Webcam Capture API … puoi scaricare da questo 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")); } } } 

Credo che il software applicativo web-cam che accompagna la web-cam, o il software nativo per webcam Windows, possa essere eseguito in uno script batch (script windows / dos) dopo aver acceso la web cam (cioè se necessita di alimentazione esterna fornitura). Nello script BAC, puoi aggiungere il ritardo appropriato per l’acquisizione dopo un certo periodo di tempo. E continua ad eseguire il comando di cattura in loop.

Immagino che dovrebbe essere ansible

-ANNO DOMINI

C’è un’interfaccia molto carina per questo nell’elaborazione , che è una specie di pidgin java progettato per la grafica. Viene utilizzato in alcuni lavori di riconoscimento delle immagini, come quel collegamento.

A seconda di ciò che ti serve, potresti caricare la libreria video che è stata utilizzata in Java o, se stai giocando con essa, potresti riuscire a utilizzare l’elaborazione stessa.

FMJ può farlo, così come la libreria di supporto che usa, LTI-CIVIL. Entrambi sono su sourceforge.

Raccomandare l’uso di FMJ per l’app java relativa al multimedia.

Prova a utilizzare JMyron Come utilizzare la webcam con Java . Penso che usare JMyron sia il modo più semplice per accedere a una webcam usando java. Ho provato ad usarlo con un processore a 64 bit, ma mi ha dato un errore. Tuttavia, ha funzionato bene su un processore a 32 bit.