美颜相机的实现(利用Webcam)
如何实现美颜相机?
首先,需要导入三个外部jar包来调用摄像头
美颜相机是要调用我们的电脑摄像头实时获取我们的视频数据,视频就是由一帧一帧的图片组成的,所以我们需要先将一张图片如何处理了解明白。
第一步
我们需要打开摄像头,然后创建一个Webcam对象,为此我专门写了一个open方法来打开摄像头
public void open(){
Webcam webcam=Webcam.getDefault();
webcam.setViewSize(new Dimension(640, 480));
wb=webcam;
webcam.open();
}
第二步
我们采用图片缓冲区BufferedImage来存取摄像头传来的某一帧图片
BufferedImage buffimage =wb.getImage();
为什么采用图片缓冲区来存储图像呢?这里你可以将它看作一个自由的画布,先往这个自由的画布上画上你想画的东西,然后再将这个自由的画布当作一幅画,整个画到窗体上。
当你经常改变要画的东西时,只在图片缓冲区中该变即可,将所有的该变完成后再显视到窗体上,这样窗体上的动画就不会因为一步一步刷新而闪烁了。
第三步(重难点)
就是美颜相机最关键也是最难的一步,如何从图片缓冲区得到图片像素值?
一张图片有长宽,所以用一个二维数组来保存图片所有的像素值。一个RGB占三个字节,一个int型是占四个字节,所以用一个int型二维数组来保存图片像素值。
public int[][] getImagePixel(BufferedImage image){
}
由第二步我们得到了一个图片缓冲区,所以调用该方法就可以,那么重点来了,方法体怎么写?
int[][] im=new int[image.getWidth()][image.getHeight()];//新建二维数组,宽高由getWidth()和getHeight()确定
然后遍历二维数组,将缓冲区的每一个像素值传给二维数组相应位置。
for(int i=0;i<image.getWidth();i++) {
for(int j=0;j<image.getHeight();j++) {
im[i][j]=image.getRGB(i, j);
}
}
很多同学认为我们这就已经完成了,但是并不是这样,这得到的图像是左右颠倒的,白话就是举起右手,图像里左手举起来了,所以我们要将左右交换一下。
for(int i=0;i<im[0