首页 > 开发 > Java > 正文

详解使用JavaCV/OpenCV抓取并存储摄像头图像

2024-07-13 10:06:17
字体:
来源:转载
供稿:网友

本程序通过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();   }  } 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。

 

注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表