本程序通过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