86

Web カメラから継続的に画像をキャプチャするにはどうすればよいですか?

オブジェクト認識を試してみたい (おそらく Java メディア フレームワークを使用して)。

2つのスレッドを作成することを考えていました

1 つのスレッド:

  • ノード 1: ライブ画像をキャプチャ
  • ノード 2: 画像を「1.jpg」として保存
  • ノード 3: 5 秒待ちます
  • ノード 4: 繰り返します...

他のスレッド:

  • ノード 1: 画像がキャプチャされるまで待ちます
  • ノード 2: "1.jpg" を使用して、すべてのピクセルから色を取得します
  • ノード 3: データを配列に保存する
  • ノード 4: 繰り返します...
4

16 に答える 16

50

このJavaCV実装は正常に機能します。

コード:

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の構成に関する投稿もあります

コードを変更して、定期的に画像を保存し、残りの処理を行うことができます。

于 2012-01-28T15:21:15.990 に答える
33

しばらく前に、PC Web カメラで写真を撮るために使用できる汎用 Java ライブラリを作成しました。API は非常にシンプルで、機能が過剰ではなく、スタンドアロンで動作できますが、OpenIMAJ、JMF、FMJ、LTI-CIVIL などの追加の Web カメラ ドライバーや一部の IP カメラもサポートしています。

プロジェクトへのリンクはhttps://github.com/sarxos/webcam-captureです

コード例 (写真を撮って test.jpg に保存):

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

また、Maven Central Repository で、または必要なすべての依存関係とサード パーティの JAR を含む別の ZIP としても利用できます。

于 2012-11-12T16:51:25.267 に答える
7

JMyron の使い方は非常に簡単です。 http://webcamxtra.sourceforge.net/

myron = new JMyron();
myron.start(imgw, imgh);
myron.update();
int[] img = myron.image();
于 2010-12-08T01:32:16.657 に答える
5

これは、いくつかの(まだ受け入れられていない)回答を含む同様の質問です。それらの1つは、JMFのJava代替としてFMJに言及しています。

于 2008-11-15T11:19:45.380 に答える
5

この種の JavaCV を使用した gt_ebuddy の回答から外れていますが、私のビデオ出力は彼の回答よりもはるかに高品質です。他にもランダムな改善をいくつか追加しました (ESCCTRL+Cが押されたときにプログラムを終了する、プログラムが使用するリソースを適切に終了するようにするなど)。

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;
    }
}
于 2013-04-12T22:46:43.623 に答える
4

Java Webcam SDKライブラリも試すことができます。SDK デモ アプレットはリンクから入手できます。

于 2012-02-06T12:23:52.993 に答える
3

MarvinFrameworkを試すことができます。カメラを操作するためのインターフェースを提供します。さらに、オブジェクトの追跡やフィルタリングなど、一連のリアルタイムビデオ処理機能も提供します。

見てください!

リアルタイムビデオ処理デモ:
http ://www.youtube.com/watch?v = D5mBt0kRYvk

以下のソースを使用できます。MarvinImageIO.saveImage()を使用して5秒ごとにフレームを保存するだけです。

ウェブカメラビデオデモ:

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

1枚の写真を撮りたいだけの人のために:

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();
        }
    }
}
于 2011-11-18T15:48:25.717 に答える
3

私はビデオ会議アプリケーションで JMF を使用しましたが、2 台のラップトップでうまく機能しました。事前に JMF をインストールして構成する必要がありますが、完了したら、Java コードを介してかなり簡単にハードウェアにアクセスできます。

于 2008-11-10T18:14:55.130 に答える
2

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

Swing でプレーヤーを使用する

Player は、Swing アプリケーションでも簡単に使用できます。次のコードは、ビデオ出力がウィンドウ全体に表示される Swing ベースの TV キャプチャ プログラムを作成します。

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();
    }
}
于 2009-06-09T18:19:25.730 に答える
1

Java は通常、ハードウェアへのアクセスを好まないため、goldenmean が言ったように、何らかのドライバー プログラムが必要になります。写真を撮るコマンドラインプログラムを見つけて、ラップトップでこれを行いました。それなら、goldenmean が説明したのと同じです。takepicture() ルーチンで Java プログラムからコマンド ライン プログラムを実行すると、コードの残りの部分は同じように実行されます。

配列へのピクセル値の読み取りに関する部分を除いて、ファイルを BMP に保存する方が適切な場合があります。これは既にほぼその形式であり、標準の Java イメージ ライブラリを使用します。

コマンド ライン プログラムを使用すると、プログラムに依存関係が追加され、移植性が低下しますが、ウェブカメラもそうでしたよね?

于 2008-11-10T17:52:03.413 に答える
0

Webカメラに付属しているWebカメラアプリケーションソフトウェア、またはネイティブのWindows Webカメラソフトウェアは、Webカメラをオンにした後(つまり、外部電源が必要な場合)にバッチスクリプト(windows / dosスクリプト)で実行できると思います供給)。bacthスクリプトでは、uは、特定の期間の後にキャプチャするために適切な遅延を追加できます。そして、キャプチャコマンドをループで実行し続けます。

これは可能だと思います

-広告

于 2008-11-10T00:41:18.093 に答える
0

マルチメディア相対JavaアプリにはFMJを使用することをお勧めします。

于 2009-10-05T13:52:08.660 に答える
0

JMyron How To Use Webcam Using Java を使用してみてください。Java を使用して Web カメラにアクセスするには、JMyron を使用するのが最も簡単な方法だと思います。64ビットプロセッサで使用しようとしましたが、エラーになりました。ただし、32 ビット プロセッサでは問題なく動作しました。

于 2012-05-09T03:20:46.597 に答える
0

これにはかなり優れたインターフェースがprocessingにあります。これは、グラフィック用に設計されたpidgin Java のようなものです。そのリンクなど、一部の画像認識作業で使用されます。

必要なものによっては、そこで使用されているビデオ ライブラリを Java でロードできる場合もあれば、いじっているだけなら処理自体を使用して取得できる場合もあります。

于 2008-11-10T18:39:40.820 に答える
0

FMJ はこれを行うことができ、FMJ が使用するサポート ライブラリである LTI-CIVIL も同様です。どちらもソースフォージにあります。

于 2008-12-27T14:51:35.197 に答える