详解使用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 (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();
  } 

}

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

(0)

相关推荐

  • Linux下利用Opencv打开笔记本摄像头问题

    新建test文件夹,文件夹存在test.cpp和CMakeLists.txttest.cpp#include <iostream> #include <string> #include <sstream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/videoio.hpp> using namespace cv; using

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

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

  • 详解python3百度指数抓取实例

    百度指数抓取,再用图像识别得到指数 前言: 土福曾说,百度指数很难抓,在淘宝上面是20块1个关键字: 哥那么叼的人怎么会被他吓到,于是乎花了零零碎碎加起来大约2天半搞定,在此鄙视一下土福 安装的库很多: 谷歌图像识别tesseract-ocr pip3 install pillow pip3 install pyocr selenium2.45 Chrome47.0.2526.106 m or Firebox32.0.1 chromedriver.exe 图像识别验证码请参考:http://ww

  • 详解IOS如何防止抓包

    目录 抓包原理 防止抓包 一.发起请求之前判断是否存在代理,存在代理就直接返回,请求失败. 二.我们可以在请求配置中清空代理,让请求不走代理 SSL Pinning(AFN+SSL Pinning)推荐 扩展 抓包原理 其实原理很是简单:一般抓包都是通过代理服务来冒充你的服务器,客户端真正交互的是这个假冒的代理服务,这个假冒的服务再和我们真正的服务交互,这个代理就是一个中间者 ,我们所有的数据都会通过这个中间者,所以我们的数据就会被抓取.HTTPS 也同样会被这个中间者伪造的证书来获取我们加密的

  • 详解ubuntu安装opencv的正确方法

    本文介绍的是如何安装ubuntu下C++接口的opencv 1.安装准备: 1.1安装cmake sudo apt-get install cmake 1.2依赖环境 sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev sudo apt-get install libgtk2.0-dev sudo apt-

  • 详解python定时简单爬取网页新闻存入数据库并发送邮件

    本人小白一枚,简单记录下学校作业项目,代码十分简单,主要是对各个库的理解,希望能给别的初学者一点启发. 一.项目要求 1.程序可以从北京工业大学首页上爬取新闻内容:http://www.bjut.edu.cn 2.程序可以将爬取下来的数据写入本地MySQL数据库中. 3.程序可以将爬取下来的数据发送到邮箱. 4.程序可以定时执行. 二.项目分析 1.爬虫部分利用requests库爬取html文本,再利用bs4中的BeaultifulSoup库来解析html文本,提取需要的内容. 2.使用pymy

  • 详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用

    人脸识别技术已经相当成熟,面对满大街的人脸识别应用,像单位门禁.刷脸打卡.App解锁.刷脸支付.口罩检测........ 作为一个图像处理的爱好者,怎能放过人脸识别这一环呢!调研开搞,发现了超实用的Facecognition!现在和大家分享下~~ Facecognition人脸识别原理大体可分为: 1.通过hog算子定位人脸,也可以用cnn模型,但本文没试过: 2.Dlib有专门的函数和模型,实现人脸68个特征点的定位.通过图像的几何变换(仿射.旋转.缩放),使各个特征点对齐(将眼睛.嘴等部位移

  • 详解用python实现爬取CSDN热门评论URL并存入redis

    一.配置webdriver 下载谷歌浏览器驱动,并配置好 import time import random from PIL import Image from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import exp

  • 详解使用CUDA+OpenCV加速yolo v4性能

    YOLO是You-Only-Look-Once的缩写,它无疑是根据COCO数据集训练的最好的对象检测器之一.YOLOv4是最新的迭代版本,它在准确性和性能之间进行了权衡,使其成为最先进的对象检测器之一.在智能视频分析管道中使用任何对象检测器的典型机制包括使用像Tensorflow或PyTorch这样能够在NVIDIA GPU上操作的库来加速模型推理. OpenCV用于图像/视频流输入,预处理和后处理的视觉效果.如果我告诉你OpenCV现在能够利用NVIDIA CUDA的优点,使用DNN模块本地运

  • 详解原码、反码与补码存储与大小

    详解原码.反码与补码存储与大小 原码: 如果机器字长为N个bit,那么一个数的原码就是N位二进制数,最高位 是符号位,1代表负数,0代表正数. 反码: 正数的反码就是原码,负数的反码就是符号位不变,其他取反. 补码: 正数的补码与其原码相同:负数的补码是在其反码的末位加1. (计算机中的数都是以补码形式存储的) 补码的形式是为了进行正负数二进制的加减操作 char为1个字节,8个bit位,看看内存中是怎么存储的 十六进制 二进制(补码) 反码 原码 实际值 char a = 127; //7f

  • C语言详解float类型在内存中的存储方式

    目录 1.例子 2.浮点数存储规则 1.例子 int main() { int n = 9; float *pFloat = (float *)&n; printf("n的值为:%d\n",n); printf("*pFloat的值为:%f\n",*pFloat); *pFloat = 9.0; printf("num的值为:%d\n",n); printf("*pFloat的值为:%f\n",*pFloat); re

随机推荐