寒假期间,一起做了一款pc端的美颜相机,在交流会期间,看到有的同学做了一些非常牛的功能添加,心血来潮,想整个视频运动追踪识别,在这和大家分析一下算法思路

1、原理很简单,就是在视频中的物体,就可以通过得到前后两张图片提供的二维数组之差,当两者之前的差值超过一个数,前后相差过大的时候,我们通过画笔去把他画出来,就可以得到我们想要的结果。

2、之前第一步遇到的问题,就是如何得到第一张图的数据,并且去和第二张图进行对比,在这里的话,我的思路是用一个数组去存储通过摄像头获取到底第一张图片,并且通过BufferedImage来缓存图片,然后重新定义一个数组缓存第二张图片的数据,就可以进行处理后的数据啦

3、代码如下(菜单栏的一些功能代码尚未给出,这里仅仅给出运动追踪识别的代码)

a.窗体界面

public class CameraUI {public void draw(){JFrame jFrame=new JFrame();jFrame.setTitle("视频运动追踪识别");jFrame.setSize(800,900);jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jFrame.setLocationRelativeTo(null);BorderLayout borderLayout=new BorderLayout();jFrame.setLayout(borderLayout);JPanel cennter=new JPanel();cennter.setBackground(Color.cyan);jFrame.add(cennter,BorderLayout.CENTER);//菜单栏以及相关功能的实现//开始定义菜单,菜单栏以及相关按钮JMenuBar jMenuBar=new JMenuBar();jFrame.add(jMenuBar,BorderLayout.NORTH);//监听器的设置CameraMouse cameraMouse=new CameraMouse();//定义在菜单栏中的菜单选项String[]name1={"运动追踪","视频","图片","拍照","特殊滤镜","编辑","帮助"};//开辟一个menu数组来存储调用与添加JMenu[]menu=new JMenu[name1.length];for (int i=0;i< name1.length;i++) {JMenu jMenu = new JMenu(name1[i]);menu[i]=jMenu;jMenuBar.add(jMenu);}//子菜单中的菜单选项String[]name={"打开","关闭","退出"};for (int i=0;i<name.length;i++) {JMenuItem jMenuItem = new JMenuItem(name[i]);jMenuItem.addActionListener(cameraMouse);menu[0].add(jMenuItem);}//可视一定要在画笔前jFrame.setVisible(true);cameraMouse.graphicsmouse=cennter.getGraphics();}public static void main(String[] args) {CameraUI cameraUI=new CameraUI();cameraUI.draw();}
}

b.监听器以及线程控制

public class CameraMouse implements ActionListener {//获取点击按钮的名字public String name;//获取画笔public Graphics graphicsmouse;//创造线程的对象进行调用public CameraThread cameraThread;public void actionPerformed(ActionEvent e){String name=e.getActionCommand();System.out.println("正在点击的操作是:"+name);if ("打开".equals(name)){if (cameraThread==null){cameraThread=new CameraThread(graphicsmouse);//开始启动线程cameraThread.start();}}else if ("关闭".equals(name)){cameraThread.flag=false;}}
}

c.运动追踪方法实现以及相关线程代码

public class CameraThread extends Thread{//开关控制线程public boolean flag=true;//画笔初始化public Graphics graphicsthread;//方法构造传送画笔public CameraThread(Graphics graphicsthread){this.graphicsthread=graphicsthread;}//线程的书写和使用public void run(){//摄像头的调动Webcam webcam=Webcam.getDefault();webcam.open();System.out.println("启动线程.."+this.getName());//利用while循环来使用线程,线程只能运行一次,结束后的线程不能重新调用while (flag) {//获取摄像头拍到的数据BufferedImage bufferedImage1 = webcam.getImage();//用数组存储下来,获取第一张图片int[][]pixel1Arr=getImagePixel(bufferedImage1);//创建缓冲图片BufferedImage buffer=new BufferedImage(bufferedImage1.getWidth(),bufferedImage1.getHeight(),BufferedImage.TYPE_INT_BGR);//获取缓存区的画笔Graphics grabuffer=buffer.getGraphics();//获取摄像头拍到的数据,重新获取BufferedImage bufferedImage2 = webcam.getImage();//用数组存储下来,存储的目的就是与第一张已经缓存下来的图片做对比,int[][]pixel2Arr=getImagePixel(bufferedImage2);//遍历第二张图片的数组for (int i=0;i<pixel2Arr.length;i++){for (int j=0;j<pixel2Arr[0].length;j++){//第二张图片的像素int pixel2=pixel2Arr[i][j];if ((null!=pixel2Arr)){// 转成Color对象,设置给画笔,画出像素点Color rc=new Color(pixel2);Color pixel1=new Color(pixel1Arr[i][j]);//前后相互比较,这里是取的G值做的差int diff=Math.abs(rc.getGreen()- pixel1.getGreen());if ((diff)>30) {grabuffer.setColor(Color.white);grabuffer.fillOval(i, j, 2, 2);} else if (diff<30) {grabuffer.setColor(Color.black);grabuffer.fillOval(i, j, 2, 2);}}}}//把拍到的数据画出来graphicsthread.drawImage(buffer, 100, 100,600,600, null);}System.out.println("结束线程");}//数据存储public int[][] getImagePixel(BufferedImage buffImage) {int w = buffImage.getWidth();int h = buffImage.getHeight();int[][] pixelArr = new int[w][h];// 获取图片中的每一个像素值保存到二维数组中for (int i = 0; i < w; i++) {for (int j = 0; j < h; j++) {int pixel = buffImage.getRGB(i, j);pixelArr[i][j] = pixel;}}return pixelArr;}
}

4.视频效果图不方便截图,感兴趣的小伙伴来call我

小浩浅谈利用Java做一个视频运动追踪识别相关推荐

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

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

