JAVA当中摄像头调用(并实现摄像头的滤镜效果)

  • 摄像头的调用
    • 1.包的导入
      • 1.1首先进入webcam官网
      • 1.2然后点击Download下的下载的webcam-capture-0.3.10-dist.zip
      • 1.3下载完成包以后进入eclipse界面,右击包的选项选择 build path中的configure build path-->libraries--->Add External JAR...--->选择需要的三个包----(在下面的第二张图当中)
    • 2.调用包的具体代码以及实现摄像头滤镜效果的代码
      • 2.1具体摄像头的打开,获取
      • 2.2摄像头实现滤镜效果的代码
      • 2.3在动作监听器当中的代码如下
    • 3.滤镜效果(灰度,油画,卷积效果)的讲解以及加载在摄像头上
      • 3.1灰度
      • 3.2 油画
      • 3.3卷积核效果(具体关于卷积的讲解在下一篇博客中会讲到)
    • 4.run方法和线程的初步窥探以及代码思路讲解

摄像头的调用

1.包的导入

1.1首先进入webcam官网

1.2然后点击Download下的下载的webcam-capture-0.3.10-dist.zip

1.3下载完成包以后进入eclipse界面,右击包的选项选择 build path中的configure build path–>libraries—>Add External JAR…—>选择需要的三个包----(在下面的第二张图当中)


三个文件的名字如下

2.调用包的具体代码以及实现摄像头滤镜效果的代码

2.1具体摄像头的打开,获取

     Webcam webcam =Webcam.getDefault();//将摄像头打开webcam.open();

2.2摄像头实现滤镜效果的代码

package com.lk.DrawPixel0112;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.util.Random;
//今天的任务:1完成线程的博客的书写2完成图像处理效果的博客的书写3将整个代码重新写一遍,边写边总结和领悟自己书写的内容
import com.github.sarxos.webcam.Webcam;
//要写一篇关于进程,线程,程序的相关的教程
public class ThreadPixel extends Thread {Graphics g;BufferedImage bff1;public boolean flag=true;String type;float[][] kernel1 = { { 0, -1, 0 }, { -1, 1.99f, 1 }, { 0, -1, 0 }};//有三种type如果type是视频效果一,我们用灰度的效果,如果是视频效果二我们用卷积1的效果,如果是视频效果三,我们用油画的效果public ThreadPixel(Graphics g) {this.g=g;}//函数作用:实现摄像头的多种效果的传递//参数:是缓冲的图片的点public BufferedImage drawhd(BufferedImage bff) {//首先是获取的摄像头的照片是有一定大小的//创建了一个和bff一样大小的画布,bff1//这个和数组那个的区别在哪里bff1 =new BufferedImage(bff.getWidth(),bff.getHeight(),BufferedImage.TYPE_INT_RGB);Graphics ng =bff1.getGraphics();//养成看源代码的习惯,getRGB先走的是x轴,然后走的是y轴,bufferedImage也是这个样子的,先是宽度然后在是高度,不然可能发生越界的情况,因为获取的摄像头的大小是不能够确认的事情for(int i=0;i<bff.getWidth();i++) {for(int j=0;j<bff.getHeight();j++) {//因为获取rgb值的时候是从上往下走的,在获取rgb值的时候越界了int pixel=bff.getRGB(i, j);Color color =new Color(pixel);//(r,g,b)int red =(int)(color.getRed()*0.299);int green =(int)(color.getGreen()*0.587);int blue =(int)(color.getBlue()*0.114);Color newcolor =new Color(red+green+blue,red+green+blue,red+green+blue);ng.setColor(newcolor);ng.drawLine(i, j, i, j);}}return bff1;}public BufferedImage drawyh(BufferedImage bff) {BufferedImage bff1 =new BufferedImage(bff.getWidth(),bff.getHeight(),BufferedImage.TYPE_INT_BGR);Graphics ng =bff1.getGraphics();for(int i=0;i<bff.getWidth();i++) {for(int j=0;j<bff.getHeight();j++) {//因为获取RGB值的i,j是先看的宽后看的高,所以我前面用的是先列举遍宽然后在涉及到高int pixel =bff.getRGB(i, j);Color color =new Color(pixel);ng.setColor(color);Random random =new Random();//这行代码的意思就是取一个20以下的数字  再加上5int r =random.nextInt(20)+10;ng.fillOval(i, j, r, r);}}return bff1;}public BufferedImage juanji(BufferedImage bff,float kernel[][]){//保存卷积计算的数据大小跟kernel一致int temp[][]=new int[kernel.length][kernel[0].length];int h=bff.getHeight()-kernel.length+1;int l=bff.getWidth()-kernel[0].length+1;//保存卷积运算的有效数据int juanji[][] =new int [l][h];//两个矩阵相乘for(int i=0;i<l;i++) {for(int j=0;j<h;j++) {//遍历卷积核int num=0;//原来矩阵怎样列举遍的的,那么卷积核的矩阵就要怎样列举遍for(int m=0;m<kernel[0].length;m++) {for(int n=0;n<kernel.length;n++) {temp[m][n]=(int) (bff.getRGB(i+m, j+n)*kernel[m][n]);//注意一个逻辑问题,在一定的卷积效果运算当中num+=temp[m][n];}}if(num<0) num=0;if(num>255) num=255;//把矩阵相乘后的值保存到temp数组中juanji[i][j]=num;}}BufferedImage bff1 =new BufferedImage(juanji.length,juanji[0].length,BufferedImage.TYPE_INT_RGB);Graphics ng =bff1.getGraphics();for(int i=0;i<juanji.length;i++) {for(int j=0;j<juanji[0].length;j++) {//卷积得到的一个值是三原色当中颜色的一种int pixel =juanji[i][j];Color color =new Color(pixel,pixel,pixel);ng.setColor(color);ng.drawLine(i, j, i, j);}}return bff1;}//run方法结束的话,那样的话线程结束public void run(){//启动线程//获取摄像头Webcam webcam =Webcam.getDefault();//将摄像头打开webcam.open();while(flag) {BufferedImage bff =webcam.getImage();if(type.equals("灰度")) {g.drawImage(drawhd(bff),100,100,500,500,null);}if(type.equals("卷积效果1")) {g.drawImage(juanji(bff,kernel1),100,100,500,500,null);}if(type.equals("油画")) {g.drawImage(drawyh(bff),100,100,500,500,null);}}}
}

