java实现美颜相机

news/2024/10/31 1:29:17/

看下实现效果

准备工作我们需要导入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;}


http://www.ppmy.cn/news/437099.html

相关文章

三.美颜相机开发

美颜相机开发 UI的使用&#xff1a; JFrame JButton Listener: 加入按钮实现点击什么滤镜特效就绘制什么滤镜&#xff01; 代码&#xff1a; 首先对UI进行编写 public class ImagePad {//使用字符串储存按钮名称String[] strs {"打开", "保存", &q…

flutter美颜相机插件

flutter美颜相机插件 beauty_cam&#xff08;github&#xff09; beauty_cam&#xff08;gitee&#xff09; beauty_cam&#xff08;pub.dev&#xff09; beauty_cam&#xff08;pub.flutter-io.cn&#xff09; flutter美颜相机 目前功能&#xff1a; 开关美颜拍照拍视频切…

JAVA PC端美颜相机

这是我在蓝杰做的第一个项目:PC端美颜相机。这个小程序的本质就是对一张图像做处理。存储在计算机的图像信息实际上是一个个像素点&#xff0c;不同的像素点有不同的rgb值&#xff0c;修改像素点的rgb值我们就可以将图像处理成我们想要的效果。 首先我们需要创建一个图形界面作…

美颜相机-磨皮实现

主要参考了《使用OPENCV简单实现具有肤质保留功能的磨皮增白算法》这篇文章&#xff0c;我使用了python实现&#xff0c;最主要的是直接按原文公式算的话&#xff0c;我这里一直有个问题就是原图中纯色的地方处理后会出现色彩斑点而且非常严重&#xff0c;不知道原作者是否有这…

美颜相机毕设项目零基础教学

美颜相机开发手册 1.数字化图像底层原理 2.文件读取图片&#xff0c;操作图片矩阵 3.图像滤镜算法实现 4.项目结构设计 5.图像存储&#xff0c;附加功能实现&#xff08;画笔/P图/贴纸…&#xff09; 6.卷积图像处理算法实现 7.图像识别原理 8.二维码的生成与识别 9.以…

美颜相机的基本功能实现

美颜相机的基本功能实现 基本知识 在学习了在标准绘制图形库中进行简单的递归图像实现后&#xff0c;我们把目光聚焦到了对于复杂图片文件的处理上&#xff0c;在这里需要简单介绍一下关于图像色彩的知识&#xff0c;以及缓存图片类的介绍。 图形色彩参数“ARGB” 在一个复…

linux 相机软件,镜像相机app

镜像相机app带给用户更多特别的拍摄滤镜和效果&#xff0c;这里提供了两种拍摄方式&#xff0c;一种是普通的拍摄效果&#xff0c;还有一种拍摄出来的是左右镜面对称的效果&#xff0c;并且镜像相机app中随时可以进行图片编辑和美化功能&#xff0c;强大的修图和丰富的滤镜贴纸…

补充 | 美颜相机卡顿trace分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、美颜相机录制视频 trace 分析概览二、Camera FWK 与 camera HAL 录像交互三、美颜相机app 与SurfaceFlinger 交互四、美颜相机卡顿丢帧trace 分析 …