用Java巧妙利用线程的应用(3)——调用系统摄像头

目录

前言

代码部分

1.设计思路

1.摄像头初始化模块

2.摄像头出现画面

3.画面和窗体流动一致

2.摄像头项目和线程的联系 

总结

前言

       本文将介绍如何使用Java代码获取计算机摄像头的画面,并在窗体中实时显示。这个项目使用的是Sarxos库中的Webcam类来实现这一功能。通过这份代码实例,我们会学习到如何初始化摄像头、设置视图大小、打开摄像头、并实时获取摄像头的画面

       在使用摄像头画面显示的过程中,我们会使用到多线程的概念。通过在一个单独的线程中获取摄像头画面并进行显示,我们可以实现实时的画面更新,同时不会阻塞主线程的执行。通过本文,读者可以学到以下内容:

1.如何使用Sarxos库获取计算机上的默认摄像头和其他可用摄像头。

2.如何设置摄像头的视图大小,以便适应窗体的尺寸。

3.如何打开摄像头,并实时获取摄像头的画面。

4.如何在窗体中使用多线程进行画面的实时显示。

5.如何自定义和扩展这段代码,以满足更复杂的摄像头应用需求

代码部分

1.设计思路

       整个小项目,为了方便梳理和理解,可以分为以下四个模块:1.摄像头初始化模块;2.窗体创建和设置模块;3.摄像头画面获取和显示模块;4.窗体绘制模块。并且设计代码也是按照这四大步来实现的。

1.摄像头初始化模块

这一部分负责初始化摄像头的信息。

import com.github.sarxos.webcam.Webcam;
import java.util.List;

public static void main(String[] args){
        //通过静态方法,获取电脑上的默认摄像头
        Webcam webcam=Webcam.getDefault();
        System.out.println(webcam.getName());
        //通过静态方法,获取电脑上所有的摄像头
        List<Webcam>webcams=Webcam.getWebcams();
        //遍历这个数组
        for(int i=0;i<webcams.size();i++){
            System.out.println(webcams.get(i).getName());
        }
        Webcam ComputerCam=webcams.get (0);
        ComputerCam.setViewSize(new Dimension(640,480));//只有默认的几种尺寸大小,要按照规定来设置
        ComputerCam.open();
        
} 


 有以下几点需要说明

  • List<Webcam>webcams是一个泛型列表,存储的是Webcam对象的集合,List是Java集合框架的一种接口,它允许我们以有序、可重复的方式存储元素。也就是说,webcams列表的存在意义就是存储有电脑上所有的摄像头对象,通过调用Webcam.getWebcams()方法,会返回一个包含所有可用摄像头的列表,Integrated Camera 0即表示调用的是系统默认摄像头。
  • 640×480是一个常见的分辨率,也是一个标准的视频格式。摄像头设备对于可支持的分辨率有限制。并不是可以随意设置的。


2.摄像头出现画面

import com.github.sarxos.webcam.Webcam;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.List;

public class WebCamDemo extends JFrame {
    public WebCamDemo(){
        //通过静态方法,获取电脑上的默认摄像头
        Webcam webcam=Webcam.getDefault();
        System.out.println(webcam.getName());
        //通过静态方法,获取电脑上所有的摄像头
        List<Webcam>webcams=Webcam.getWebcams();
        //遍历这个数组
        for(int i=0;i<webcams.size();i++){
            System.out.println(webcams.get(i).getName());
        }
        Webcam ComputerCam=webcams.get (0);
        ComputerCam.setViewSize(new Dimension(640,480));//只有默认的几种尺寸大小,要按照规定来设置
        ComputerCam.open();

        //设置窗体的属性
        setTitle("WebCam");
        setSize(640,480);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        //获取摄像头的画面
        Graphics g=getGraphics();
        while(true){
            BufferedImage buffimg=ComputerCam.getImage();
            g.drawImage(buffimg,0,0,null);
        }
    }

    public static void main(String[] args) {
        new WebCamDemo();

    }
}


  • 成功调用摄像头之后,我们要选择用窗体来呈现出来摄像头,即获取摄像头、画出画面(请注意,严格来讲,这是两步操作) ,所以我们选择让WebCamDemo来继承窗体,同时设置了窗体的属性。
  • 用Graphics这个抽象类,来绘制图形和文本,用BufferedImage这个类存储摄像头获取的图像数据,通过computer.getImage()方法来获取图像的数据。

3.画面和窗体流动一致

