看下实现效果

准备工作我们需要导入webcam包

##  视频图像获取:
http://webcam-capture.sarxos.pl/

## 导包: 
- Eclipse :
  - * 项目:
  - 1: 右键项目名 Build Path - Config BuildPath - Lib - add Jars 选中
- IDEA :
  - 1:右键项目名 Module Setting   
  - 2:找到 lib -> +号 Java 选中jar包

实现代码

1videoui类

public class VideoUI extends JFrame {public VideoUI(){setTitle("图像处理");setSize(1000,1000);setDefaultCloseOperation(3);//设置流式布局setLayout(new FlowLayout());VideoListener vl = new VideoListener();addButton (vl);setVisible(true);//摄像头/*只有一个时: */Webcam webcam = Webcam.getDefault();webcam.setViewSize(WebcamResolution.VGA.getSize());webcam.open();PlayVideo playVideo = new PlayVideo();//得将playVIdeo 传到监听器当中去vl.playVideo = playVideo;//这是死循环,之后不能再写代码playVideo.runVideo(webcam,getGraphics());//后面不能加代码}public void addButton(VideoListener vl){// 先定义一个字符串数组 存储所有按钮的字符串String[] btnstrs = {"原图","马赛克","刷新图片", "反片", "脸部提亮", "灰度", "二值化", "美白", "油画", "轮廓提取", "撤回","暖色系","冷色系","珠纹化"};for(int i = 0; i < btnstrs.length; i++){String btnstr = btnstrs[i];JButton btn = new JButton (btnstr);add (btn);// 按钮添加监听器btn.addActionListener (vl);}}public static void main(String[] args) {new VideoUI();}}

2videolistener类

public class VideoListener implements ActionListener {PlayVideo playVideo;@Overridepublic void actionPerformed(ActionEvent e) {String btnstr = e.getActionCommand();//点击按钮之后,修改死循环中的判断所用到的变量的值playVideo.btnstr=btnstr;System.out.println("点击了"+btnstr);}
}

3playvideo类

public class PlayVideo {//定义一个属性 按钮文本String btnstr="";      //得给一个默认值,不然提示报错为空;
//VideoEff 视频效果对象imageEff VideoEff imageEff = new VideoEff();/**播放视频*/public void runVideo(Webcam webcam, Graphics g){//用死循环来一帧一帧处理图片while (true){//1、获取图片BufferedImage img = webcam.getImage();int [][]imagePixArray = imageEff.getImagePixArray(img);//2、判断如何处理图片if(btnstr.equals("原图")){//不需要处理g.drawImage(img,100,100,null);}if(btnstr.equals("马赛克")){//传入图像数组,图片对象,视频效果对象调用该类中的方法来绘制imageEff.drawImage_02(imagePixArray,g);}if(btnstr.equals ("反片")){imageEff.drawImage_03(imagePixArray,g);}if(btnstr.equals ("脸部提亮")){imageEff.drawImage_04(imagePixArray,g);}if(btnstr.equals ("灰度")){imageEff.drawImage_05(imagePixArray,g);}if(btnstr.equals ("二值化")){imageEff.drawImage_06(imagePixArray,g);}if(btnstr.equals ("油画")){imageEff.drawImage_08(imagePixArray,g);}if(btnstr.equals ("轮廓提取")){imageEff.drawImage_09(imagePixArray,g);}if(btnstr.equals("珠纹化")) {imageEff.drawImage_13(imagePixArray,g);}}}
}

4videoeff类

public class VideoEff {//图片绘制坐标的参数final int X=100;final int Y=100;/*** 将一张图片转为二位数** @param buffimg*         缓冲图片对象* @return 存有图片像素值的二维数组*/public int[][] getImagePixArray(BufferedImage buffimg) {// 获取图片尺寸int w=buffimg.getWidth();int h=buffimg.getHeight();//创建新的二维数组来保存图片信息int [][]imgarr=new int[w][h];for(int i=0;i<w;i++) {for(int j=0;j<h;j++) {imgarr[i][j]=buffimg.getRGB(i,j);}}//返回图片数组return imgarr;}//————————————————————————————————————————————————————————————————————————————————————//以下是绘制图片效果部分/*** 1、绘制原图方法* @param imgarr 图片数组* @param g 图像画笔对象*/public BufferedImage drawImage_01(int[][] imgarr,Graphics g) {BufferedImage img = new BufferedImage(imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);// 如何不绘制特殊形状, 可以考虑直接设置RGBfor(int i=0;i<imgarr.length;i++) {for(int j=0;j<imgarr[i].length;j++) {int rgb = imgarr[i][j];//将RGB    遍历存入BufferedImage;img.setRGB(i,j,rgb);}}g.drawImage(img,X,Y,null);return img;}* 2、马赛克:每隔几个点取几个像素,并将图像放大 只需要在原图基础上设置取点位置以及放大g的宽和高* @param imgarr 图片数组* @param g 图像画笔对象*/public BufferedImage drawImage_02(int[][] imgarr,Graphics g) {BufferedImage img = new BufferedImage (imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);//获取缓冲区画
//        g = img.getGraphics();for(int i=0;i<imgarr.length;i+=10) {for(int j=0;j<imgarr[i].length;j+=10) {int rgb = imgarr[i][j];Color color =new Color(rgb);g.setColor(color);g.fillRect(X+i,Y+j,10,10);}}g.drawImage(img,X,Y,null);return img;}/*** 3、反片  利用获取颜色255-red,255-green,255-blue来做处理* @param imgarr 图片数组* @param g 图像画笔对象*/public BufferedImage drawImage_03(int[][] imgarr,Graphics g) {//创建缓冲图片BufferedImage img = new BufferedImage (imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);//        Graphics g1 = img.getGraphics();for(int i=0;i<imgarr.length;i++) {for(int j=0;j<imgarr[i].length;j++) {int rgb = imgarr[i][j];Color color =new Color(rgb);int red = color.getRed();int blue = color.getBlue();int green = color.getGreen();Color ncolor =new Color(255-red,255-green,255-blue);g.setColor(ncolor);g.fillRect(X+i,Y+j,1,1);}}g.drawImage(img,X,Y,null);return img;}/*** 4、脸部提亮* @param imgarr 图片数组* @param g 图像画笔对象* @return*/public BufferedImage drawImage_04(int[][] imgarr,Graphics g) {BufferedImage img = new BufferedImage (imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i=0;i<imgarr.length;i++) {for(int j=0;j<imgarr[i].length;j++) {int rgb = imgarr[i][j];Color color =new Color(rgb);int red = color.getRed();int blue = color.getBlue();int green = color.getGreen();int grey = (int)(red*0.299+green*0.587+blue*0.114);Color ncolor = new Color(Math.abs(red-255+245),green,blue);g.setColor(ncolor);g.fillRect(X+i,Y+j,1,1);}}g.drawImage(img,X,Y,null);return img;}/*** 5、灰度处理* @param imgarr 图片数组* @param g 图像画笔对象* @return*/public BufferedImage drawImage_05(int[][] imgarr,Graphics g) {//创建缓冲图片BufferedImage img = new BufferedImage (imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);//获取缓冲区笔for(int i=0;i<imgarr.length;i++) {for(int j=0;j<imgarr[i].length;j++) {int rgb = imgarr[i][j];Color color =new Color(rgb);int red = color.getRed();int blue = color.getBlue();int green = color.getGreen();//int grey = (int)(red+blue+green)/3;     较为简单的方法
//      RGB转换成灰度图像的方法
//      Gray = R*0.299 + G*0.587 + B*0.114//更精确的表示int grey = (int)(red*0.299+green*0.587+blue*0.114);Color ncolor = new Color(grey,grey,grey);g.setColor(ncolor);g.fillRect(X+i,Y+j,1,1);}}g.drawImage(img,X,Y,null);return img;}/*** 6、二值化* @param imgarr 图片数组* @param g 图像画笔对象* @return*/public BufferedImage drawImage_06(int[][] imgarr,Graphics g) {BufferedImage img = new BufferedImage (imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i=0;i<imgarr.length;i++) {for(int j=0;j<imgarr[i].length;j++) {int rgb = imgarr[i][j];Color color =new Color(rgb);int red = color.getRed();int blue = color.getBlue();int green = color.getGreen();//先进行灰度化处理int grey = (int)(red*0.299+green*0.587+blue*0.114);Color ncolor = new Color(grey,grey,grey);
//用灰度值大小与110进行比较(修改参数值可以得到不同的深浅度)if(grey <110){g.setColor (Color.BLACK);}else{g.setColor (Color.WHITE);}g.fillRect (100 + i, 100 + j, 1, 1);}}g.drawImage(img,X,Y,null);return img;}/*** 8、油画* @param imgarr 图片数组* 原理:每隔五个像素点取一个,然后用随机大小的椭圆填充每个像素点周围的区域* @param g 图像画笔对象* return*/public BufferedImage drawImage_08(int[][] imgarr,Graphics g) {BufferedImage img = new BufferedImage (imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i=0;i<imgarr.length-5;i+=5) {for(int j=0;j<imgarr[i].length-5;j+=5) {int rgb = imgarr[i][j];Color color =new Color(rgb);g.setColor(color);Random ran=new Random();int r=ran.nextInt(20)+5;g.fillOval(X+i,Y+j,r,r);}}g.drawImage(img,X,Y,null);return img;}/*** 9、轮廓处理* @param imgarr 图片数组* @param g 图像画笔对象* @return*/public BufferedImage drawImage_09(int[][] imgarr, Graphics g){BufferedImage img = new BufferedImage (imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i = 0; i < imgarr.length-1; i++){for(int j = 0; j < imgarr[i].length-1; j++){int rgb = imgarr[i][j];Color color = new Color (rgb);int red = color.getRed ();int green = color.getGreen ();int blue = color.getBlue ();int gray = (int) (red * 0.41 + green * 0.36 + blue * 0.23);// 取出右下斜方向的像素按照 灰度值 作比较int nrgb = imgarr[i + 1][j + 1];Color ncolor = new Color (nrgb);int nred = ncolor.getRed ();int ngreen = ncolor.getGreen ();int nblue = ncolor.getBlue ();int ngray = (int) (nred * 0.41 + ngreen * 0.36 + nblue * 0.23);if(Math.abs (gray - ngray) > 15){g.setColor (Color.black);} else{g.setColor (Color.white);}g.fillRect (X + i, Y + j, 1, 1);}}g.drawImage(img,X,Y,null);return img;}/*** 13、珠纹化* @param imgarr 图片数组* @param g 图像画笔对象* 原理,每隔10取一个像素点,后用大小为9的圆填充*/public BufferedImage drawImage_13(int[][] imgarr,Graphics g) {BufferedImage img = new BufferedImage (imgarr.length,imgarr[0].length,BufferedImage.TYPE_INT_ARGB);for(int i=0;i<imgarr.length;i+=10) {for(int j=0;j<imgarr[i].length;j+=10) {int rgb = imgarr[i][j];Color color =new Color(rgb);g.setColor(color);g.fillOval(X+i,Y+j,9,9);}}g.drawImage(img,X,Y,null);return img;}

java实现美颜相机相关推荐

