今天我们来用java实现相机滤镜功能。显然首先要有一个窗体,所以我们创建类来设置窗体,类名取为VideoCapture,这里我们简写一下,让VideoCapture类继承JFrame,作为它的子类,然后可以不再用JFrame创建窗体对象,而是可以直接再方法中进行窗体属性的设置,代码为public class VideoCapture extends JFrame{...}.接着撰写方法initUI,设置标题为“VideoCapture”,设置大小,居中显示,选择关闭方式,选择边框布局方式。代码为setTitle(“VideoCapture”);setSize(1000,800);setLocationRelativeTo(null);setDefaultCloseOperation(3);BorderLayout border = new BorderLayout();setLayout(border)。该部分代码如下
然后我们加入两个JPanel面板容器,首先创建JPanel新对象jp用来保存按钮,代码为JPanel jp=new JPanel();jp.setPreferredSize(new Dimension(100,80));add(jp,Border.SOUTH);
然后再创建一个JPanel对象jpd,把它加在边框布局的中间,并设置颜色背景为灰色,代码为JPanel jpd=new JPanel();jpd.setPreferredSize(new Dimension(1000,600));jpd. setBackground(Color.GRAY);add(jpd,Border.CENTER)。
因为接下来的按钮要用到动作监听器,所以我们要创建监听器对象类VClistener来继承接口Actionlistener,然后要设置一下画笔属性,同时设置方法,代码为private Graphics gr;public void setG(Graphics gr){ this.gr = gr }。然后重写actionPerformed方法。稍后逐渐添加方法内容。创建该监听器类对象vcl,代码为VClistener vcl = new VClistener() ;
接着设计按钮,我们打算加的按钮有启动,关闭,拍照,二值化,灰度图,马赛克,原图。前三个按钮为相机操作,后四个按钮为图像操作。这里我们把这两类按钮区分,通过加以不同的动作指令来对其进行分类,用setActionCommand()方法来区分二者的动作指令,这里看一下getActionCommand的方法体,如下图所示,首先是返回字符串ac,如果ac值为空值,那么就返回按钮的文本内容,否则就返回非空ac值,这里的ac就是指的actionCommand值。所以把这两类按钮的该值进行提前区分设置。举例:jbu.setActionCommand("camOP")。
然后我们开始写代码加入按钮。首先创建字符串数组,把我们想要加入的按钮名称写在里面,代码为String str = {"启动","关闭","拍照"}。然后循环遍历,把这些按钮设置大小,加上监听器,并放到面板jp上,代码为for(int i=0;i<str.length;i++){,JButton jbu = new JButton(str[i]);jbu.setActionCommand("camOP");jbu.setPreferredSize(new Dimension(80,40));jbu.addActionlistener(vcl);jp.add(jbu);},接着我们把图像滤镜的按钮也加在里面,这里使用增强for循环,代码为String filterstr = {"二值化","灰度图","马赛克","原图"};for(String:fstr;filterstr){JButton jbu = new JButton(fstr);jbu.setPreferredSize(80,40);jbu.setActionCommand("videoOP");jbu.addActionlistener(vcl);jp.add(jbu);}。至此就加入了所有的需要的按钮。
然后不要忘记设置可见,代码为setVisible(true);然后在我们监听按钮时,势必要发生一些后续的动作,我们希望的动作都是写在了监听器类中的actionPerformed方法中,这里监听器中对象要用到画笔,并且也定义了画笔属性,所以在这里我们要把画板的画笔传给监听器对象,作为该对象的画笔属性。代码为this.g =jpd.getGraphics();vcl.setG(g);这样的话监听器对象就有了画笔属性。
然后我们要得到一个摄像头,首先这里要下载三个libs并且导入项目,如图所示。
然后直接使用Webcam类调用getDefault()可以获取电脑默认的摄像头, 代码为 Webcam webcam=Webcam.getDefault();因为getDefault()有static修饰符, 所以可以直接通过类名Webcam来调用。这里拓展一下,我们通过Webcam类的getWebcams方法可以获得电脑中所有能用的摄像头,方法返回值类型是List,且列表中元素类型为Webcam,即摄像头,可以得到它,并且遍历输出一下,代码为List<Webcam> webcamlist=Webcam.getWebcams();System.out.println("摄像头的总数为"+webcamlist.size());for(Webcam wecam1:webcamlist){System.out.println("name:"+webcam1);},这样就依次输出了所有的摄像头。