2008-11-09 208 views
76

如何從攝像頭連續捕捉圖像?從java攝像頭捕獲圖像?

我想實驗對象識別(也許使用Java媒體框架)。

我想創建兩個線程

一個線程:

  • 節點1:捕獲實時圖像
  • 節點2:保存圖像爲 「1.JPG」
  • 節點3:等待5秒鐘
  • 節點4:重複...

其他線程:

  • 節點1:等待,直到圖像被捕獲
  • 節點2:從每一個pixle
  • 節點3使用 「1.JPG」 得到的顏色 :在陣列保存數據
  • 節點4:重複...
+2

下載這裏是你的answer-- [的Java Swing程序來捕獲攝像頭教程圖片](HTTP:// WWW .tricksmode.com/2013/03/How-To-Capture-Webcam-Images-In-Java-Swings.html) 稍微修改它,你就完成了。 – Aman 2013-03-25 19:44:30

回答

0

我相信與網絡攝像頭一起附帶的網絡攝像頭應用軟件,或您本地的Windows攝像頭軟件可以在批處理腳本(Windows/DOS腳本)後運行打開網絡攝像頭(即如果需要外部電源)。在bacth腳本中,你可以在一段時間後添加適當的延遲來捕獲。並在循環中繼續執行捕獲命令。

我想這應該是可能

〜AD

1

的Java通常不喜歡訪問硬件,所以你需要某種類型的驅動程序,如goldenmean說。我在我的筆記本電腦上找到了一個可以捕捉圖片的命令行程序。然後就像goldenmean解釋的那樣;您可以在takepicture()例程中從java程序運行命令行程序,其餘代碼運行相同。

除了將像素值讀入數組的部分之外,通過將文件保存爲接近該格式的BMP文件,然後使用其上的標準Java圖像庫,可能會更好。

使用命令行程序會增加對程序的依賴性,使其不易攜帶,但攝像頭也是如此,對不對?

3

我在視頻會議應用程序中使用了JMF,它在兩臺筆記本電腦上運行良好:一臺配有集成網絡攝像頭,另一臺配有舊USB攝像頭。它需要事先安裝和配置JMF,但一旦完成,您可以非常容易地通過Java代碼訪問硬件。

+0

你能給我你的項目的代碼片段嗎? – 2013-05-04 06:14:11

0

processing中有一個相當不錯的界面,這是一種爲圖形設計的java類型pidgin。它被用於某些圖像識別工作中,如該鏈接。

根據你需要什麼,你可能可以加載在java中使用的視頻庫,或者如果你只是在玩它,你可能會通過使用處理本身。

5

Here是一個類似的問題,帶有一些但未被接受的答案。其中一人提到FMJ作爲JMF的Java替代品。

0

FMJ可以做到這一點,它可以使用LTI-CIVIL。兩者都在sourceforge上。

2

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

使用與Swing

的播放器播放器可以在Swing應用程序可以很容易地使用。使用FMJ爲relatived Java應用程序多媒體

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

支持建議:下面的代碼創建一個基於Swing-TV捕獲程序在整個窗口中顯示的視頻輸出。

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

這JavaCV實現正常工作。

代碼:

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

還有post on configuration for JavaCV

您可以修改代碼,並能夠將圖像保存在固定時間間隔,做你想要處理的其餘部分。

+4

+1你搖滾!我一直在尋找一個很好的開源代碼,並支持在Windows和Linux中用於捕獲攝像頭的JMF的替代方案。這就像一個魅力!謝謝:) – 2012-02-21 18:38:11

+2

不適合我,它說異常在線程「main」java.lang.UnsatisfiedLinkError:C:\ Users \ steve \ AppData \ Local \ Temp \ javacpp213892357885346 \ jniopencv_core.dll:無法找到依賴圖書館 – 2012-09-19 20:03:14

+0

這將工作,但視頻質量不如它應該。查看我的答案以獲得更好的視頻輸出質量 – syb0rg 2013-04-12 22:47:48

0

嘗試使用JMyron How To Use Webcam Using Java。我認爲使用JMyron是使用java訪問攝像頭的最簡單方法。我試圖用它與64位處理器,但它給了我一個錯誤。不過,它在32位處理器上工作得很好。

26

前段時間我創建了一個通用的Java庫,可用於使用PC攝像頭拍照。 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的中央倉庫或作爲單獨的ZIP其中包括所有所需的依賴關係和第三方JAR。

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

我用攝像頭捕獲API ...ü可以從這個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")); 

       } 
      } 
     }