자바의 웹캠에서 이미지 캡처?


85

웹캠에서 이미지를 계속 캡처하려면 어떻게해야합니까?

객체 인식을 실험하고 싶습니다 (아마도 자바 미디어 프레임 워크를 사용하여).

두 개의 스레드를 만들 생각 중이었습니다.

한 스레드 :

  • 노드 1 : 라이브 이미지 캡처
  • 노드 2 : 이미지를 "1.jpg"로 저장
  • 노드 3 : 5 초 대기
  • 노드 4 : 반복 ...

다른 스레드 :

  • 노드 1 : 이미지가 캡처 될 때까지 대기
  • 노드 2 : "1.jpg"를 사용하여 모든 픽셀에서 색상 가져 오기
  • 노드 3 : 배열에 데이터 저장
  • 노드 4 : 반복 ...

2
여기 answer--입니다 캡처 이미지에 자바 스윙 프로그램은 웹캠 튜토리얼에서 약간 그것을 수정하고 개봉 할 ..
아만

답변:


49

이 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에 대한 구성에 대한 게시물 도 있습니다.

코드를 수정하고 정기적으로 이미지를 저장하고 원하는 나머지 처리를 수행 할 수 있습니다.


4
+1 당신은 락! 저는 Windows와 Linux 모두에서 웹캠 캡처를 위해 JMF에 대한 훌륭한 오픈 소스 및 지원되는 대안을 찾고있었습니다. 이것은 매력처럼 작동합니다! 감사합니다 :)
maple_shaft

2
나를 위해 작동하지 않습니다, 스레드 "main"java.lang.UnsatisfiedLinkError : C : \ Users \ steve \ AppData \ Local \ Temp \ javacpp213892357885346 \ jniopencv_core.dll : 종속 라이브러리를 찾을 수 없음
Stepan Yakovenko

이것은 작동하지만 비디오 품질이 예상만큼 좋지 않습니다. 더 나은 비디오 출력 품질에 대한 내 대답을 참조하십시오.
syb0rg 2013

제안 해 주셔서 감사합니다. Windows에서 설정하는 방법에 관심이 있습니까? 3Gb 압축을 푼 zip이 필요합니까? 그렇지 않으면 Linux에서 JavaCV를 사용하는 내 프로그램이 제대로 작동합니다.
Ilian Zapryanov

@StepanYakovenko는 OpenCV가 설치되어 있어야합니다.
Matthieu

33

얼마 전에 PC 웹캠으로 사진을 찍는 데 사용할 수있는 일반 Java 라이브러리를 만들었습니다. API는 매우 간단하고 기능이 과하지 않으며 독립형으로 작동 할 수 있지만 OpenIMAJ, JMF, FMJ, LTI-CIVIL 등과 같은 추가 웹캠 드라이버 및 일부 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으로도 제공됩니다.


1
시작하기 쉽도록 이것은 볼만한 가치가 있습니다. 코드 : 희망 당신도 나를 위해 큰 일
mrswadge

@Bartosz Firyn : 안녕하세요 저는 귀하의 API로 작업하고 있습니다. 굉장한 일하는 사람!하지만 이제 카메라 확대가 지원되는지 여부를 알고 싶습니다. 이 API를 사용하여 카메라를 확대하는 방법?
Java Man

@JavaMan, 확대 / 축소에 대한 기본 지원이 없습니다.
Bartosz Firyn

2
@JavaMan, 사용자 지정 Painter 인스턴스를 설정하여 카메라 (WebcamPanel)에서보기를 표시하는 패널에 그리거나 WebcamImageTransformer 기능을 사용하여 카메라에서 가져온 이미지에 직접 그릴 수 있습니다. 자세한 내용은 Github의 웹캠 캡처 프로젝트 페이지에서 티켓을여십시오. 여기에있는 Stack Overflow에 대한 자세한 내용은 설명하고 싶지 않기 때문입니다 (작성할 내용이 너무 많고 주석에 사용할 문자가 너무 적음). 이 프로젝트는 여기에서 찾을 수 있습니다 github.com/sarxos/webcam-capture
바르 토스 Firyn에게

1
@Elyas Hadizadeh, 문제가 발생하면 github.com/sarxos/webcam-capture 에서 항상 새 발행 티켓을 만들 수 있으며 여기 에서 문서와 예제도 찾을 수 있습니다. 이것은 Java에 익숙한 사람들을위한 프레임 워크라는 점도 명심하십시오. 당신이 자바 초보자라면 기꺼이 도와 줄 사람들도 있지만, 당신은 스스로 기본을 배워야합니다.
Bartosz Firyn 2015


