Java摄像头图像处理笔记

📅 2026/6/29 19:33:49
Java摄像头图像处理笔记
Java摄像头图像处理笔记记录编码过程中遇到的问题附对应正确代码方法定义五要素记混对方法的完整格式记忆不牢导致编写时分不清各组成部分的作用对应正确代码// 完整方法格式访问修饰符 返回值类型 方法名 参数列表 方法体publicvoidshowUI(){// 方法具体逻辑}publicBufferedImagedrawGrayImage(BufferedImagesImage){returnimg;}实例方法调用混淆类与对象问题描述误以为可以直接用类名调用普通实例方法原因没区分静态方法和实例方法的调用规则对应正确代码publicstaticvoidmain(String[]args){CamuinewCam();// 第一步创建类的对象ui.showUI();// 第二步通过对象调用实例方法}摄像头打开 循环顺序错误把open()写进循环里导致重复打开对应正确代码jf.setVisible(true);//先显示界面Graphicsgjf.getGraphics();WebcamwebcamWebcam.getDefault();webcam.open();//循环外只打开一次摄像头while(true){BufferedImageimagewebcam.getImage();g.drawImage(image,10,100,null);}画笔对象获取时机错误在窗体显示前就获取画笔不清楚窗体渲染的先后顺序对应正确代码jf.setVisible(true);//先让窗体渲染显示Graphicsgjf.getGraphics();// 再获取窗体的画笔对象**drawImage**方法参数记混没记清绘制图片的参数数量和顺序正确代码// 参数为图片对象、x坐标、y坐标、图像观察者一般传nullg.drawImage(image,10,100,null);缺少循环导致摄像头画面静止只写了一次获取图片 绘制的代码画面是单帧没法实现实时视频效果。对应正确代码// 循环持续获取新帧while(true){BufferedImageimagewebcam.getImage();g.drawImage(image,10,100,null);}流式布局设置顺序混淆先加了按钮再设置布局导致按钮堆叠、排版错乱。布局必须先设置才会生效对应正确代码FlowLayoutflnewFlowLayout();// 1. 创建布局对象jf.setLayout(fl);// 2. 给窗体设置布局// 3. 布局设置完成后再创建并添加按钮JButtonbtnnewJButton(原图);JButtonbtn2newJButton(灰度);jf.add(btn);jf.add(btn2);按钮添加时机错误导致不显示窗体设置可见后才添加按钮按钮没有在界面上渲染窗体默认在setVisible(true)时渲染组件之后添加不会自动刷新。对应正确代码jf.add(btn);jf.add(btn2);// 所有组件添加完毕后再设置窗体可见jf.setVisible(true);监听器接口实现没用 implements 实现 ActionListener 接口对应正确代码// 用implements实现ActionListener接口publicclassCamListenerimplementsActionListener{OverridepublicvoidactionPerformed(ActionEvente){}}监听器与按钮未绑定点击无反应只编写了监听器类但没有和按钮绑定点击按钮没有任何效果。监听器需要主动绑定到按钮上才会生效对应正确代码CamListenerclnewCamListener();// 创建监听器对象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);}