详解使用JavaCV/OpenCV抓取并存储摄像头图像
本程序通过JFrame实时显示本机摄像头图像,并将图像存储到一个缓冲区,当用户用鼠标点击JFrame中任何区域时,显示抓取图像的简单动画,同时保存缓冲区的图像到磁盘文件中。点击JFrame关闭按钮可以退出程序。
实现:
import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.Timer; import com.googlecode.javacv.CanvasFrame; import com.googlecode.javacv.OpenCVFrameGrabber; import com.googlecode.javacv.cpp.opencv_core.IplImage; import static com.googlecode.javacv.cpp.opencv_core.cvReleaseImage; /** * * Use JavaCV/OpenCV to capture camera images * * There are two functions in this demo: * 1) show real-time camera images * 2) capture camera images by mouse-clicking anywhere in the JFrame, * the jpg file is saved in a hard-coded path. * * @author ljs * 2011-08-19 * */ public class CameraCapture { public static String savedImageFile = "c:\\tmp\\my.jpg"; //timer for image capture animation static class TimerAction implements ActionListener { private Graphics2D g; private CanvasFrame canvasFrame; private int width,height; private int delta=10; private int count = 0; private Timer timer; public void setTimer(Timer timer){ this.timer = timer; } public TimerAction(CanvasFrame canvasFrame){ this.g = (Graphics2D)canvasFrame.getCanvas().getGraphics(); this.canvasFrame = canvasFrame; this.width = canvasFrame.getCanvas().getWidth(); this.height = canvasFrame.getCanvas().getHeight(); } public void actionPerformed(ActionEvent e) { int offset = delta*count; if(width-offset>=offset && height-offset >= offset) { g.drawRect(offset, offset, width-2*offset, height-2*offset); canvasFrame.repaint(); count++; }else{ //when animation is done, reset count and stop timer. timer.stop(); count = 0; } } } public static void main(String[] args) throws Exception { //open camera source OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0); grabber.start(); //create a frame for real-time image display CanvasFrame canvasFrame = new CanvasFrame("Camera"); IplImage image = grabber.grab(); int width = image.width(); int height = image.height(); canvasFrame.setCanvasSize(width, height); //onscreen buffer for image capture final BufferedImage bImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D bGraphics = bImage.createGraphics(); //animation timer TimerAction timerAction = new TimerAction(canvasFrame); final Timer timer=new Timer(10, timerAction); timerAction.setTimer(timer); //click the frame to capture an image canvasFrame.getCanvas().addMouseListener(new MouseAdapter(){ public void mouseClicked(MouseEvent e){ timer.start(); //start animation try { ImageIO.write(bImage, "jpg", new File(savedImageFile)); } catch (IOException e1) { e1.printStackTrace(); } } }); //real-time image display while(canvasFrame.isVisible() && (image=grabber.grab()) != null){ if(!timer.isRunning()) { //when animation is on, pause real-time display canvasFrame.showImage(image); //draw the onscreen image simutaneously bGraphics.drawImage(image.getBufferedImage(),null,0,0); } } //release resources cvReleaseImage(image); grabber.stop(); canvasFrame.dispose(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
赞 (0)