Java摄像头图像处理笔记
Java摄像头图像处理笔记
记录编码过程中遇到的问题,附对应正确代码
-
方法定义五要素记混
-
对方法的完整格式记忆不牢,导致编写时分不清各组成部分的作用
-
对应正确代码:
// 完整方法格式:访问修饰符 + 返回值类型 + 方法名 + 参数列表 + 方法体 public void showUI() { // 方法具体逻辑 } public BufferedImage drawGrayImage(BufferedImage sImage) { return img; }
-
-
实例方法调用混淆类与对象
-
问题描述:误以为可以直接用类名调用普通实例方法
-
原因:没区分静态方法和实例方法的调用规则
-
对应正确代码:
public static void main(String[] args) { Cam ui = new Cam(); // 第一步:创建类的对象 ui.showUI(); // 第二步:通过对象调用实例方法 }
-
-
摄像头打开 循环顺序错误
-
把
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); }
-
-
画笔对象获取时机错误
-
在窗体显示前就获取画笔,不清楚窗体渲染的先后顺序
-
对应正确代码:
jf.setVisible(true); //先让窗体渲染显示 Graphics g = jf.getGraphics(); // 再获取窗体的画笔对象
-
-
**
drawImage**方法参数记混-
没记清绘制图片的参数数量和顺序
-
正确代码:
// 参数为:图片对象、x坐标、y坐标、图像观察者(一般传null) g.drawImage(image, 10, 100, null);
-
-
缺少循环导致摄像头画面静止
-
只写了一次获取图片 + 绘制的代码,画面是单帧,没法实现实时视频效果。
-
对应正确代码:
// 循环持续获取新帧 while (true) { BufferedImage image = webcam.getImage(); g.drawImage(image, 10, 100, null); }
-
-
流式布局设置顺序混淆
-
先加了按钮再设置布局,导致按钮堆叠、排版错乱。
-
布局必须先设置才会生效
-
对应正确代码:
FlowLayout fl = new FlowLayout(); // 1. 创建布局对象 jf.setLayout(fl); // 2. 给窗体设置布局 // 3. 布局设置完成后,再创建并添加按钮 JButton btn = new JButton("原图"); JButton btn2 = new JButton("灰度"); jf.add(btn); jf.add(btn2);
-
-
按钮添加时机错误导致不显示
-
窗体设置可见后才添加按钮,按钮没有在界面上渲染
-
窗体默认在
setVisible(true)时渲染组件,之后添加不会自动刷新。 -
对应正确代码:
jf.add(btn); jf.add(btn2); // 所有组件添加完毕后,再设置窗体可见 jf.setVisible(true);
-
-
监听器接口实现
-
没用 implements 实现 ActionListener 接口
-
对应正确代码:
// 用implements实现ActionListener接口 public class CamListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { } }
-
-
监听器与按钮未绑定,点击无反应
-
只编写了监听器类,但没有和按钮绑定,点击按钮没有任何效果。
-
监听器需要主动绑定到按钮上才会生效
-
对应正确代码:
CamListener cl = new CamListener(); // 创建监听器对象 btn.addActionListener(cl); // 给按钮绑定监听器 btn2.addActionListener(cl); -
-
状态变量作用域错误,跨类无法访问
-
把切换滤镜的状态变量写在方法内部,监听器类无法修改和访问,切换功能失效。
-
没理解成员变量和局部变量的作用域区别。
-
对应正确代码:
public class Cam { // 定义为类的静态成员变量,跨类可通过类名直接访问 volatile static String type = "原图"; } // 监听器中通过类名修改状态 case "灰度": Cam.type = "灰度"; break; -
-
多线程下变量修改不可见,切换滤镜失效
-
点击按钮切换滤镜后,画面没有变化,变量修改不生效。
-
UI 事件线程和绘图线程是两个独立线程,缺省情况下变量会被线程缓存,修改对另一个线程不可见。
-
对应正确代码:
// 添加volatile修饰符,保证多线程下变量的可见性 volatile static String type = "原图"; -
-
字符串比较误用**
==****,判断不生效**-
用
==比较字符串内容 -
混淆
==和equals的作用,==比较内存地址,equals才是比较字符串内容。 -
对应正确代码:
if(type.equals("原图")){ g.drawImage(image, 10, 100, null); } -
更多推荐
所有评论(0)