2014-11-15 2 views
1

в мой код, имеющий кнопку захвата его индивидуально захвата изображения один раз, но теперь я хочу набор таймер для захвата изображения в секундуКак установить таймер для захвата изображений с веб-камеры?

package capturewebcam; 
    import java.awt.Component; 
    import java.awt.Image; 
    import java.awt.image.BufferedImage; 
    import java.io.File; 
    import java.io.IOException; 
    import java.util.logging.Level; 
    import java.util.logging.Logger; 
    import javax.imageio.ImageIO; 
    import javax.media.Buffer; 
    import javax.media.CannotRealizeException; 
    import javax.media.Manager; 
    import javax.media.MediaLocator; 
    import javax.media.NoPlayerException; 
    import javax.media.Player; 
    import javax.media.control.FrameGrabbingControl; 
    import javax.media.format.VideoFormat; 
    import javax.media.util.BufferToImage; 
    import javax.swing.JLabel; 

    public class CaptureImage { 

    Player broadcast = null; 
    Image img = null; 

    public Component componen()throws IOException, NoPlayerException{ 
    Component comp_video; 
    MediaLocator loo = new MediaLocator("vfw://0"); 
    try { 
     broadcast = Manager.createRealizedPlayer(loo); 
     broadcast.start(); 
    } catch (CannotRealizeException ex) { 
     Logger.getLogger(CaptureImage.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    if((comp_video = broadcast.getVisualComponent()) != null) 
     { 
      comp_video.setSize(322,315); 
      return comp_video; 

     } 
    else{ 

    return null; 
    } 

    } 
    public void capture_image(){ 
    FrameGrabbingControl grab = (FrameGrabbingControl) 
    broadcast.getControl("javax.media.control.FrameGrabbingControl"); 
    Buffer buff = grab.grabFrame(); 
    BufferToImage image = new BufferToImage((VideoFormat)buff.getFormat()); 
    img = image.createImage(buff); 

} 
public void set_image_label(JLabel lb){ 
    capture_image(); 
    lb.setIcon(new javax.swing.ImageIcon(img)); 

    } 

    public void save_image(String path){ 
    BufferedImage image = (BufferedImage) img; 
    File outputfile = new File(path); 
    try { 
     ImageIO.write(image, "png", outputfile); 
    } catch (IOException ex) { 
     Logger.getLogger(CaptureImage.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    } 

} 
+0

смотреть на таймер свинг https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html – sethu

ответ

1

Я хотел бы использовать SwingWorker, чтобы сделать это, так как ваш метод capture_image() вероятно, займет достаточно времени, чтобы завершить как возможный шаг на потоке событий Swing, уменьшая отзывчивость вашей программы. Внутри вашего метода SwingWorker doInBackground() вы можете использовать цикл for или while с Thread.sleep(...) внутри него, или вы можете использовать java.util.Timer/TimerTask или ScheduledExecutorService для многократного захвата ваших изображений. Затем вы передадите их обратно в графический интерфейс, используя пару методов публикации/процесса SwingWorker. Для получения дополнительной информации о том, как использовать SwingWorker, ознакомьтесь с SwingWorker Tutorial.

Может быть что-то подобное,

private class MyImageWorker extends SwingWorker<Void, Icon> { 
    private static final long SLEEP_DELAY = 1000; 
    private volatile boolean doneLoadingImgs = false; 

    public boolean isDoneLoadingImgs() { 
    return doneLoadingImgs; 
    } 

    public void setDoneLoadingImgs(boolean doneLoadingImgs) { 
    this.doneLoadingImgs = doneLoadingImgs; 
    } 

    @Override 
    protected Void doInBackground() throws Exception { 
    while (!doneLoadingImgs) { 
     BufferedImage img = captureImage(); 
     ImageIcon icon = new ImageIcon(img); 
     publish(icon); 

     Thread.sleep(SLEEP_DELAY); 
    } 
    return null; 
    } 

    @Override 
    protected void process(List<Icon> iconList) { 
    for (Icon icon : iconList) { 
     lb.setIcon(icon); 
    } 
    } 

    private BufferedImage captureImage() { 
    FrameGrabbingControl grab = (FrameGrabbingControl) broadcast 
      .getControl("javax.media.control.FrameGrabbingControl"); 
    Buffer buff = grab.grabFrame(); 
    BufferToImage image = new BufferToImage((VideoFormat) buff.getFormat()); 
    BufferedImage img = image.createImage(buff); 
    return img; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^