美颜相机的实现(利用Webcam)

如何实现美颜相机?
首先,需要导入三个外部jar包来调用摄像头

美颜相机是要调用我们的电脑摄像头实时获取我们的视频数据,视频就是由一帧一帧的图片组成的,所以我们需要先将一张图片如何处理了解明白。

第一步
我们需要打开摄像头,然后创建一个Webcam对象,为此我专门写了一个open方法来打开摄像头

public void open(){Webcam webcam=Webcam.getDefault();webcam.setViewSize(new Dimension(640, 480));wb=webcam;webcam.open();}

第二步
我们采用图片缓冲区BufferedImage来存取摄像头传来的某一帧图片

BufferedImage buffimage =wb.getImage();

为什么采用图片缓冲区来存储图像呢?这里你可以将它看作一个自由的画布,先往这个自由的画布上画上你想画的东西,然后再将这个自由的画布当作一幅画,整个画到窗体上。
当你经常改变要画的东西时,只在图片缓冲区中该变即可,将所有的该变完成后再显视到窗体上,这样窗体上的动画就不会因为一步一步刷新而闪烁了。

第三步(重难点)
就是美颜相机最关键也是最难的一步,如何从图片缓冲区得到图片像素值?

一张图片有长宽,所以用一个二维数组来保存图片所有的像素值。一个RGB占三个字节,一个int型是占四个字节,所以用一个int型二维数组来保存图片像素值。

public int[][] getImagePixel(BufferedImage image){}

由第二步我们得到了一个图片缓冲区,所以调用该方法就可以,那么重点来了,方法体怎么写?
int[][] im=new int[image.getWidth()][image.getHeight()];//新建二维数组,宽高由getWidth()和getHeight()确定
然后遍历二维数组,将缓冲区的每一个像素值传给二维数组相应位置。

     for(int i=0;i<image.getWidth();i++) {for(int j=0;j<image.getHeight();j++) {im[i][j]=image.getRGB(i, j);}   }

很多同学认为我们这就已经完成了,但是并不是这样,这得到的图像是左右颠倒的,白话就是举起右手,图像里左手举起来了,所以我们要将左右交换一下。

     for(int i=0;i<im[0].length;i++) {for(int j=0;j<im.length/2;j++) {int temp=im[j][i];im[j][i]=im[im.length-j-1][i];im[im.length-j-1][i]=temp;}}

这时候才是完成对图像缓冲区中像素点的全部存取,返回一个二维数组,用来进行下一步的图像处理。

