使用Webcam实现摄像头的开启和关闭,并保存和复制图片

news2025/3/15 10:51:48

实现思路

  • 0,将webcam的jar文件传入项目中
    在这里插入图片描述

  • 1,显示摄像头的地方:创建一个画板,在画板上添加开启和关闭按钮

  • 2,设置开启和关闭功能:创建一个类实现动作监听器,进而实现监听动作按钮

  • 3,实现开启和关闭操作:创建一个类继承或实现线程,使得可以同步实现多线程

  • 4,保存拍照的图片:执行一次Webcam的打开、通过IO流传入文件夹中

显示摄像头的地方-画板类继承JFrame

  • 创建显示方法:设置标题、大小、居中、默认退出、可见(放在最后)
  • 添加按钮:创建按钮数组、遍历按钮数组(创建按钮对象把遍历后的按钮传入、设置按钮大小、添加动作监听器、把按钮添加到窗体)
  • 在主方法中创建对象调用显示方法

设置开启和关闭功能-实现动作监听器

  • 重写监听器的方法actionPerformed:获取动作监听器传过来的指令、对指令进行判断进行相应的操作
  • 创建画笔:创建画笔对象,通过画笔来画出图像、创建画笔的set对象,用来获得画板类传过来的画笔
  • 在画板类中创建监听器对象:将监听器对象传入按钮中、调用监听器对象中的set方法,将画板类的画笔传入

实现开启和关闭操作-继承Thread,实现多线程同步

  • 添加画笔
  • 添加webcam和画笔g的构造器:使得可以将将构造器中的webcam和画笔g传进来
  • 重写run方法:设置while循环,使webcam调用getImage获取图片信息、用画笔画出来
  • 创建Open和Close方法,对run方法中的while循环进行控制

保存拍照的图片

  • 创建方法actPicture用于进行拍照
  • 创建方法savePicture用于往文件中传照片
  • 在actPicture方法中调用savePicture方法,并传入拍的照片

复制图片-使用处理流:bufferedInputStream1和BufferedOutputStream

  • 1,定义被复制和复制后的路径
  • 2,创建处理流对象,将路径传入
  • 3,读取文件到byte类型的数组中
  • 4,当buff的值为-1时,停止复制
  • 5,判断当处理流不为空时关闭处理流

代码

窗体类

import javax.swing.*;
import java.awt.*;

/*怎么在一个界面添加监听器
1,创建继承了监听器的类对象
2,把这个对象传给按钮
 */
public class Viedio extends JFrame {
    //新建一个监听器对象
    VCLlistener vcLlistener = new VCLlistener();
    //创建显示方法
    public void initUI() {
        setTitle("摄像头");
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setSize(1000, 800);

        setLayout(new FlowLayout());
        //添加按钮
        String[] s = {"开启", "关闭"};
        for (String str : s) {
            JButton jButton = new JButton(str);
            jButton.setPreferredSize(new Dimension(85, 35));
            //将监听器对象传入按钮中
            jButton.addActionListener(vcLlistener);
            add(jButton);
        }
        setVisible(true);
        vcLlistener.setG(getGraphics());
    }
    //在主方法中创建对象调用显示方法
    public static void main(String[] args) {
        new Viedio().initUI();

    }
}

接口类

import com.github.sarxos.webcam.Webcam;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

/*怎么创建监听器
1,创建一个类实现监听器接口
2,重写监听器的方法
3,在方法中编辑我们要实现的功能
 */
public class VCLlistener implements ActionListener {
    Graphics g;
    Webcam webcam;
    //创建画笔的set对象,用来获得画板类传过来的画笔
    public void setG(Graphics g) {
        this.g = g;
    }

    boolean tool = true;
    //重写监听器的方法actionPerformed
    @Override
    public void actionPerformed(ActionEvent e) {
        //获取动作监听器传过来的指令
        String str = e.getActionCommand();

        if (str.equals("开启")) {
            webcam = Webcam.getDefault();
            webcam.open();
            VideoThread videoThread = new VideoThread(webcam, g);
            videoThread.Open();
            videoThread.start();

        } else if (str.equals("关闭")) {
            VideoThread videoThread = new VideoThread(webcam, g);
            videoThread.Close();
            webcam.close();
        }
    }

}

线程类

import com.github.sarxos.webcam.Webcam;

import java.awt.*;
import java.awt.image.BufferedImage;

public class VideoThread extends Thread{
    boolean flag = true;
    Webcam webcam = null;
    Graphics g =null;
    //添加webcam和画笔g的构造器:使得可以将将构造器中的webcam和画笔g传进来
    public VideoThread(Webcam webcam, Graphics g) {
        this.webcam = webcam;
        this.g = g;
    }
    //创建Open和Close方法,对run方法中的while循环进行控制
    public void Open(){
        flag = true;
    }
    public void Close(){
        flag = false;
    }