  1. java简易美颜相机

    一.图片处理的原理 首先我们知道数码照片只要是存储在计算机上的内容都是二进制码组成,而图片RGB值是由三组byte组成的( 255.0.0(红色)),所以它可以看成一个整数,红色即为:16711680 ...

  2. JAVA美颜相机入门(兼具图像处理和画图板功能)

    美颜相机已经成为当代年轻人不可或缺的自拍神器,其具有自动美肌,完美保留细节,让照片告别模糊等功能.或许我们会觉得编写这样一个具有如此强大功能的美颜相机一定需要庞大而且复杂的代码段,其实不然,即使对于初 ...

  3. 【项目:实现美颜相机——java】

    我们可以用java代码实现美颜相机的功能. 类似于之前的图片处理效果: [java用监听器实现选择处理图片的效果]_ZERO_HOPE的博客-CSDN博客 摄像头抓取的图片一帧一帧地绘制在界面上,得到 ...

  4. Java美颜相机入门(图像处理实现各种滤镜算法)

    一.思路分析 一款简易美颜相机的功能我们可以简单分为两大块:1.图像处理    2.功能区 最终的效果图如下: 二.代码分析 图像处理工具的本质是处理像素点,而像素点的本质就是一种颜色,每一个像素点都 ...

  5. 【JAVA】简易美颜相机

