摄像头的调用
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;
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 }};
public ThreadPixel(Graphics g)
{
this.g=g;
}
public BufferedImage drawhd(BufferedImage bff)
{
bff1 =new BufferedImage(bff.getWidth(),bff.getHeight(),BufferedImage.TYPE_INT_RGB);
Graphics ng =bff1.getGraphics();
for(int i=0;i<bff.getWidth();i++)
{
for(int j=0;j<bff.getHeight();j++)
{
int pixel=bff.getRGB(i, j);
Color color =new Color(pixel);
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++)
{
int pixel =bff.getRGB(i, j);
Color color =new Color(pixel);
ng.setColor(color);
Random random =new Random();
int r =random.nextInt(20)+10;
ng.fillOval(i, j, r, r);
}
}
return bff1;
}
public BufferedImage juanji(BufferedImage bff,float 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;
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;
}
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) {
System.out.println("调用了动作监听器");
str1=e.getActionCommand();
if(str1.equals("打开"))
{
mypanel.repaint();
if(tp==null)
{
tp =new ThreadPixel(g);
tp.start();
}
}
if(str1.equals("特效视频效果1"))
{
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)
{
bff1 =new BufferedImage(bff.getWidth(),bff.getHeight(),BufferedImage.TYPE_INT_RGB);
Graphics ng =bff1.getGraphics();
for(int i=0;i<bff.getWidth();i++)
{
for(int j=0;j<bff.getHeight();j++)
{
int pixel=bff.getRGB(i, j);
Color color =new Color(pixel);
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++)
{
int pixel =bff.getRGB(i, j);
Color color =new Color(pixel);
ng.setColor(color);
Random random =new Random();
int 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[][])
{
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;
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方法和线程的初步窥探以及代码思路讲解
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)
|