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