Java摄像头图像处理笔记

记录编码过程中遇到的问题,附对应正确代码

  1. 方法定义五要素记混

    • 对方法的完整格式记忆不牢,导致编写时分不清各组成部分的作用

    • 对应正确代码:

      // 完整方法格式:访问修饰符 + 返回值类型 + 方法名 + 参数列表 + 方法体
      public void showUI() {
        // 方法具体逻辑
      }
      
      public BufferedImage drawGrayImage(BufferedImage sImage) {
        return img;
      }
      
  2. 实例方法调用混淆类与对象

    • 问题描述:误以为可以直接用类名调用普通实例方法

    • 原因:没区分静态方法和实例方法的调用规则

    • 对应正确代码:

      public static void main(String[] args) {
        Cam ui = new Cam();  // 第一步:创建类的对象
        ui.showUI();         // 第二步:通过对象调用实例方法
      }
      
  3. 摄像头打开 循环顺序错误

    • open()写进循环里,导致重复打开

    • 对应正确代码:

      jf.setVisible(true);         //先显示界面
      Graphics g = jf.getGraphics();
      Webcam webcam = Webcam.getDefault();
      webcam.open();               //循环外只打开一次摄像头
      while (true) {        
        BufferedImage image = webcam.getImage();
        g.drawImage(image, 10, 100, null);
      }
      
  4. 画笔对象获取时机错误

    • 在窗体显示前就获取画笔,不清楚窗体渲染的先后顺序

    • 对应正确代码:

      jf.setVisible(true);        //先让窗体渲染显示
      Graphics g = jf.getGraphics();  // 再获取窗体的画笔对象
      
  5. **drawImage**方法参数记混

    • 没记清绘制图片的参数数量和顺序

    • 正确代码:

      // 参数为:图片对象、x坐标、y坐标、图像观察者(一般传null)
      g.drawImage(image, 10, 100, null);
      
  6. 缺少循环导致摄像头画面静止

    • 只写了一次获取图片 + 绘制的代码,画面是单帧,没法实现实时视频效果。

    • 对应正确代码:

      // 循环持续获取新帧
      while (true) {
        BufferedImage image = webcam.getImage();
        g.drawImage(image, 10, 100, null);
      }
      
  7. 流式布局设置顺序混淆

    • 先加了按钮再设置布局,导致按钮堆叠、排版错乱。

    • 布局必须先设置才会生效

    • 对应正确代码:

      FlowLayout fl = new FlowLayout();  // 1. 创建布局对象
      jf.setLayout(fl);                  // 2. 给窗体设置布局
      
      // 3. 布局设置完成后,再创建并添加按钮
      JButton btn = new JButton("原图");
      JButton btn2 = new JButton("灰度");
      jf.add(btn);
      jf.add(btn2);
      
  8. 按钮添加时机错误导致不显示

    • 窗体设置可见后才添加按钮,按钮没有在界面上渲染

    • 窗体默认在setVisible(true)时渲染组件,之后添加不会自动刷新。

    • 对应正确代码:

      jf.add(btn);
      jf.add(btn2);
      // 所有组件添加完毕后,再设置窗体可见
      jf.setVisible(true);
      
  9. 监听器接口实现

    • 没用 implements 实现 ActionListener 接口

    • 对应正确代码:

      // 用implements实现ActionListener接口
      public class CamListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
      
        }
      }
      
  10. 监听器与按钮未绑定,点击无反应

    • 只编写了监听器类,但没有和按钮绑定,点击按钮没有任何效果。

    • 监听器需要主动绑定到按钮上才会生效

    • 对应正确代码:

    CamListener cl = new CamListener();  // 创建监听器对象
    btn.addActionListener(cl);           // 给按钮绑定监听器
    btn2.addActionListener(cl);
    
  11. 状态变量作用域错误,跨类无法访问

    • 把切换滤镜的状态变量写在方法内部,监听器类无法修改和访问,切换功能失效。

    • 没理解成员变量和局部变量的作用域区别。

    • 对应正确代码:

    public class Cam {
        // 定义为类的静态成员变量,跨类可通过类名直接访问
        volatile static String type = "原图";
    }
    
    // 监听器中通过类名修改状态
    case "灰度":
        Cam.type = "灰度";
        break;
    
  12. 多线程下变量修改不可见,切换滤镜失效

    • 点击按钮切换滤镜后,画面没有变化,变量修改不生效。

    • UI 事件线程和绘图线程是两个独立线程,缺省情况下变量会被线程缓存,修改对另一个线程不可见。

    • 对应正确代码:

    // 添加volatile修饰符,保证多线程下变量的可见性
    volatile static String type = "原图";
    
  13. 字符串比较误用**==****,判断不生效**

    • ==比较字符串内容

    • 混淆==equals的作用,==比较内存地址,equals才是比较字符串内容。

    • 对应正确代码:

    if(type.equals("原图")){
        g.drawImage(image, 10, 100, null);
    }
    

更多推荐