第四步
为我们的图片添加特效
我们拿图片底片效果来举个例子,首先传入二维数组。

         public BufferedImage dipian(int[][] im) {BufferedImage bf=null;bf=new BufferedImage(jm.getWidth(),jm.getHeight(),BufferedImage.TYPE_3BYTE_BGR);//**让图片缓冲区的高宽适应我们的Frame框架**for(int i=0;i<im.length;i++) {for(int j=0;j<im[i].length;j++) {Color rgb=new Color(im[i][j]);//**将二维数组存储的像素点转化为Color对象**int a=255-rgb.getRed();//**调用Color对象的getRed()方法**int b=255-rgb.getGreen();int c=255-rgb.getBlue();Color cc=new Color(a,b,c);//**将处理好的红绿蓝三原色赋给新的Color对象**bf.setRGB(i, j, cc.getRGB());//**将Color对象用getRGB()方法将新的RGB赋给图片缓冲区相对应的点**}          }//**拍照(截图)功能,通过ImageIO的write方法写入自己命名的文件**if(btn.equals("拍照")){try {ImageIO.write(bf, "JPG", f);//**f为事先创建好的文件对象,将截图以JPG格式写入文件对象**} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return bf;//**返回处理好的图片缓冲区**}

第五步
输出效果

gr.drawImage(dipian(image), 0, 0, null);//gr为画笔对象,使用drawImage方法将上一步处理好的图片缓冲区画在画布上

效果图


其他的图片处理代码举例:


//**灰度**public BufferedImage grey(int[][] im) {BufferedImage bf=new BufferedImage(jm.getWidth(),jm.getHeight(),BufferedImage.TYPE_3BYTE_BGR);;for(int i=0;i<im.length;i++) {for(int j=0;j<im[i].length;j++) {Color c=new Color(im[i][j]);int r=c.getRed();int g=c.getGreen();int b=c.getBlue();int sum=(int)(r*0.3+g*0.3+b*0.4);Color nc=new Color(sum,sum,sum);bf.setRGB(i, j, nc.getRGB());}}if(btn.equals("拍照")){try {ImageIO.write(bf, "JPG", b);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return bf;}//**马赛克**
public void masaike(Graphics g,int[][] im) {BufferedImage bf=null;bf=new BufferedImage(jm.getWidth(),jm.getHeight(),BufferedImage.TYPE_3BYTE_BGR);Graphics m=bf.getGraphics();for(int i=0;i<im.length;i+=10) {for(int j=0;j<im[i].length;j+=10) {Color c=new Color(im[i][j]);m.setColor(c);m.fillRect(i, j, 10,10);}}if(btn.equals("拍照")){try {ImageIO.write(bf, "JPG", c);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}g.drawImage(bf, 0, 0, null);}

总结与收获

经过近两个星期的学习,让我对于如何处理图片和视频有了全新的认识,学到了图像处理中很多独特的方,知道了Color类和图片缓冲区的用法,其中还涉及到了一些多线程的基础知识,在线程的run()方法中调用了图像处理的各种方法,这样我们得到的就是视频而不是一张张静态图片。感谢老师和小组其他成员的帮助,让我的基础能力也有了巩固和提高,这个项目对我个人意义重大。

美颜相机的设计与实现相关推荐

  1. 深度学习AI美颜系列---AI 发型管家(美颜相机发型管家算法解析)

    美颜相机---AI 发型管家效果的算法解析 ####前言 本文为去年写的Gitchat文章,由于Gitchat有时间版权限制,一年时间,所以今天才能发布到CSDN博客上来. 本文为大家介绍美颜相机中 ...

  2. JAVA PC端美颜相机

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

  3. 基于android的美颜相机瘦脸app

    基于Eclipse ADT开发的一个美颜瘦脸手机APP,能实现一般瘦脸APP的基本功能. 项目具体内容包括: 1.主要包括瘦脸功能模块.瘦脸功能模块实现了美颜瘦脸APP的基本缩小脸颊瘦脸功能.2.后台 ...

  4. 【JAVA】简易美颜相机

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

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

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

  6. 大头贴计算机教程,美颜相机大头贴在哪里 教你怎么弄动漫大头贴

    美颜相机动漫大头贴是新推出的有趣玩法,而Angelababy是本次代言人.通过动漫大头贴功能,用户可以制作出各种有趣的动漫效果,萌萌哒的可爱死了!如果你还不知道美颜相机大头贴在哪怎么弄的话,可以来看看 ...

  7. android自定义美颜相机完整程序,Android OpenGL ES从入门到进阶(一)—— 五分钟开发一款美颜相机...

    源码链接:https://github.com/smzhldr/AGLFramework 一.前言 商店里有数十款的美颜相机类产品,其实现原理基本上都是以OpenGL ES为核心的特效处理,大神可以忽 ...

  8. 美颜相机window 开源_X-Window系统| 免费和开源软件

    美颜相机window 开源 X窗口系统 (The X-Window System) The X-Window System is a GUI that sits over Linux. Not at ...

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

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

最新文章

  1. 『TensorFlow』命令行参数解析
  2. Android sdk manager更新下载缓慢的解决方法
  3. Android 腾讯入门教程( 智能手表UI设计 和 MVC模式 )
  4. 微信小程序code 换取 session_key
  5. 本人真实经历:面试了20家大厂之后,发现这样介绍项目经验,显得项目很牛逼!...
  6. SHELL编程实现批量Netatalk字符集文件名替换
  7. xtrabackup mysql8.0_Percona XtraBackup 8.0, 安装与测试
  8. MySQL for Java的SQL注入测试
  9. 15款顶级开源人工智能工具推荐
  10. 天线多频设计方法精讲
  11. ffplay 分析概述
  12. STAR法则的理解及事例
  13. Notes V11内存不足?
  14. 李峋同款爱心代码!跳动的心,给你爱的人一个惊喜!
  15. Mac系统不能使用网银怎么办?Parallels帮你
  16. 线性密码分析(简单笔记)
  17. lda主题模型的可视化_Gensim LDA主题模型实验
  18. 彻底解决:fake_useragent.errors.FakeUserAgentError: Maximum amount of retries reached
  19. scram-sha1
  20. 深度学习环境配置 和 CP-VTON 复现

热门文章

  1. 用C语言计算超大乘法,C语言中超大整数乘法运算.docx
  2. 皇后宣娇赋采系列:淡化岁月痕迹,赋予肌肤年轻风采
  3. 工业崛起 《Rise of Industry》 Mac版
  4. r5 7600x和r5 5600x差距 锐龙r57600x和5600x对比
  5. 用Givens旋转进行矩阵QR分解
  6. NOIP提高组初赛知识点解析错题本
  7. GIM,输变电工程三维设计技术标准
  8. Thought works培训感悟
  9. 【分享】草稿箱多版本功能设计
  10. hive中的一种假NULL现象