    简易美颜相机 简易美颜相机,是我最初接触JAVA的小项目,通过这个项目,我初步学会了许多JAVA的基础知识,下面就让我们开始吧! 首先让我们理清整个项目的大概逻辑: 1.一张图片和摄像头的显示以及各种 ...

  6. JAVA PC端美颜相机

    这是我在蓝杰做的第一个项目:PC端美颜相机.这个小程序的本质就是对一张图像做处理.存储在计算机的图像信息实际上是一个个像素点,不同的像素点有不同的rgb值,修改像素点的rgb值我们就可以将图像处理成我 ...

  7. 小浩浅谈之Java美颜相机pc端(视频)

    在之前的文章中,给大家介绍了如果使用WebCamp来使用电脑的摄像头以及如何为图片添加各种滤镜,那么在这我们进行一个相互结合,就构成了一个我们pc端的美颜相机. 1.第一步和之前一样,就是框体 的创建 ...

  8. php图片美颜,Mac_Mac如何使用Photo Booth拍摄照片拍摄好玩好看的相片,  我们经常会使用美颜相机 - phpStudy...

    Mac如何使用Photo Booth拍摄照片拍摄好玩好看的相片 我们经常会使用美颜相机等拍摄一些好玩好看的相片,在MAC系统中也有一个小工具可以帮我们实现这个想法哦,那就是Photo Booth,我们 ...

