gpt4 book ai didi

java - 如何设置从网络摄像头捕获图像的计时器?

转载 作者:太空宇宙 更新时间:2023-11-04 06:24:45 25 4
gpt4 key购买 nike

在我的代码中,有捕获按钮,它单独捕获图像一次,但现在我想设置计时器以每秒捕获图像

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

}

最佳答案

我会使用SwingWorker这样做是因为您的 capture_image() 方法可能需要足够的时间才能完成,从而可能会踩到 Swing 事件线程,从而降低程序的响应能力。在 SwingWorker 的 doInBackground() 方法中,您可以使用 for 或 while 循环,其中包含 Thread.sleep(...) ,或者您可以使用 java.util.Timer/TimerTask 或 ScheduledExecutorService 来重复抓取图像。然后,您可以使用 SwingWorker 的发布/处理方法对将它们传输回 GUI。有关如何使用 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;
}
}

关于java - 如何设置从网络摄像头捕获图像的计时器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26948013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com