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

时间:2022-03-24 08:46:18

本程序通过JFrame实时显示本机摄像头图像,并将图像存储到一个缓冲区,当用户用鼠标点击JFrame中任何区域时,显示抓取图像的简单动画,同时保存缓冲区的图像到磁盘文件中。点击JFrame关闭按钮可以退出程序。

实现:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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();
  }
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.csdn.net/ljsspace/article/details/6702178