5

여기 에 일부-아직 받아 들여지지 않은-답변과 유사한 질문이 있습니다. 그중 하나는 FMJ 를 JMF의 자바 대안으로 언급합니다 .


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


3

저는 화상 회의 응용 프로그램에서 JMF를 사용했으며 두 개의 랩톱에서 잘 작동했습니다. 하나는 통합 웹캠이 있고 다른 하나는 오래된 USB 웹캠이 있습니다. 사전에 JMF를 설치하고 구성해야하지만 일단 완료되면 Java 코드를 통해 하드웨어에 매우 쉽게 액세스 할 수 있습니다.


3

Marvin Framework를 사용해 볼 수 있습니다. . 카메라와 함께 작동하는 인터페이스를 제공합니다. 또한 객체 추적 및 필터링과 같은 실시간 비디오 처리 기능 세트도 제공합니다.

구경하다!

실시간 비디오 처리 데모 :
http://www.youtube.com/watch?v=D5mBt0kRYvk

아래 소스를 사용할 수 있습니다. 5 초마다 MarvinImageIO.saveImage ()를 사용하여 프레임을 저장하십시오 .

웹캠 비디오 데모 :

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

사진 한 장만 찍으려는 분들을 위해 :

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

스윙과 함께 플레이어 사용

플레이어는 스윙 애플리케이션에서도 쉽게 사용할 수 있습니다. 다음 코드는 전체 창에 비디오 출력이 표시되는 스윙 기반 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();
    }
}

2

웹캠 캡처 API를 사용했습니다 ... u 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"));

                }
            }
        }

코드와 함께 설명을 제공해야합니다
fen1x

1
감사. 그것은 가볍고 대신 javacv 이것은 나를 위해 작동합니다.
Lucke

1

Java는 일반적으로 하드웨어 액세스를 좋아하지 않으므로 goldenmean이 말했듯이 일종의 드라이버 프로그램이 필요합니다. 사진을 찍는 명령 줄 프로그램을 찾아 랩톱에서이 작업을 수행했습니다. 그러면 goldenmean이 설명한 것과 동일합니다. takepicture () 루틴의 Java 프로그램에서 명령 행 프로그램을 실행하면 나머지 코드도 동일하게 실행됩니다.

픽셀 값을 배열로 읽는 부분을 제외하고는 파일을 이미 거의 비슷한 형식 인 BMP에 저장 한 다음 표준 자바 이미지 라이브러리를 사용하는 것이 더 나을 수 있습니다.

명령 줄 프로그램을 사용하면 프로그램에 종속성이 추가되고 이식성이 떨어집니다.하지만 웹캠도 그렇습니다.


1

멀티미디어 관련 Java 앱에 FMJ를 사용하는 것이 좋습니다.


0

웹 캠과 함께 제공되는 웹 캠 응용 프로그램 소프트웨어 또는 기본 Windows 웹캠 소프트웨어가 웹 캠을 켠 후 (즉, 외부 전원이 필요한 경우) 배치 스크립트 (windows / dos 스크립트)에서 실행할 수 있다고 생각합니다. 공급). bacth 스크립트에서 u는 특정 시간 후에 캡처하기 위해 적절한 지연을 추가 할 수 있습니다. 그리고 루프에서 캡처 명령을 계속 실행하십시오.

이게 가능할 것 같아

-기원 후


0

그래픽을 위해 설계된 일종의 pidgin 자바 인 processing 에는 이것에 대한 꽤 좋은 인터페이스 가 있습니다. 해당 링크와 같은 일부 이미지 인식 작업에 사용됩니다.

필요한 것에 따라 자바에서 사용되는 비디오 라이브러리를로드 할 수 있거나, 그냥 가지고 노는 경우 처리 자체를 사용하여 얻을 수 있습니다.


0

FMJ는 LTI-CIVIL을 사용하는 지원 라이브러리와 마찬가지로이를 수행 할 수 있습니다. 둘 다 sourceforge에 있습니다.


0

JMyron How To Use Webcam Using Java를 사용해보십시오 . JMyron을 사용하는 것이 Java를 사용하여 웹캠에 액세스하는 가장 쉬운 방법이라고 생각합니다. 64 비트 프로세서로 사용하려고했지만 오류가 발생했습니다. 하지만 32 비트 프로세서에서는 잘 작동했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.