当前位置: 移动技术网 > IT编程>开发语言>Java > 详解使用JavaCV/OpenCV抓取并存储摄像头图像

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网