2.3在动作监听器当中的代码如下

**
mypanel.repaint()的作用是刷新界面
tp是用自己写的ThreadPixel创建的实例
tp.start的作用是开启tp实例当中的摄像头
其中flag是控制摄像头的开或者关闭的开关,当ThreadPixel当中的while函数结束的时候代表线程的结束**

 public class PixelMouse implements ActionListener{//相片旋转要解决的一个问题是宽和高不相等的情况需要考虑进来int [][]arr=arrpixel("F:\\java\\美颜相机图片\\lklibrary.jpg");int [][]arr1=arrpixel("C:\\Users\\HP\\Desktop\\pic1.jpg");public PixelFileter [] pixelarrf =new PixelFileter[100];int index=0;String str1;Graphics g;MyPanel mypanel =new MyPanel();public ThreadPixel tp;//重绘的概念是每次重新绘制的时候都要重新画图//可不可以将这些代码全部优化为一个函数只要判断出来它是字符类型就可以了@Override//因为在点击以后我们需要执行相对应的效果,所以我们需要一个滤镜的对象public void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubSystem.out.println("调用了动作监听器");str1=e.getActionCommand();if(str1.equals("打开")) {mypanel.repaint();//为啥要让tp=null,其中的原因还不是很清楚if(tp==null) {tp =new ThreadPixel(g);tp.start();}}if(str1.equals("特效视频效果1")) {//mypanel.repaint();System.out.println("打开并实现了视频效果1");if(tp==null) {tp=new ThreadPixel(g);tp.type="灰度";tp.start();tp.type="灰度";}}if(str1.equals("特效视频效果2")) {mypanel.repaint();if(tp==null) {tp=new ThreadPixel(g);tp.start();tp.type="卷积效果1";}}if(str1.equals("特效视频效果3")) {mypanel.repaint();if(tp==null) {tp=new ThreadPixel(g);tp.start();tp.type="油画";}}if(str1.equals("关闭")) {mypanel.repaint();tp.flag=false;tp=null;}

3.滤镜效果(灰度,油画,卷积效果)的讲解以及加载在摄像头上

3.1灰度

    public BufferedImage drawhd(BufferedImage bff) {//首先是获取的摄像头的照片是有一定大小的//创建了一个和bff一样大小的画布,bff1//这个和数组那个的区别在哪里bff1 =new BufferedImage(bff.getWidth(),bff.getHeight(),BufferedImage.TYPE_INT_RGB);Graphics ng =bff1.getGraphics();//养成看源代码的习惯,getRGB先走的是x轴,然后走的是y轴,bufferedImage也是这个样子的,先是宽度然后在是高度,不然可能发生越界的情况,因为获取的摄像头的大小是不能够确认的事情for(int i=0;i<bff.getWidth();i++) {for(int j=0;j<bff.getHeight();j++) {//因为获取rgb值的时候是从上往下走的,在获取rgb值的时候越界了int pixel=bff.getRGB(i, j);Color color =new Color(pixel);//(r,g,b)int red =(int)(color.getRed()*0.299);int green =(int)(color.getGreen()*0.587);int blue =(int)(color.getBlue()*0.114);Color newcolor =new Color(red+green+blue,red+green+blue,red+green+blue);ng.setColor(newcolor);ng.drawLine(i, j, i, j);}}return bff1;}

灰度的计算式是 首先获取缓冲图片的RGB值,然后将其变为color对象,用color对象中的getRed()函数以及对应的getgreen函数,乘以对应的比例,最后用缓冲区的画笔将缓冲区域给画完,最后返回的是缓冲区的bff

3.2 油画

    public BufferedImage drawyh(BufferedImage bff) {BufferedImage bff1 =new BufferedImage(bff.getWidth(),bff.getHeight(),BufferedImage.TYPE_INT_BGR);Graphics ng =bff1.getGraphics();for(int i=0;i<bff.getWidth();i++) {for(int j=0;j<bff.getHeight();j++) {//因为获取RGB值的i,j是先看的宽后看的高,所以我前面用的是先列举遍宽然后在涉及到高int pixel =bff.getRGB(i, j);Color color =new Color(pixel);ng.setColor(color);Random random =new Random();//这行代码的意思就是取一个20以下的数字  再加上5int r =random.nextInt(20)+10;ng.fillOval(i, j, r, r);}}return bff1;}

注意事项:因为getRGB(i,j)函数当中,获取的最左边的i的值代表的是宽度,代表的是长度,所以在列遍bff当中的像素点的时候,首先要获取的是bff.getwidth()

3.3卷积核效果(具体关于卷积的讲解在下一篇博客中会讲到)

尤其要注意是否会超出列表的返回而超出索引范围造成出错

    public BufferedImage juanji(BufferedImage bff,float kernel[][]){//保存卷积计算的数据大小跟kernel一致int temp[][]=new int[kernel.length][kernel[0].length];int h=bff.getHeight()-kernel.length+1;int l=bff.getWidth()-kernel[0].length+1;//保存卷积运算的有效数据int juanji[][] =new int [l][h];//两个矩阵相乘for(int i=0;i<l;i++) {for(int j=0;j<h;j++) {//遍历卷积核int num=0;//原来矩阵怎样列举遍的的,那么卷积核的矩阵就要怎样列举遍for(int m=0;m<kernel[0].length;m++) {for(int n=0;n<kernel.length;n++) {temp[m][n]=(int) (bff.getRGB(i+m, j+n)*kernel[m][n]);//注意一个逻辑问题,在一定的卷积效果运算当中num+=temp[m][n];}}if(num<0) num=0;if(num>255) num=255;//把矩阵相乘后的值保存到temp数组中juanji[i][j]=num;}}BufferedImage bff1 =new BufferedImage(juanji.length,juanji[0].length,BufferedImage.TYPE_INT_RGB);Graphics ng =bff1.getGraphics();for(int i=0;i<juanji.length;i++) {for(int j=0;j<juanji[0].length;j++) {//卷积得到的一个值是三原色当中颜色的一种int pixel =juanji[i][j];Color color =new Color(pixel,pixel,pixel);ng.setColor(color);ng.drawLine(i, j, i, j);}}return bff1;}

4.run方法和线程的初步窥探以及代码思路讲解

 //run方法结束的话,那样的话线程结束public void run(){//启动线程//获取摄像头Webcam webcam =Webcam.getDefault();//将摄像头打开webcam.open();while(flag) {BufferedImage bff =webcam.getImage();if(type.equals("灰度")) {g.drawImage(drawhd(bff),100,100,500,500,null);}if(type.equals("卷积效果1")) {g.drawImage(juanji(bff,kernel1),100,100,500,500,null);}if(type.equals("油画")) {g.drawImage(drawyh(bff),100,100,500,500,null);}}}

注意:1 tp.start()是在调用run方法,因为run方法进行的时候,如果flag是真的话,那么程序会不断的运行,程序不会终止,这样我们如果在动作监听器当中,检测到需要关闭的信息的时候,将flag的值改变为false,所以run方法结束
2 视频的形成其实就是很多的图片连续形成的结果,所以这个循环使得不断获取当前图片,进而形成了视频的效果
3 g.drawImage(参数1:缓冲图片的像素的具体信息,x坐标,y坐标,长度,宽度,null)

【java当中摄像头调用保姆级别教程和在摄像头上实现滤镜效果】相关推荐

  1. Glcm 灰度共生矩阵,保姆级别教程,获取图片的Glcm和基于Glcm的纹理特征,附讲解思路,python代码的实现

    保姆级别教程,获取图片的Glcm和基于Glcm的纹理特征,附讲解思路,python代码的实现 网络上Glcm的原理很多,但是实现的python代码我确实没找到,讲的也不是很清楚 此文介绍了如何在一张图 ...

  2. Windows 10电脑使用VMware虚拟机安装macOS苹果系统[一站式保姆级别教程]

    indows系统下使用VMware虚拟机安装macOS苹果系统保姆级别教程,根据本教程操作可以轻松实现win系统安装macOS Mojav 10.14.macOS Catalina 10.15.mac ...

  3. 个人所得税专项抵扣:Apsara Clouder云计算专项技能认证考试题目和答案【保姆级别教程】

    [保姆级别教程]个人所得税年度应纳税额抵扣:Apsara Clouder云计算专项技能认证:云服务器ECS入门.考试题及答案,已验证过了,新增了最新增加的考题. 一.考试入口 入口: https:// ...

  4. 【数据的存储】浮点数在内存中的存储详解【超详细的保姆级别教程,让面试官心服口服】手撕浮点数存储使用方式

    [数据的存储]浮点数在内存中的存储详解[超详细的保姆级别教程,让面试官对你心服口服]手撕浮点数存储使用方式 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇博客 ...

  5. SSM整合(从创表到部署)保姆级别教程超细

    这篇文章主要讲述SSM(Spring+SpringMVC+Mybatis)框架整合,每一步配置都很详细,下面跟着小编一起来学习吧! 目录 SSM 整合 数据库添加表 创建Maven项目 添加pom依赖 ...

  6. ansible使用教程(4W字长文,保姆级别教程,建议收藏)

    目录 一.介绍 1.Ansible发展史 2.特性 3.架构 4.ansible的作用以及工作结构 5.ansible主要组成部分 二.安装 1.rpm包安装: EPEL源 2.编译安装: 3.Git ...

  7. Python+Appium从安装到第一个小练习(保姆级别教程)

    前言 电脑系统:win10 手机:安卓(没钱买苹果) 需要的工具可以在这里下载,https://pan.baidu.com/s/1MupElpYcmeQH3uPQ1CUWjw 提取码:AJDG 安装 ...

  8. 2020最新版Android一步一步教轻松通过ArcSoft虹软平台实现人脸识别功能,保姆级别教程?

    Android实现人脸识别功能 第一步:注册并认证成为开发者. 第二步:创建应用 1.认证成功后,我们就可以开始创建应用. 2,填写信息 3.点击添加SDK 4.选择人脸识别 5.选择情况,如图所示. ...

  9. 如何使用智汀家庭云连接智汀智能摄像头?保姆级教程

    智汀智能摄像头以白白胖胖的可爱外表.亲民的价格,以及360度无死角的监控.清晰的2K画质广受用户好评,不少路人看到智汀摄像头的使用效果都入坑了,但他们当中很多人对其如何连接使用还是比较模糊的,那今天小 ...

最新文章

  1. 冲刺第三天 1.3 THU
  2. 五分钟重温斐波那契数列
  3. 汇编学习笔记(4)-伪指令(MASM)
  4. html下拉菜单的子目录,html - 带有下拉菜单的子菜单的垂直下拉菜单 - 堆栈内存溢出...
  5. Cortex M3内核架构
  6. 学霸情侣一起投身国防事业,爱情和优秀同时发生了…
  7. 获取自己主机外网ip
  8. php站中文转码在iis 7.5乱码,iis伪静态中文url出现乱码的解决办法
  9. [转][整理]Linux下找不到共享库(shared object)
  10. 英文文本分类(CNN)
  11. openwrt 问题四 9531编译解决方法
  12. PHP输出星座,php 通过日期推算星座的方法
  13. 哀其不幸的墨西哥人工智能
  14. mysql explain是什么意思_MySQL中EXPLAIN解释命令详解
  15. oracle的listener监听启动报TNS-12555/ TNS-12560 TNS-00525错误
  16. Hyperledger Fabric 链码生命周期
  17. tp5.1 系统常量
  18. HashMap底层原理(图文并茂,简单易懂)
  19. oracle导出dmp文件教程
  20. office图标不能正常显示

热门文章

  1. 微信公众号三方平台开发【帐号注册、平台创建】
  2. python自动输入验证码_python下的自动化测试--selenium 验证码输入问题
  3. 知乎热议: Java, Go和Python那个前景好?
  4. C语言基础 阶乘:输入一个数,输出它的阶乘。
  5. Linux磁盘故障和文件系统修复(救援模式Centos7、Centos8)
  6. 《计算机组成原理》— 计算机组成原理试卷一(期末复习备用)
  7. CMake是什么?有什么用?
  8. SpringCloud服务之间调用,报异常Method has too many Body parameters: public abstract
  9. 千行代码率和代码行数总量
  10. LeetCode刷题记录(一)