it-swarm.com.de

Bild von der Webcam in Java aufnehmen?

Wie kann ich kontinuierlich Bilder von einer Webcam aufnehmen?

Ich möchte mit der Objekterkennung experimentieren (möglicherweise unter Verwendung des Java Media Framework). 

Ich dachte daran, zwei Threads zu erstellen

ein Thread:

  • Knoten 1: Livebild aufnehmen
  • Knoten 2: Bild als "1.jpg" speichern
  • Knoten 3: Warten Sie 5 Sekunden
  • Knoten 4: wiederhole ...

anderer Thread:

  • Knoten 1: Warten Sie, bis das Bild aufgenommen wurde
  • Knoten 2: Mit dem "1.jpg" erhalten Sie Farben Von jedem Pixel
  • Knoten 3: Daten in Arrays speichern
  • Knoten 4: wiederhole ...
79
Divide By Zero

Diese JavaCV-Implementierung funktioniert einwandfrei.

Code:

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

Es gibt auch post on Konfiguration für JavaCV

Sie können die Codes ändern und in der Lage sein, die Bilder in regelmäßigen Abständen zu speichern und den Rest der gewünschten Verarbeitung durchzuführen.

44
gtiwari333

Vor einiger Zeit habe ich eine generische Java-Bibliothek erstellt, mit der Sie Bilder mit einer PC-Webcam aufnehmen können. Die API ist sehr einfach, nicht überfordert, kann eigenständig arbeiten, unterstützt jedoch auch zusätzliche Webcam-Treiber wie OpenIMAJ, JMF, FMJ, LTI-CIVIL usw. und einige IP-Kameras.

Link zum Projekt ist https://github.com/sarxos/webcam-capture

Beispielcode (Foto aufnehmen und in test.jpg speichern):

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

Es ist auch in Maven Central Repository oder als separate Zip-Datei verfügbar, die alle erforderlichen Abhängigkeiten und JARs von Drittanbietern enthält.

30
Bartosz Firyn

JMyron ist sehr einfach zu benutzen . http://webcamxtra.sourceforge.net/

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

Hier ist eine ähnliche Frage mit einigen - jedoch nicht akzeptierten - Antworten. Einer von ihnen erwähnt FMJ als Java-Alternative zu JMF.

5
rics

Diese Art von geht aus der Antwort von gt_ebuddy mit JavaCV hervor, aber meine Videoausgabe hat eine viel höhere Qualität als seine Antwort. Ich habe auch einige andere zufällige Verbesserungen hinzugefügt (wie das Beenden des Programms, wenn ESC und CTRL+C gedrückt werden und sicherstellen, dass die vom Programm verwendeten Ressourcen ordnungsgemäß geschlossen werden.

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
syb0rg

Sie können auch versuchen, Java Webcam SDK library. . Das SDK - Demo - Applet ist unter link verfügbar.

4
Andrei

Ich habe JMF für eine Videokonferenzanwendung verwendet und es funktionierte gut auf zwei Laptops: eines mit integrierter Webcam und eines mit einer alten USB-Webcam. JMF muss zuvor installiert und konfiguriert werden. Sobald Sie jedoch fertig sind, können Sie über Java-Code relativ einfach auf die Hardware zugreifen.

3
ArnauVP

Sie können versuchen, Marvin Framework . Es bietet eine Schnittstelle zum Arbeiten mit Kameras. Darüber hinaus bietet es auch eine Reihe von Echtzeit-Videobearbeitungsfunktionen wie Objektverfolgung und -filterung.

Schau mal!

Echtzeit-Videobearbeitungs-Demo:
http://www.youtube.com/watch?v=D5mBt0kRYvk

Sie können die Quelle unten verwenden. Speichern Sie einfach einen Frame mit MarvinImageIO.saveImage () alle 5 Sekunden.

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

Für diejenigen, die nur ein einzelnes Foto machen möchten:

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

Ich habe die Webcam-Capture-API verwendet ... Sie können diese hier herunterladen 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"));

                }
            }
        }
2
Uddika Dilshan

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

Verwenden des Players mit Swing

Der Player kann auch problemlos in einer Swing-Anwendung verwendet werden. Mit dem folgenden Code wird ein auf Swing basierendes TV-Aufnahmeprogramm erstellt, wobei die Videoausgabe im gesamten Fenster angezeigt wird:

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

Java greift normalerweise nicht gerne auf Hardware zu, also benötigen Sie ein Treiberprogramm, wie Goldenmean sagt. Ich habe dies auf meinem Laptop gemacht, indem ich ein Befehlszeilenprogramm gefunden habe, das ein Bild macht. Dann ist es dasselbe wie Goldenmean erklärt; Sie führen das Befehlszeilenprogramm von Ihrem Java-Programm aus in der Routine takepicture () aus, und der Rest Ihres Codes wird genauso ausgeführt.

Mit Ausnahme des Teils, in dem Pixelwerte in ein Array eingelesen werden, ist es möglicherweise besser, die Datei in BMP zu speichern, das fast schon dieses Format hat, und dann die Standard-Java-Image-Bibliotheken zu verwenden. 

Die Verwendung eines Befehlszeilenprogramms fügt Ihrem Programm eine Abhängigkeit hinzu und macht es weniger tragbar, aber war die Webcam auch richtig?

1
Karl

Ich glaube, dass die Web-Cam-Anwendungssoftware, die mit der Web-Cam geliefert wird, oder die native Windows-Webcam-Software nach dem Einschalten der Web-Cam in einem Batch-Skript (Windows/DOS-Skript) ausgeführt werden kann (dh, wenn eine externe Stromversorgung erforderlich ist liefern). Im bacth-Skript können Sie eine geeignete Verzögerung hinzufügen, um nach einem bestimmten Zeitraum zu erfassen. Führen Sie den Capture-Befehl weiterhin in einer Schleife aus.

Ich denke, das sollte möglich sein

-ANZEIGE

0
goldenmean

FMJ kann dies tun, ebenso wie die unterstützende Bibliothek LTI-CIVIL. Beide sind auf Sourceforge.

0
Ken Larson

Verwenden Sie FMJ für Multimedia-Verwandte.

0
Rose

Versuchen Sie es mit JMyron So verwenden Sie die Webcam mit Java . Ich denke, JMyron ist der einfachste Weg, auf eine Webcam mit Java zuzugreifen. Ich habe versucht, es mit einem 64-Bit-Prozessor zu verwenden, aber es gab einen Fehler. Auf einem 32-Bit-Prozessor hat es jedoch gut funktioniert.

0

In processing gibt es dafür eine ziemlich nette Schnittstelle, eine Art Pidgin -Java für Grafiken. Es wird für einige Bilderkennungsarbeiten wie diesen Link verwendet.

Je nachdem, was Sie davon benötigen, können Sie die dort verwendete Videobibliothek in Java laden, oder wenn Sie nur mit ihr herumspielen, können Sie die Verarbeitung selbst durchführen.

0
Dan Monego