在春节前夕,在陈哥的指导下,完成了美颜相机中一些滤镜效果的添加,但是之前滤镜效果的使用都是基于单独的图片,而我们的视频也是由一帧一帧的图片构成,所以我们在想完成美颜相机的情况下,首先要学会的是如何获取视频(javaOpenCV库,或者WebCamp),以下采用WebCamp作为实例!
将要实现的功能包括但不限定于:拍照,视频获取,录像,截图,人脸识别,特效..........
1.主程序的编写,主要还是运用awt和swing组件
package CL2.Draw0117.Video0123;
import javax.swing.*;
import java.awt.*;
public class VDraw {
public void initt() {
//窗体设置
JFrame jf = new JFrame();
//窗体大小设置
jf.setSize(810,900);
//窗体名称设置
jf.setTitle("视频摄像捕捉");
//退出进程设置
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLocationRelativeTo(null);
//窗体布局设置
BorderLayout borderLayout=new BorderLayout();
jf.setLayout(borderLayout);
//中心窗体背景设置
JPanel center=new JPanel();
center.setBackground(Color.white);
jf.add(center,BorderLayout.CENTER);
//Vpixelmouse对象的创立,便于监听器的添加
Vpixelmouse mouse=new Vpixelmouse();
//菜单栏
JMenuBar jmb = new JMenuBar();
//菜单栏位置的固定
jf.add(jmb,BorderLayout.NORTH);
//菜单选项
JMenu jmn = new JMenu("视频");
jmb.add(jmn);
//子菜单
JMenuItem jmi = new JMenuItem("打开");
JMenuItem jmi2 = new JMenuItem("关闭");
jmn.add(jmi);
jmn.add(jmi2);
//可视一定要在画笔前
jf.setVisible(true);
mouse.g=center.getGraphics();
//添加监听器
jmi.addActionListener(mouse);
jmi2.addActionListener(mouse);
}
public static void main(String[] args) {
VDraw vDraw=new VDraw();
vDraw.initt();
}
}
2.
package CL2.Draw0117.Video0123;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class Vpixelmouse implements ActionListener {
public Graphics g;
//类来传递数据
public Vthreadpixel vp;
public boolean flag;
public void actionPerformed(ActionEvent e){
String st = e.getActionCommand();
if ("打开".equals(st)) {
// 启动多线程
// 创建线程对象,显示该线程创建一次
if (vp == null) {
vp=new Vthreadpixel(g);
// 启动线程
vp.start();
}
} else if ("关闭".equals(st)) {
vp.flag = false;
System.out.println("关闭");
}
}
public int[][] getImagePixel(String path) {
File file = new File(path);
// ImageIO:对图片文件进行I/O
// 获取缓冲图片
BufferedImage buffImage = null;
try {
buffImage = ImageIO.read(file);
} catch (IOException e1) {
e1.printStackTrace();
}
int w = buffImage.getWidth();
int h = buffImage.getHeight();
int[][] pixelArr = new int[w][h];
// 获取图片中的每一个像素值保存到二维数组中
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
int pixel = buffImage.getRGB(i, j);
pixelArr[i][j] = pixel;
}
}
return pixelArr;
}
}
3.多线程的使用
package CL2.Draw0117.Video0123;
import com.github.sarxos.webcam.Webcam;
import java.awt.*;
import java.awt.image.BufferedImage;
public class Vthreadpixel extends Thread {
public Graphics g;
//控制线程的标记
public boolean flag = true;
//初始化画笔对象
public Vthreadpixel(Graphics g) {
this.g = g;
}
// 启动线程后自定执行的方法
// run 方法执行完,该线程结束,线程一旦结束不能再次启动
public void run() {
System.out.println("启动线程.."+this.getName());
// 启动摄像头,放在线程中启动
Webcam webcam=Webcam.getDefault();
webcam.open();
//
while (flag) {
// 获取摄像头拍到的数据
BufferedImage bufferedImage=webcam.getImage();
//大小的设置
g.drawImage(bufferedImage,100,100,400,300,null);
}
}
}
4.效果如图
?
|