  9. Android平台美颜相机/Camera实时滤镜/视频编解码/影像后期/人脸技术探索——1.1 工程思路与难点

    回到目录 本文主要探讨搭建一款Android平台下美颜相机可能需要填的坑,内容会不断更新.. 相机框架 相机框架相对比较简单,现有的开源代码很多,可以很容易的实现拍照和录像的功能. 预览尺寸选择 预览 ...

最新文章

  1. 今天的 IBM —— 一封来自 IBM 董事长、首席执行官 Arvind Krishna 的公开信
  2. 从零开始入门 K8s| K8s 的应用编排与管理
  3. c语言除法效率问题,【图片】今天写几个性能测试,为什么C语言跑得这么慢呢??【c语言吧】_百度贴吧...
  4. loadrunner controller:实时查看VUser的运行情况
  5. pacman吃豆人_“植物河豚”狗爪豆,你吃过吗?
  6. MySQL8.0.19重置密码
  7. Win10系统Qt安装及配置
  8. A股实时行情接口资源分享
  9. 笔记本显示器根据页面显示亮度自动调节亮度的问题
  10. 对计算机排版的分析,针对计算机排版技术问题的解决措施分析
  11. iOS错误信息记录,不定时补充
  12. 40岁开始学编程,现在成了一名技术主管
  13. 不安装Office操作Excel文件(.xlsx)
  14. ZipFile解压文件
  15. 【蓝桥杯】历届试题 对局匹配(C++)
  16. 张柏芝《影子爱人》曝剧照 亲手设浪漫爱情桥段_0
  17. 论文浏览(27) Long-Term Feature Banks for Detailed Video Understanding
  18. Python - 文件基础操作
  19. httpClient源码如何下载呢?
  20. 微信小程序 python java 校园拼车 打车叫车 失物招领系统

热门文章

  1. 【搞定配色】超实用!帮你快速搞定网页配色的方法(附配色神器)
  2. Oracle相关知识点关键词
  3. Java爬取豆瓣电影数据
  4. linux interfaces文件,Linux /etc/network/interfaces配置接口方法
  5. AuthenticationManager 无法注入
  6. LDS技术在模塑互连器件选择性电镀中的应用
  7. 淮阴工学院计算机课程,2017秋大学计算机(淮阴工学院)
  8. CAD 导入板框技巧
  9. java水印透明_java给透明图片加水印
  10. Android微信刷卡支付开发