2008-11-09 210 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")); 

       } 
      } 
     }