import com.github.sarxos.webcam.Webcam;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.List;

public class WebCamDemo extends JFrame {
    public WebCamDemo(){
        //通过静态方法,获取电脑上的默认摄像头
        Webcam webcam=Webcam.getDefault();
        System.out.println(webcam.getName());
        //通过静态方法,获取电脑上所有的摄像头
        List<Webcam>webcams=Webcam.getWebcams();
        //遍历这个数组
        for(int i=0;i<webcams.size();i++){
            System.out.println(webcams.get(i).getName());
        }
        Webcam ComputerCam=webcams.get (0);
        ComputerCam.setViewSize(new Dimension(640,480));//只有默认的几种尺寸大小,要按照规定来设置
        ComputerCam.open();

        //设置窗体的属性
        setTitle("WebCam");
        setSize(640,480);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

        //获取摄像头的画面
        Graphics g=getGraphics();
        while(true){
            //获取一帧图像
            buffimg=ComputerCam.getImage();
            //调用repaint()方法,触发窗体的重绘,从而更新图像显示
            repaint();
        }
    }
    //声明变量buffimg,用于存储从摄像头获取的图像数据
    BufferedImage buffimg=null;
 
    //重写JFrame类的paint()方法,每次在窗体重绘时被调用,用于绘制图像
    @Override
    public void paint(Graphics g){
        g.drawImage(buffimg,0,0,this.getWidth(),this.getHeight(),null);
    }

    public static void main(String[] args) {
        new WebCamDemo();
    }
}


这一部分增加了以下内容 

  • buffimg变量的声明,BufferedImage类的变量声明一下,在之前的while循环中,通过ComputerCam.getImage()方法获取实际的图像数据,并将其赋值给buffimg变量,不断更新buffimg的值。而在下面用null初始化buffimg是为了每次重绘开始之前,buffimg都具有一个新的值,然后重新绘制到窗体上
  • 在while循环中repaint()方法的调用
  • 重写方法中,buffimg包含了摄像头获取的图像数据;(0,0)代表绘制图像的起始位置坐标,图像位于窗体的左上角;this.getWidth()和this.getHeight()是为了实时获取窗体的宽度和高度;null针对的是ImageObserver对象,表示不需要接受这个对象的更新。

2.摄像头项目和线程的联系 

      在这份代码中,没有直接使用线程。然而,可以说代码中存在隐式的线程使用。  当执行new WebCamDemo()时,会创建一个WebCamDemo对象,并在主线程中调用构造函数。在构造函数中的以下代码段中:

while (true) {
    buffimg = ComputerCam.getImage();
    repaint();
}

       存在一个无限循环,该循环不会主动退出。在每次循环迭代中,使用ComputerCam.getImage()方法获取摄像头图像,并通过调用repain()方法触发窗体的重绘,从而实现实时显示摄像头图像。

       尽管没有显式地创建和管理线程,但是这个无限循环会在主线程中连续执行。由于这个循环没有休眠或延迟的操作,它可能会导致主线程处于忙碌状态,无法处理其他事件。

       因此,可以说这份代码中的循环部分具有阻塞主线程的效果。它会持续地获取摄像头图像并刷新窗体,这在某种程度上实现了一个简单的实时显示。虽然没有使用多线程来实现并行处理,但是主线程在这个循环中不断地执行,实现了基本的图像捕获和显示功能。

总结

       这份代码展示了如何使用Java的Webcam库捕获摄像头图像并在图形界面中实时显示。代码首先获取默认摄像头和所有可用摄像头的信息,并选择第一个摄像头作为要使用的设备。然后,它设置窗体的属性并打开摄像头。

       在主窗体中,通过重写paint()方法,将捕获到的摄像头图像绘制在窗体上。通过不断循环获取摄像头图像并调用repaint()方法触发重绘,实现了实时显示摄像头图像。

       代码中使用了Java的AWT和Swing库来创建窗体和绘制图像。此外,还使用了BufferedImage来存储摄像头图像数据,以及Graphics对象来进行图像绘制操作。

       尽管没有直接使用多线程,但循环部分会持续地在主线程中执行,实现了简单的实时显示。这份代码为捕获摄像头图像并在图形界面中显示提供了一个基本的框架,可以进一步扩展和定制以满足特定需求。

       总之,这份代码演示了使用Java进行摄像头捕获和实时显示的基本操作,为进一步开发图像处理、视频聊天等应用提供了基础。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值