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

实现思路

  • 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@Overridepublic 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获取图片信息、用画笔画出来@Overridepublic 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.mzph.cn/web/15311.shtml

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

相关文章

【数据结构与算法篇】二叉树链式结构及实现

【数据结构与算法篇】二叉树链式结构及实现 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 4. 二叉树链式结构的实现 4.1 前置说明 4.2 二叉树的遍历 4.2.1 前序、中序以及…

OceanBase的存储架构与传统LSM-Tree架构的异同|OceanBase数据转储合并技术解读(二)

前篇博文将OceanBase的存储架构巧妙地与自然界中的“水生态”进行了类比,今日我们转变视角,聚焦在与拥有相同LSM-Tree架构的其他产品的比较,深入探讨OceanBase相较于它们所展现出的独特性能。 众所周知,OceanBase数据库的存储引擎…

element-ui 前端ui框架用法开发指南(2024-05-22)

Element,一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 1、npm安装 // npm安装:npm install element-ui --save 能更好地和 webpack 打包工具配合使用 2、cdn在线引入 访问最新版本的资源地址 - element-uiThe CDN for element-u…

RedHat9 | DNS剖析-配置主DNS服务器实例

一、实验环境 1、BIND软件包介绍 BIND软件是一款开放源码的DNS服务器软件,由美国加州大学Berkeley分校开发和维护,全称为Berkeley Internet Name Domain。该软件在DNS(域名系统)领域具有重要地位,是目前世界上使用最…

使用OpenCV dnn c++加载YOLOv8生成的onnx文件进行目标检测

在网上下载了60多幅包含西瓜和冬瓜的图像组成melon数据集,使用 LabelMe 工具进行标注,然后使用 labelme2yolov8 脚本将json文件转换成YOLOv8支持的.txt文件,并自动生成YOLOv8支持的目录结构,包括melon.yaml文件,其内容…

Python怎样定位并删除Sql语句中不确定的查询条件

1.问题场景描述: 在sql语句中经常会有查询条件是:查找多个订单签订日期范围的数据,但具体的日期范围是不确定,我们如何来查找定位 例如:查询条件语句的部分如下图: 目标是: 1)定位字符串:t_contract_order.sign_date 2)最终得到结果: 解决问题思路: 1)定位要找的字符串起始位置…

【学习心得】PyTorch的知识要点复习(持续更新)

PyTorch知识要点复习,目的是为了巩固PyTorch基础、快速回顾、深化理解PyTorch框架。这篇文章会持续更新。 一、本文的一些说明 知识点梳理:我将PyTorch的核心概念和高级技巧进行了系统化的整理,从基础的张量操作到复杂的模型构建与训练。这样…

【Linux】进程终止与进程等待

目录 进程终止 errno exit和_exit 进程等待 wait和waitpid 宏:WIFEXITED 非阻塞等待 进程终止 下面要谈的一个话题就是进程终止,就是说一个进程退出了,可能有三种情况 1.进程代码执行完,结果是正确的 2.进程代码执行完&…

【活动】开源与闭源大模型:探索未来趋势的双轨道路

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 开源与闭源大模型:探索未来趋势的双轨道路引言一、开源大模型&#…

翻译《The Old New Thing》- The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag

The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071128-00/?p24353 Raymond Chen 2007年11月28日 FORMAT_MESSAGE_IGNORE_INSERTS 标志的重要性 简要 文章讨论了使用FormatMes…

评估企业的业务是否存在高风险的六个步骤

风险的幽灵使得组织别无选择,只能改善各种网络风险的总体管理。以下是一个基于信息安全论坛的IRAM2方法论的分步过程,网络安全和风险从业者可以利用它来评估和管理信息风险。 第1步:范围界定练习 范围界定练习的目标是提供一个以业务为中心…

基于springboot+vue的招聘信息管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

K8s的常用命令以及yaml文件的创建

目录 一、声明式管理方法:YAML文件 1、yaml文件简介 2、yaml和json的主要区别: 3、YAML的语法格式 4、yaml文件组成部分 ①控制器定义 5、查看api资源版本标签 6、编写nginx-deployment.yaml资源配置清单 6.1创建资源对象 6.2查看创建的pod资源…

Unity-Sprite Atlas+UGUI系统的运行原理

每日一句:别听世俗耳语,看自己的风景就好 目录 SA的原理: SA的优点: SA的缺点: DrawCall是什么? 批处理是什么? 我们先了解一下UGUI系统的运行原理吧! 提到图集优化&#xff0…

cocosCreator动态生成二维码

cocosCreator 版本:3.7.2 开发语言:typeScript 我们在游戏开发中,经常会生成一个专属于玩家个人的二维码,比如说推广、充值等功能。 接到这个任务,在网上找了下,还是有很多教程的。但是这些教程大部分都是用…

Ollydbg动态分析MessageBoxA输出hellow world

一、目的 找到main函数找到调用的MessageBoxA函数 测试源码 #include <iostream> #include <windows.h>int main() {MessageBoxA(NULL, "Hellow World", "Title", MB_OK);return 1; }二、快捷键 指令快捷键说明RestartCtrlF2重新开始调试S…

buu[HCTF 2018]WarmUp(代码审计)

buu[HCTF 2018]WarmUp&#xff08;代码审计&#xff09; 题目 访问source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php…

电脑键盘如何练习盲打?

电脑键盘如何练习盲打&#xff1f;盲打很简单&#xff0c;跟着我做&#xff0c;今天教会你。 请看【图1】&#xff1a; 【图1】中&#xff0c;红色方框就是8个基准键位&#xff0c;打字时我们左右手的8个手指就是放在这8个基准键位上&#xff0c;F键和J键上各有一个小突起&…

Spring6基础笔记

Spring6 Log4j2 1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发…

mysql图形化界面及将mysql注册成后台程序

安装图形化界面版本 右键新建数据库 字符集使用utf8防止以后数据库中存在中文字符导致乱码 将mysql注册成后台程序 cmd进入命令行界面 切换路径到cd /mysql/bin 将mysql注册成后台程序 mysqld.exe --install mysql1 (失败&#xff0c;说明没有权限) 以管理员身份打开成功…