    //重写run方法:设置while循环,使webcam调用getImage获取图片信息、用画笔画出来
    @Override
    public void run() {
        while (flag){
            BufferedImage image = webcam.getImage();
            g.drawImage(image, 50, 50, null);
        }
    }
}

保存照片

 //拍照并保存
    public void actPicture() {
        Webcam webcam = Webcam.getDefault();
//        if (webcam != null) {
        webcam.open();
        // 等待相机准备好
        try {
            Thread.sleep(1000); // 等待1秒钟以确保相机已准备好
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        BufferedImage image = webcam.getImage();
        g.drawImage(image, 400, 400, null);

        savePicture(image);

        //        }else {
//            System.out.println("未检测到摄像头");
//        }
    }

    //拍照 存到文件夹中
    public void savePicture(BufferedImage bi) {

        try {
            //创建文件对象:保存图片要通过文件来保存,最好不用BufferOutputStream,因为是要将图像保存到文件夹中,而不是字符流
            File output = new File("D:\\photo\\output.png");
            //用图像IO流去调用write方法写出到文件中
            ImageIO.write(bi, "png", output);
            System.out.println("保存成功");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

在这里插入图片描述
复制图片-最后调用copyPictere方法即可

   //复制图片
    //1,定义被复制和复制后的路径
    String path = "D:\\photo\\output.png";
    String path1 = "D:\\photo1\\output.png";
    BufferedOutputStream bufferedOutputStream;
    BufferedInputStream bufferedInputStream1;

    public void copyPictere() {
        try {
            //2,创建处理流对象,将路径传入
            bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(path1));
            bufferedInputStream1 = new BufferedInputStream(new FileInputStream(path));
            //3,读取文件到byte类型的数组中
            byte[] buff = new byte[1024];
            int readLen = 0;
            //4,当buff的值为-1时,停止复制
            while ((readLen = bufferedInputStream1.read(buff)) != -1) {
                bufferedOutputStream.write(buff, 0, readLen);
            }
            System.out.println("复制完毕");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //5,判断当处理流不为空时关闭处理流
                if (bufferedInputStream1 != null) {
                    bufferedInputStream1.close();
                }
                if (bufferedOutputStream != null) {
                    bufferedOutputStream.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1695177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《我的阿勒泰》读后感

暂没时间写,记录在此,防止忘记,后面补上!!! 【经典语录】 01、如果天气好的话,阳光广阔地照耀着世界,暖洋洋又懒洋洋。这样的阳光下,似乎脚下的每一株草都和我一样,也把身子完全舒展开了。 02、…

Jmeter预习第1天

Jmeter参数化(重点) 本质:使用参数的方式来替代脚本中的固定为测试数据 实现方式: 定义变量(最基础) 文件定义的方式(所有测试数据都是固定的情况下[死数据],eg:注册登录&#xff0…

为了“降本增效”,我用AI 5天将SpringBoot迁移到了Nodejs

背景 大环境不好,各行各业都在流行“降本增效”,IT行业大肆执行“开猿节流”,一顿操作效果如何?普通搬砖人谁会在乎呢。 为了收紧我的口袋,决定从头学习NodejsTypeScript,来重写我的Java后端服务。 其实这…

【ECharts】数据可视化

目录 ECharts介绍ECharts 特点Vue2使用EChats步骤安装 ECharts引入 ECharts创建图表容器初始化图表更新图表 示例基本柱状图后台代码vue2代码配置 组件代码运行效果 基本折线图示例代码组件 基础饼图示例代码后台前端配置组件运行效果 其他 ECharts介绍 ECharts 是一个由百度开…

找不到msvcr110.dll无法继续执行代码的原因分析及解决方法

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是找不到msvcr110.dll文件。这个错误通常发生在运行某些程序或游戏时,系统无法找到所需的动态链接库文件。为了解决这个问题,下面我将介绍5种常见的解决方法。 一&#…

重学java 44.多线程 Lock锁的使用

昨日之深渊,今日之浅谈 —— 24.5.25 一、Lock对象的介绍和基本使用 1.概述 Lock是一个接口 2.实现类 ReentrantLock 3.方法 lock()获取锁 unlock()释放锁 4.Lock锁的使用 package S78Lock;import java.util.concurrent.locks.Lock; import java.util.concurrent.lo…

类与对象:接口

一.概念 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。 二.语法规则 与定义类相似,使用interface关键词。 Idea可以在开始时直接创建…

【控制实践——二轮平衡车】【三】基于PID的直立控制

传送门 系列博客前言直立运动分析基于PID控制器的直立控制角度环控制角速度控制总结 电机转速的控制前言电机转速控制 结语 系列博客 【控制实践——二轮平衡车】【一】运动分析及动力学建模 【控制实践——二轮平衡车】【二】实物设计和开源结构&代码 【控制实践——二轮…

常见 JVM 面试题补充

原文地址 : 26 福利:常见 JVM 面试题补充 (lianglianglee.com) CMS 是老年代垃圾回收器? 初步印象是,但实际上不是。根据 CMS 的各个收集过程,它其实是一个涉及年轻代和老年代的综合性垃圾回收器。在很多文章和书籍的划分中&…

Scrapy顺序执行多个爬虫

Scrapy顺序执行多个爬虫 有两种方式: 第一种:bat方式运行 新建bat文件 cd C:\python_web\spiders\tiktokSelenium & C: & scrapy crawl spider1 & scrapy crawl spider2 & scrapy crawl spider3 & scrapy crawl spider4 第二种&a…

kubeadm部署k8s v1.28

一、主机准备 主机硬件配置说明 作用IP地址操作系统配置k8s-master01192.168.136.55openEuler-22.03-LTS-SP12颗CPU 4G内存 50G硬盘k8s-node01192.168.136.56openEuler-22.03-LTS-SP12颗CPU 4G内存 50G硬盘k8s-node02192.168.136.57openEuler-22.03-LTS-SP12颗CPU 4G内存 50G…

windows 11上自带时间管理-番茄工作法

在 Windows 11 中,你可以使用 专注 功能来最大程度地减少干扰,帮助你保持专注。 专注的工作原理 专注时段打开后,将会出现以下情况: 专注计时器将显示在屏幕上 请勿打扰将打开 任务栏中的应用不会闪烁发出提醒 任务栏中应用的…

MySQL 8.4.0 LTS 变更解析:I_S 表、权限、关键字和客户端

↑ 关注“少安事务所”公众号,欢迎⭐收藏,不错过精彩内容~ MySQL 8.4.0 LTS 已经发布 ,作为发版模型变更后的第一个长期支持版本,注定要承担未来生产环境的重任,那么这个版本都有哪些新特性、变更,接下来少…

UIKit之猜图器Demo

需求 实现猜图器Demo 功能分解: 1>下一题切换功能 2>点击图片后能放大并背景变暗(本质是透明度的变化)。再次点击则缩小,删除暗色背景。 3> 答案区按钮点击则文字消失,选择区对应文字恢复。 4> 选择区…

python爬虫登录到海康相机管理页面

简述 1.最近接到个任务是在管理页面更改相机的某个参数,下载官方的sdk貌似没有提供这个接口,所以只能自己写爬虫登录发请求了。 1.主要步骤 1.1 发送get请求获取到salt,sessionID,challenge等信息 http://admin:123456192.168.…

将 MOV 转换为 MP4 的 10 个最佳工具

在当今的数字时代,内容创作和消费正处于巅峰,对多功能和兼容媒体格式的需求从未如此之高。在众多可用的视频格式中,MOV 和 MP4 因其在各种设备和平台中的广泛使用而脱颖而出。然而,将 MOV 文件转换为更通用兼容的 MP4 格式的需求已…

OZON的物流有哪些,OZON物流Unitrade

随着跨境电商的快速发展,OZON作为俄罗斯领先的电商平台,其物流服务的重要性不言而喻。对于卖家而言,选择合适的物流合作伙伴,不仅关乎商品的运输效率,更直接关系到店铺的口碑和消费者的购物体验。本文将带您深入了解OZ…

傲软抠图一款专为抠图打造的AI智能抠图应用,智能识别人物物体抠图软件,无广vip版 v1.8.1

软件介绍 傲软抠图,作为一款高度专业化的智能人工智能图片处理软件,被设计专门用于执行精确的图像提取功能。该程序利用其先进的算法能动地识别和分辨图像中的人物或物体轮廓,并能够从原始图片材料中分离出带有透明背景的目标图像。除了自动…

容器化:ES和Kibana

1 缘起 最近在学习使用ES, 为了找一个功能强大的可视化工具,之前使用了ES-Head,可以满足学习需求。 闲暇时间又折腾了另一个工具Kibana, 分享如下。 Kibana优点: 用户友好性:Kibana提供直观易用的用户界面…

IC卡水表抄表是什么?什么叫IC卡水表抄表?

一、什么叫IC卡水表抄表 IC卡水表抄表是一种现代化水资源管理方法,主要是通过集成智能IC卡科技的水表开展计量检定和传送数据。用户在预付模式中,根据IC卡在线充值后再用,用水量会自动保存在卡上,大大提高了抄表效率精确性。 二…