使用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.pswp.cn/web/15311.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15311.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15311.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據結構與算法篇】二叉樹鏈式結構及實現

【數據結構與算法篇】二叉樹鏈式結構及實現 🥕個人主頁:開敲🍉 🔥所屬專欄:每日刷題🍍 🌼文章目錄🌼 4. 二叉樹鏈式結構的實現 4.1 前置說明 4.2 二叉樹的遍歷 4.2.1 前序、中序以及…

通過ssh在本地打開遠程服務器的網頁

用途 在遠程服務器使用jupyter notebook或者tensorboard等時,在本地打開服務器端的網頁的方式有很多比如可以使用MobaXterm工具等,此方法可參考https://blog.csdn.net/cc__cc__/article/details/108060618?spm1001.2014.3001.5502。 若直接使用ssh則可…

C++感受11-Hello Object 成員版

當一個C程序員在設計類型時,他在想什么? 這一類型的對象,需要擁有哪些屬性數據?這一類型的對象,它將擁有哪些功能?這一類型的對象,它的各個屬性和功能之間,有哪些關聯關系&#xff1…

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文件,其內容…

信息系統管理工程師問答題

信息系統管理工程師問答題 系統管理安全兩方面 安全測試 入侵檢測系統的功能 用戶標識與驗證常用的3種方法 (1) 要求用戶輸入一些保密信息,例如用戶名稱和密碼; (2) 采用物理識別設備,例如訪問卡、鑰匙或令牌; (3) 采用生物統計學…

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.進程代碼執行完&…

【九十二】【算法分析與設計】875. 愛吃香蕉的珂珂,410. 分割數組的最大值,機器人跳躍問題,二分答案法

875. 愛吃香蕉的珂珂 - 力扣(LeetCode) 珂珂喜歡吃香蕉。這里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警衛已經離開了,將在 h 小時后回來。 珂珂可以決定她吃香蕉的速度 k (單位:根/小時)。每…

【活動】開源與閉源大模型:探索未來趨勢的雙軌道路

🌈個人主頁: 鑫寶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資源…

使用python將一段文本寫入一個txt文件中且先格式化文件名

有一段文本內容&#xff0c;有“標題”和“內容”組成。 任務&#xff1a;要將這段文本&#xff0c;存放到一個txt文件中&#xff0c;文件名為當天的日期加上“標題”內容。因為“標題”內可能有/<>之類的&#xff0c;還需要格式化一下。 已經將上述功能都寫成了函數&a…

安卓手機APP開發__近距離無線通信(NFC)概述

安卓手機&#xff21;&#xff30;&#xff30;開發&#xff3f;&#xff3f;近距離無線通信(NFC)概述 概述 近距離無線通信 (NFC) 是一組近距離無線技術&#xff0c;距離通常不超過 4 厘米才能 發起連接。通過 NFC&#xff0c;您可以在 NFC 標簽和 Android 設備之間&#xf…

【Redis】 String類型的內部編碼與使用環境

文章目錄 &#x1f343;前言&#x1f334;內部編碼&#x1f384;典型使用場景&#x1f6a9;緩存功能&#x1f6a9;計數&#xff08;Counter&#xff09;功能&#x1f6a9;共享會話&#xff08;Session&#xff09;&#x1f6a9;驗證碼功能 ?總結 &#x1f343;前言 本篇文章重…