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

网友投稿 437 2023-05-25


详解使用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 (Ihttp://OException 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();

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spring Boot多数据源及其事务管理配置方法
下一篇:Java this()和super()的使用注意
相关文章

 发表评论

暂时没有评论,来抢沙发吧~