Java'da web kamerasından görüntü mü yakalamak?


85

Bir web kamerasından sürekli olarak nasıl görüntü çekebilirim?

Nesne tanımayı denemek istiyorum (belki java medya çerçevesini kullanarak).

İki iş parçacığı oluşturmayı düşünüyordum

bir konu:

  • Düğüm 1: canlı görüntüyü yakala
  • Düğüm 2: resmi "1.jpg" olarak kaydedin
  • 3. Düğüm: 5 saniye bekleyin
  • Düğüm 4: tekrarla ...

diğer konu:

  • Düğüm 1: görüntü yakalanana kadar bekleyin
  • Düğüm 2: "1.jpg" yi kullanarak her pikselden renkleri elde edin
  • Düğüm 3: Verileri dizilere kaydedin
  • Düğüm 4: tekrarla ...

2
İşte cevabınız - Web kamerası öğreticisinden görüntüler yakalamak için Java Swing programı Biraz değiştirin ve işiniz bitti ..
Aman

Yanıtlar:


49

Bu JavaCV uygulaması iyi çalışıyor.

Kod:

import org.bytedeco.javacv.*;
import org.bytedeco.opencv.opencv_core.IplImage;

import java.io.File;

import static org.bytedeco.opencv.global.opencv_core.cvFlip;
import static org.bytedeco.opencv.helper.opencv_imgcodecs.cvSaveImage;

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() {

        new File("images").mkdir();

        FrameGrabber grabber = new OpenCVFrameGrabber(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("images" + File.separator + (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();
    }
}

JavaCV için yapılandırma hakkında da gönderi var

Kodları değiştirebilir ve görüntüleri düzenli aralıklarla kaydedebilir ve istediğiniz işlemin geri kalanını yapabilirsiniz.


4
+1 Sen harikasın! Hem Windows hem de Linux'ta web kamerası görüntüleri için iyi bir açık kaynak ve desteklenen JMF alternatifi arıyordum. Bu bir cazibe gibi çalışıyor! Teşekkür ederim :)
maple_shaft

2
Benim için çalışmıyor, "main" iş parçacığında özel durum diyor java.lang.UnsatisfiedLinkError: C: \ Users \ steve \ AppData \ Local \ Temp \ javacpp213892357885346 \ jniopencv_core.dll: Bağımlı kitaplıklar bulunamıyor
Stepan Yakovenko

Bu işe yarayacak, ancak video kalitesi olması gerektiği kadar iyi değil. Daha iyi video çıktı kalitesi için cevabıma bakın.
syb0rg

Önerin için teşekkürler. Bunu Windows'ta nasıl ayarlayacağımla ilgileniyorum? 3Gb çıkartılmış zip'e ihtiyacım var mı? Aksi takdirde, programım, Linux'ta JavaCV kullanmak iyi çalışıyor.
Ilian Zapryanov

@StepanYakovenko OpenCV kurulu olmalıdır.
Matthieu

33

Bir süre önce, bir PC web kamerasıyla fotoğraf çekmek için kullanılabilecek genel Java kitaplığı oluşturdum. API çok basittir, fazla öne çıkmaz, bağımsız çalışabilir, ancak aynı zamanda OpenIMAJ, JMF, FMJ, LTI-CIVIL vb. Gibi ek web kamerası sürücülerini ve bazı IP kameraları da destekler.

Projeye bağlantı https://github.com/sarxos/webcam-capture

Örnek kod (resim çekin ve test.jpg dosyasına kaydedin):

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

Ayrıca Maven Merkezi Deposunda veya gerekli tüm bağımlılıkları ve 3. taraf JAR'ları içeren ayrı bir ZIP olarak da mevcuttur.


1
Başlama kolaylığı için bu bir göz atmaya değer. Kod benim için harika çalıştı, umarım siz de :)
mrswadge

@Bartosz Firyn: merhaba API'niz ile çalışıyorum. harika iş adamım! ama şimdi kamerayı yakınlaştırmanın desteklenip desteklenmediğini bilmek istiyorum. Bu API'yi kullanarak kamera nasıl yakınlaştırılır?
Java Man

@JavaMan, yakınlaştırma için yerel destek yok.
Bartosz Firyn

2
@JavaMan, özel Painter örneğinizi ayarlayarak kameradan görüntü gösteren panelde (WebcamPanel) veya WebcamImageTransformer özelliğini kullanarak doğrudan kameradan gelen görüntü üzerinde çizim yapabilirsiniz. Daha fazla ayrıntı için lütfen Github'daki Webcam Capture proje sayfasındaki bileti açın, çünkü bunu burada Stack Overflow'da ayrıntılı olarak açıklamak istemiyorum (yazmak için çok fazla ve yorumlarda kullanmak için çok az karakter). Proje burada bulunabilir github.com/sarxos/webcam-capture
Bartosz Firyn

1
@Elyas Hadizadeh, herhangi bir sorun olması durumunda, dokümantasyonu ve örnekleri bulabileceğiniz github.com/sarxos/webcam-capture adresinde her zaman yeni sayı bileti oluşturabilirsiniz . Lütfen bunun Java'ya aşina kişiler için bir çerçeve olduğunu da unutmayın. Java yeniyseniz, yardım etmeye istekli insanlar da vardır, ancak temel bilgileri kendi başınıza öğrenmelisiniz.
Bartosz Firyn


5

İşte bazı - ancak kabul edilmemiş - cevapları olan benzer bir soru. Bunlardan biri söz FMJ JMF için bir java alternatif olarak.


5

Bu tür gt_ebuddy'nin JavaCV kullanan cevabından sapıyor, ama benim video çıktım onun cevabından çok daha yüksek kalitede. Ben de (örneğin zaman programın kapatılması gibi diğer bazı rasgele iyileştirmeler ekledik ESCve CTRL+Cbasıldığında ve kaynakları düzgün programın kullandığı kapatma emin olarak).

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


3

JMF'yi bir video konferans uygulamasında kullandım ve iki dizüstü bilgisayarda iyi çalıştı: biri entegre web kamerası ve diğeri eski bir USB web kamerası ile. JMF'nin önceden kurulmasını ve yapılandırılmasını gerektirir, ancak işiniz bittiğinde donanıma Java kodu aracılığıyla oldukça kolay bir şekilde erişebilirsiniz.


3

Marvin Framework'ü deneyebilirsiniz . Kameralarla çalışmak için bir arayüz sağlar. Dahası, nesne izleme ve filtreleme gibi bir dizi gerçek zamanlı video işleme özelliği de sağlar.

Bir göz at!

Gerçek Zamanlı Video İşleme Demosu:
http://www.youtube.com/watch?v=D5mBt0kRYvk

Aşağıdaki kaynağı kullanabilirsiniz. MarvinImageIO.saveImage () kullanarak her 5 saniyede bir çerçeve kaydedin .

Web kamerası video demosu:

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

Tek bir fotoğraf çekmek isteyenler için:

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

2

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

Oynatıcıyı Salıncakla Kullanma

Player, bir Swing uygulamasında da kolayca kullanılabilir. Aşağıdaki kod, tüm pencerede görüntülenen video çıkışı ile Swing tabanlı bir TV yakalama programı oluşturur:

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

Webcam Capture API kullandım ... bu http://webcam-capture.sarxos.pl/ adresinden indirebilirsiniz.

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

                }
            }
        }


