L’acquisizione di immagini da webcam in java?

Come posso continuamente acquisizione di immagini da una webcam?

Voglio sperimentare con il riconoscimento di oggetti (da forse utilizzando java media framework).

Stavo pensando di creare due thread

un thread:

  • Nodo 1: acquisizione immagine live
  • Nodo 2: salva immagine con nome “1.jpg”
  • Nodo 3: attendere 5 secondi
  • Nodo 4: ripetere…

altro thread:

  • Nodo 1: attendere fino a quando l’immagine viene catturata
  • Nodo 2: utilizzando il “1.jpg” ottenere colori
    da ogni pixle
  • Nodo 3: salvare i dati in un array
  • Nodo 4: ripetere…



16 Replies
  1. 46

    Questo JavaCV attuazione funziona bene.

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

    C’è anche post sulla configurazione per JavaCV

    È possibile modificare i codici e di essere in grado di salvare le immagini a intervalli regolari e fare il resto della lavorazione.

    • +1 È rock! Ero alla ricerca di un buon open source e supportato alternativa a JMF per webcam cattura sia con Windows che con Linux. Questo funziona come un fascino! Grazie 🙂
    • Non funziona per me, dice Exception in thread “main” java.lang.UnsatisfiedLinkError: C:\Users\steve\AppData\Local\Temp\javacpp213892357885346\jniopencv_core.dll: non riesco a trovare librerie indipendenti
    • Questo funziona, ma la qualità video non è così buona come dovrebbe essere. Vedi la mia risposta per l’uscita video migliore qualità.
    • Grazie per il suggerimento. Io sono interessato a come impostare su Windows? Ho bisogno del 3Gb estratto zip? Altrimenti il mio programma, utilizzando JavaCV su Linux funziona bene.
    • hai bisogno di OpenCV installato.
  2. 32

    Qualche tempo fa ho creato generico libreria Java che può essere utilizzato per scattare foto con una webcam del PC. L’API è molto semplice, non overfeatured, in grado di lavorare autonomo, ma supporta anche l’aggiunta di driver per la webcam come OpenIMAJ, JMF, FMJ, LTI-CIVILE, ecc, e alcune telecamere IP.

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

    Codice di esempio (di scattare foto e salvare in test.jpg):

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

    È anche disponibile nel Repository Repository Centrale indipendente di ZIP che include tutte le dipendenze richieste e 3rd party Vasetti.

    • Per la facilità di ottenere iniziato questa è ben la pena dare un’occhiata. Il codice ha funzionato grande per me, spero anche voi 🙂
    • Firyn : ciao sto lavorando con le API. impressionante il lavoro di un uomo!ma ora voglio sapere che se lo zoom nella fotocamera supportata o no? come zoom della fotocamera utilizzando questa API?
    • non c’è il supporto nativo per lo zoom.
    • ok grazie e per quanto riguarda il disegno sulla fotocamera? Vorrei attirare la cornice Trasparente sulla fotocamera? quindi è possibile con le API?
    • è possibile disegnare sul pannello di visualizzazione dello schermo della fotocamera (WebcamPanel) tramite l’impostazione personalizzata Pittore esempio, o direttamente sull’immagine che viene dalla fotocamera utilizzando WebcamImageTransformer funzione. Per ulteriori dettagli, si prega di aprire il biglietto su Webcam Capture pagina del progetto su Github, dal momento che non voglio spiegare qui i dettagli su Stack Overflow (troppo da scrivere e troppo pochi caratteri da utilizzare nei commenti). Il progetto può essere trovato qui github.com/sarxos/webcam-capture
    • Hadizadeh, in caso di problemi si può sempre creare nuova emissione biglietteria github.com/sarxos/webcam-capture, dove è anche possibile trovare la documentazione ed esempi. Tenete anche a mente che questo è il quadro di riferimento per la gente, piuttosto familiarità con Java. Nel caso In cui si sono Java newby ci sono anche persone che vogliono aiutare, ma devi imparare nozioni di base sul proprio.
    • Sono d’accordo con voi, devo migliorare la mia conoscenza, ti ringrazio per la risposta. 🙂
    • Questa è una grande biblioteca. Esso copre tutte le esigenze per la dinamica webcam cattura foto. Dispone anche di capacità di rilevamento del movimento. Grande opzione.

  3. 5

    Qui è una domanda simile con alcuni – ma non – risposte. Uno di loro nomina FMJ come alternativa java per JMF.

  4. 5

    Questo tipo di va fuori di gt_ebuddy risposta utilizzando JavaCV, ma la mia uscita video è di una qualità molto più elevata, quindi la sua risposta. Ho anche aggiunto alcune altre casuale miglioramenti (come la chiusura del programma quando ESC e CTRL+C vengono premuti, e fare in modo di chiudere le risorse che il programma utilizza 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 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;
        }
    }
  5. 3

    Ho usato JMF in videoconferenza alla domanda e hanno lavorato bene su due portatili: uno con webcam integrata e un altro con una vecchia webcam USB. Si richiede JMF essere installato e configurato prima mano, ma una volta che hai finito, si può accedere all’hardware tramite codice Java abbastanza facilmente.

    • mi puoi dare il frammento di codice del vostro progetto?
  6. 3

    Si può provare Marvin Quadro. Esso fornisce un’interfaccia per lavorare con le telecamere. Inoltre, esso fornisce anche una serie di video in tempo reale, funzioni di elaborazione, come oggetto di monitoraggio e filtraggio.

    Dare un’occhiata!

    In tempo reale di Elaborazione Video Demo:

    http://www.youtube.com/watch?v=D5mBt0kRYvk

    È possibile utilizzare la fonte di seguito. Basta salvare un fotogramma utilizzando MarvinImageIO.saveImage() ogni 5 secondi.

    Webcam video demo:

    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 prendere una singola immagine:

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

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

    Di utilizzare il Lettore con Swing

    Il Giocatore può essere facilmente utilizzato in un’Altalena di applicazione. Il codice seguente crea un Swing-based TV programma di cattura con l’uscita video visualizzati in tutta la 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();
        }
    }
  8. 2

    Ho usato la Webcam Capture API…u può 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"));
    
                    }
                }
            }
    • Dovresti fornire qualche spiegazione con il codice
    • grazie. e ‘ leggero e invece javacv questo funziona per me.
  9. 1

    Java, di solito, non come si accede all’hardware, quindi avrete bisogno di un programma di driver di qualche tipo, come goldenmean detto. Questo l’ho fatto io sul mio portatile con la ricerca di un programma a riga di comando che scatta una foto. Quindi è la stessa goldenmean spiegato; si esegue il programma a riga di comando dal tuo programma java in takepicture() di routine, e il resto del codice viene eseguito lo stesso.

    Tranne che per la parte che riguarda la lettura dei valori dei pixel in un array, si potrebbe essere meglio servita da salvare il file BMP, quasi che già formato, quindi utilizzando lo standard java raccolte di immagini su di esso.

    Utilizzando una riga di comando programma aggiunge una dipendenza del programma e lo rende meno portatile, ma così era la webcam, giusto?

  10. 0

    Credo che la web-cam applicazione software che viene fornito insieme con la web-cam, o è nativo di windows webcam software può essere eseguito in uno script batch(windows/dos script) dopo aver attivato la web cam su(per esempio se si ha bisogno di un alimentatore esterno). L’arredo bagno script , u può aggiungere ritardo appropriato per catturare dopo un certo periodo di tempo. E continuare ad eseguire il comando di acquisizione in loop.

    Credo che questo dovrebbe essere possibile

    -ANNUNCIO

  11. 0

    C’è una bella bella interfaccia in elaborazione, che è una specie di pidgin java progettato per la grafica. Esso viene utilizzato in alcune immagine un lavoro di riconoscimento, come quel link.

    A seconda di cosa si ha bisogno di esso, si potrebbe essere in grado di caricare la libreria di video che è utilizzata in java, o se si sta solo giocando con esso si potrebbe essere in grado di ottenere attraverso l’elaborazione stessa.

  12. 0

    FMJ può fare questo, come può il sostegno libreria utilizzata, LTI-CIVILE. Entrambi sono su sourceforge.

Lascia un commento