在春节前夕,在陈哥的指导下,完成了美颜相机中一些滤镜效果的添加,但是之前滤镜效果的使用都是基于单独的图片,而我们的视频也是由一帧一帧的图片构成,所以我们在想完成美颜相机的情况下,首先要学会的是如何获取视频(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.效果如图