首页 > 编程语言 >Java版人脸跟踪三部曲之一:极速体验

Java版人脸跟踪三部曲之一:极速体验

时间:2023-07-06 13:13:04浏览次数:44  
标签:Java java study 欣宸 人脸 javacv 极速

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

关于《Java版人脸跟踪三部曲》系列

-《Java版人脸跟踪三部曲》系列是欣宸的又一原创,目标是通过理论加实战,与大家一同了解CamShift(连续自适应均值漂移)算法在Java领域的实际应用,整个系列由以下三篇文章组成:

  1. 极速体验:这是欣宸原创的一大特色,先动手,用最短时间和最小代价了解CamShift能做什么
  2. 开发设计:这是编码前的准备工作,包含:要做什么?需要那些知识点?逻辑和流程梳理
  3. 编码实战:在本篇咱们正式开始编码并运行验证,经历了前面的充分准备,真正开始编码的时候不但顺畅,您还会迸发有很多与欣宸不一样的想法,例如不仅检测人脸,还能带上年龄性别,却不用多次做深度学习推理,又或者,检测出多个人脸,但是只跟踪某人,甚至多人同时跟踪
  • 另外,整个《Java版人脸跟踪三部曲》系列也是《JavaCV的摄像头实战》系列的一部分,分别是《JavaCV的摄像头实战》系列的的第十五、第十六、第十七篇

本篇概览

  • 本文的目标是快速体验Java版人脸跟踪的功能,不涉及理论知识,不涉及编码,全是动手操作,由以下步骤组成:
  1. 准备本地环境
  2. 下载三个文件:java应用,动态链接库,人脸检测模型文件
  3. 运行java应用,验证效果

准备本地环境

  1. 准备一台可上网的windows系统的电脑,我这里是64位win10
  2. 一个USB摄像头,与电脑连接正常
  3. 安装JDK:1.8.0_291
  • 作为参考,我用的电脑是Surface Pro4,前置摄像头正常

下载文件

  • 一共要下载三个文件,前两个可以在CSDN下载(不需要积分),地址分别是:
  1. 打包成jar的java应用:https://download.csdn.net/download/boling_cavalry/76015782
  2. opencv在windows环境的动态链接库:https://download.csdn.net/download/boling_cavalry/75121158
  1. java应用:C:\study\javacv\simple-grab-push-1.0-SNAPSHOT.jar
  2. 动态链接库:C:\study\javacv\lib\opencv_java453.dll
  3. 模型文件:C:\study\javacv\model\haarcascade_frontalface_alt.xml

运行java应用,验证效果

  • 进入windows命令行,执行以下命令在(注意两个参数和前面下载的文件路径有关,请您根据自己情况调整):
java ^
-Djava.library.path=C:\study\javacv\lib ^
-Dmodel.file.path=C:\study\javacv\model\haarcascade_frontalface_alt.xml ^
-jar C:\study\javacv\simple-grab-push-1.0-SNAPSHOT.jar
  • 此时,控制台会输出以下信息:
C:\Users\12167>java ^-Djava.library.path=C:\study\javacv\lib ^-Dmodel.file.path=C:\study\javacv\model\haarcascade_frontalface_alt.xml ^-jar C:\study\javacv\simple-grab-push-1.0-SNAPSHOT.jar
17:40:54.987 [main] INFO com.bolingcavalry.grabpush.camera.PreviewCameraWithCamShift - 模型文件本地路径:C:\study\javacv\model\haarcascade_frontalface_alt.xml
17:40:57.704 [main] INFO com.bolingcavalry.grabpush.extend.CamShiftDetectService - 开始加载模型文件
17:40:58.364 [main] INFO com.bolingcavalry.grabpush.extend.CamShiftDetectService - 模型文件加载完毕,初始化完成
17:40:58.364 [main] INFO com.bolingcavalry.grabpush.camera.AbstractCameraApplication - 初始化完成,耗时[2257]毫秒,帧率[30.0],图像宽度[1280],图像高度[720]
  • 然后会弹出预览窗口,显示摄像头拍摄到的内容

  • 现在,把那个为了盒饭跑来露脸的群众演员拉到镜头面前,预览窗口中,群众演员的脸部立即出现红框,如下图所示:
    在这里插入图片描述

  • 让群众演员在镜头前移动,可以看到红框会紧随面部移动(截图看不出效果,实际上视频是动态跟随的):
    在这里插入图片描述

  • 让群众演员在摄像头面前消失,红框也随之消失

  • 让群众演员再次回到摄像头面前,红框再次出现并跟随:
    在这里插入图片描述

  • 至此,体验结束,《Java版人脸跟踪三部曲》的第一部就完成了,简简单单三个文件一行命令就完成人脸跟踪的效果,此刻的您一定充满各种疑惑:

  1. 为什么叫跟踪,这是什么原理?
  2. 如果把每一帧都做人脸检测,然后绘制矩形,也能实现同样效果,这两者有区别吗?
  3. 追踪的逻辑是什么,一开始目标如何确定,追踪过程中,如果目标消失在镜头面前,程序如何处理,过一会儿再出现,程序会如何处理?
  • 这些就留待三部曲的第二篇讲清楚吧,算是正式编码前的设计工作,欣宸原创,不会辜负您的期待

欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

标签:Java,java,study,欣宸,人脸,javacv,极速
From: https://www.cnblogs.com/bolingcavalry/p/17531865.html

相关文章

  • 009Java基础之流程控制
    Java基础之流程控制1、用户交互ScannerScanner对象我们之前学的基本语法中并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特性,我们可以通过Scanner类来获取用户的输入。基本语法:Scannersc=newScan......
  • [JAVA]日志管理
    LOGGER.debug("Requesturi:{},headers:{}",signedRequest.getURI(),signedRequest.getAllHeaders());LOGGER.debug("Requestbody:{}",request.getBody());......
  • JavaScript校验地图经纬度是否符合规范
    functionverifylonglat(longitude,latitude){varlongreg=/^(\-|\+)?(((\d|[1-9]\d|1[0-7]\d|0{1,3})\.\d{0,6})|(\d|[1-9]\d|1[0-7]\d|0{1,3})|180\.0{0,6}|180)$/;if(!longreg.test(longitude)){returnnewError('经度,整数部分为0-180小数部分为......
  • Java-基本语法回顾总结[73-84]
    redis与MySQL如何保持数据一致?1.删除redis缓存2.更新MySQL3.删除redis缓存redis的持久化机制两种持久化命令:save:阻塞性持久化,会阻塞redis主进程,直到持久化完成bgsave:非阻塞性持久化,通过新建子线程专门持久化,从而不影响redis主进程手动就是上面两种命令自动就是sa......
  • 【13.0】前端基础JavaScript之JS事件案例
    【13.0】前端基础JavaScript之JS事件案例【一】开关灯示例<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><style>.c1{height:......
  • Java和scala集合互相转换
    使用scala.collection.JavaConverters与Java集合交互。它有一系列的隐式转换,添加了asJava和asScala的转换方法。importscala.collection.JavaConverters._vallist:java.util.List[Int]=List(1,2,3,4).asJavavalbuffer:scala.collection.mutable.Buffer[Int]=lis......
  • java中的类型转换
    类型转换自动类型转换表达式自动类型转换强制类型转换 自动类型转换类型范围小的变量,可以直接赋值给类型范围大的变量。bytea=12;intb=a;System.out.println(b);//12 ......
  • java进阶3:GC 的背景与一般原理
    为什么会有GC其最本质的原因是因为内存资源的稀缺性。我们计算机最核心的资源是CPU和内存,CPU是随着计算机一直存在的东西,核数有限但是一直存在;但内存比较稀缺,A占满了,B就不能用了,我们怎么可以共享使用这个内存呢,这就是GC产生的原因了。背景:在传统的编程语言中,程序员需要手动分配和释......
  • java中的数据分类
     java中有两大类数据类型1引用数据类型2基本数据类型 引用数据类型如(除基本数据类型之外的,如String...)可以通过new关键字在堆内存中创建对象的在栈中引用的,都可以称为引用数据类型基本数据类型(四类八种)基本数据类型通常都在栈中用完就消失掉,也可......
  • Java IO主动同步数据到磁盘方式
    前言通过输出流的write方法可能只是会写到操作系统的缓冲区(pagecache)中,再由操作系统在合适的时机将缓冲区的数据同步到磁盘中。Linux提供了两个函数fsync()、fdatasync()来强制让操作系统将数据同步到磁盘,它们的区别是是否需要同步文件的元数据,如果访问时间,修改时间,文件大小等......