  2. SAP License:浅谈利用借贷做销售业务调整处理

    浅谈利用借贷做销售业务调整处理 借贷项订单主要是用来对不能手工过帐的会计科目进行小差异的调整或者作为专门用途来调整相关的科目金额.是订单的一种,只是与标准的订单类型.字段状态不同而已.在实际作业中可以 ...

  3. 小浩浅谈如何为图片提供滤镜功能

    近些天,一直想做一个pc版的美颜相机,但是万事开头总要有第一步,首先就是美颜相机的添加滤镜问题,直接上手视频未免过于着急,于是就想先对单张图片来实现滤镜功能的添加. 1.第一步,就是窗体和面板的创立, ...

  4. 小浩浅谈Java三特性(封装,继承,多态)

    1.封装,什么是封装,谈谈自己对封装的理解,封装就是将类的信息(比如说类的属性)隐藏在类的内部,不允许外部程序直接访问.此时就要提到一个关键字private,他是一个权限修饰符,可以用来修饰成员(变量 ...

  5. 小浩浅谈之在Java中摄像头的使用

    在春节前夕,在陈哥的指导下,完成了美颜相机中一些滤镜效果的添加,但是之前滤镜效果的使用都是基于单独的图片,而我们的视频也是由一帧一帧的图片构成,所以我们在想完成美颜相机的情况下,首先要学会的是如何获取 ...

  6. 利用java做一个简单的计算器

    共两个类.还只是完成+.-.×.÷运算而已. GUI只是用了AWT,很简单,相信一看就能懂了. Calculator.java public class Calculator{ private Str ...

  7. 小浩浅谈 程序/进程/线程,并行/并发

    1.程序,随着时代和社会的发展,我们开始学习各种各样的计算机语言,开始离不开编程,但是我们需要了解的是,什么是程序?程序代表什么?以及程序的作用?以及我们编程,编写程序是为了干嘛? 在这,我认为程序指 ...

  8. 利用pgzero做一个接球的小游戏

    利用pgzero做一个接球的小游戏 说明 pgzero为python的一个用于游戏制作的库,它基于pygame模块 可用如下命令去安装 pip install pygame pip install p ...

  9. 利用Python做一个简单的对战小游戏

    利用Python做一个简单的文字对战小游戏 一.游戏介绍 1.大体介绍:文字版的对战小游戏,可以利用Python随机生成两个角色,角色带有各自的血量和攻击值两个指标.两人在对战时同时攻击对方,同时造成 ...

最新文章

  1. 【建模必备】遗传算法的基本原理与步骤(选择)
  2. html怎样设置字体不能被选中,css设置:图片文字等不能被选择
  3. linux mysql 不稳定_Linux服务器mysql数据库自动停止的解决方法 | 很文博客
  4. java实现js取反_特定位取反(js实现)
  5. 【转】学会这13个原则写UI界面文案,用户才能秒懂
  6. 客户机和服务器在s7通信中各有什么作用,哪些通信口可以进行 Modbus TCP 通讯,作为 Modbus 服务器的 SIMATIC S7 CPU 可以...
  7. 一篇博客读懂设计模式之---单例模式
  8. openresty之http
  9. b站用户画像2020_2020年抖音用户画像专栏报告(上)
  10. paip.远程服务器返回错误 (417) Expectation Failed 的解决办法
  11. 不同平台安装python的方式一样吗_Python软件的正确安装方式
  12. LSB图像隐写和峰值信噪比计算的python实现
  13. paraview热流图(5):只保留一个网格
  14. GH4169高温合金执行什么标准
  15. 第七章 变量进阶与点阵LED 练习题
  16. 如何搭建一个网站,访问量一天几千人如何购买服务器?...
  17. WIN7下Virtualbox虚拟Ubuntu共享文件夹设置
  18. 圆桌对话:机器学习的商业应用,创业公司并非没有机会 | CCF-GAIR 2017
  19. 【MySQL】黑马教程MySQL数据库 MySQL基础(一)
  20. 关于safiry开启无痕浏览时本地存储的处理

热门文章

  1. react插入html
  2. 51nod 1526 分配笔名(Trie树+贪心)
  3. 支付退款 报错:ACQ.INVALID_PARAMETER
  4. android刷机之官方ROM提取rom.zip
  5. linux--welcome to emergency mode
  6. 【金山训练营】应届C++客户端开发春招(已offer)面经
  7. 币圈大佬李笑来教Python,这碗“硬核鸡汤”你干不干?
  8. (转)再思人机智能融合
  9. 转载一篇文章-这七句话被中国人误传了数千年
  10. 中国“芯”崛起 安防产业链格局是否将改变?