1
Teşekkürler. hafif ve bunun yerine javacv bu benim için çalışıyor.
Lucke

1

Java genellikle donanıma erişmekten hoşlanmaz, bu nedenle goldenmean'ın dediği gibi bir tür sürücü programına ihtiyacınız olacak. Bunu dizüstü bilgisayarımda bir resim çeken bir komut satırı programı bularak yaptım. O zaman goldenmean'ın açıkladığı ile aynı; java programınızdan komut satırı programını takepicture () rutininde çalıştırırsınız ve kodunuzun geri kalanı aynı şekilde çalışır.

Piksel değerlerinin bir diziye okunmasıyla ilgili kısım dışında, dosyayı zaten neredeyse bu format olan BMP'ye kaydettikten sonra üzerindeki standart java görüntü kitaplıklarını kullanarak daha iyi hizmet alabilirsiniz.

Bir komut satırı programı kullanmak programınıza bir bağımlılık ekler ve onu daha az taşınabilir hale getirir, ancak web kamerası da öyle değil mi?


1

Multimedya ile ilgili java uygulaması için FMJ kullanmayı tavsiye edin.


0

Web kamerası ile birlikte gelen web kamerası uygulama yazılımının veya sizin yerel Windows web kamerası yazılımının, web kamerası açıldıktan sonra (yani harici bir güce ihtiyaç duyuyorsa) bir toplu komut dosyası (windows / dos komut dosyası) içinde çalıştırılabileceğine inanıyorum. arz). Temel komut dosyasında, belirli bir süre sonra yakalamak için uygun gecikme ekleyebilirsiniz. Ve yakalama komutunu döngü içinde yürütmeye devam edin.

Sanırım bu mümkün olmalı

-AD


0

İşlemede bunun için oldukça güzel bir arayüz var, bu da grafikler için tasarlanmış bir tür pidgin java. Bu bağlantı gibi bazı görüntü tanıma çalışmalarında kullanılır.

Neye ihtiyacınız olduğuna bağlı olarak, orada java'da kullanılan video kitaplığını yükleyebilirsiniz ya da sadece onunla oynuyorsanız, işlemenin kendisini kullanarak elde edebilirsiniz.


0

FMJ, kullandığı destek kitaplığı LTI-CIVIL gibi bunu yapabilir. İkisi de sourceforge'da.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.