1. 基础知识:委托与事件

委托事件相关的知识 学习了大佬的文章:https://www.cnblogs.com/SkySoot/archive/2012/04/05/2433639.html
讲的很清楚

ARFaceManager负责检测人脸,与大佬的实例中的GreetingManager类似。

简单的委托使用案例(委托是为了解决类似方法的变量):

using System;namespace TestForEventsas
{class Program{public class GreetingManager{//委托是为了解决类似方法的变量,因此格式是与所需要绑定的方法类似的//这里也就是EnglishGreeting/ChineseGreetingpublic delegate void GreetingDelegate(string name);public void Greetpeople(string name,GreetingDelegate MakeGreeting){//GreetingDelegate相当于参数为方法的变量//那么我们就可以将  哪种语言打招呼  作为参数传入MakeGreeting(name);//这里就是委托的方法真正打招呼了}}private static void EnglishGreeting(string name){Console.WriteLine("Good Morning," + name);}private static void ChineseGreeting(string name){Console.WriteLine("早上好," + name);}static void Main(string[] args){GreetingManager gm = new GreetingManager();//传入中文打招呼的方法   进行打招呼 gm.Greetpeople("jcy", ChineseGreeting);//传入英文打招呼的方法   进行打招呼gm.Greetpeople("jcy", EnglishGreeting);}}
}

当然我们知道委托有个特性:当多个方法绑定到同一个委托变量,当调用此变量,可以依次调用所有绑定的方法
于是如果我们如果用不同语言向一个人打招呼时,代码可以这样改:

using System;namespace TestForEventsas
{class Program{public class GreetingManager{//委托是为了解决类似方法的变量,因此格式是与所需要绑定的方法类似的//这里也就是EnglishGreeting/ChineseGreetingpublic delegate void GreetingDelegate(string name);//由于是依次调用所有的绑定方法,我们就不用向Greetpeople函数中一个个传方法的参数了public GreetingDelegate MakeGreeting; public void Greetpeople(string name){if (MakeGreeting != null)// 如果有方法注册委托变量{MakeGreeting(name);//通过委托调用方法}}}private static void EnglishGreeting(string name){Console.WriteLine("Good Morning," + name);}private static void ChineseGreeting(string name){Console.WriteLine("早上好," + name);}static void Main(string[] args){GreetingManager gm = new GreetingManager();//这里我们使用委托的特性,当多个方法绑定时,调用委托,会依次调用每一个绑定在上的方法//这里我们需要做的就是注册方法gm.MakeGreeting += ChineseGreeting;gm.MakeGreeting += EnglishGreeting;gm.Greetpeople("jcy");}}
}

而事件是为了更好的封装。

Event 出场,它封装了委托类型的变量,使得:在类的内部,不管你声明它是public还是protected,它总是private 的。在类的外部,注册“+=”和注销“-=”的访问限定符与你在声明事件时使用的访问符相同。

具体为什么用Event原因看大佬的解释。

MakeGreet 事件的声明与之前委托变量 delegate1 的声明唯一的区别是多了一个 event 关键字。看到这里,在结合上面的讲解,你应该明白到:事件其实没什么不好理解的,声明一个事件不过类似于声明一个进行了封装的委托类型的变量而已。

修改代码如下:

using System;namespace TestForEventsas
{class Program{public class GreetingManager{//委托是为了解决类似方法的变量,因此格式是与所需要绑定的方法类似的//这里也就是EnglishGreeting/ChineseGreetingpublic delegate void GreetingDelegate(string name);//由于是依次调用所有的绑定方法,我们就不用向Greetpeople函数中一个个传方法的参数了public GreetingDelegate MakeGreetingEventHandler;//这里增加了规范性,委托一般为事件名后加上EventHandler//事件与委托的声明也同样相似,只是增加了event的关键词而已public event GreetingDelegate MakeGreeting;public void Greetpeople(string name){/*if (MakeGreetingEventHandler != null)// 如果有方法注册委托变量{MakeGreetingEventHandler(name);//通过委托调用方法}*///方法类似if (MakeGreeting != null)// 如果有方法注册委托变量{MakeGreeting(name);//通过委托调用方法}}}private static void EnglishGreeting(string name){Console.WriteLine("Good Morning," + name);}private static void ChineseGreeting(string name){Console.WriteLine("早上好," + name);}static void Main(string[] args){GreetingManager gm = new GreetingManager();//这里我们使用委托的特性,当多个方法绑定时,调用委托,会依次调用每一个绑定在上的方法//这里我们需要做的就是注册方法gm.MakeGreeting += ChineseGreeting;gm.MakeGreeting += EnglishGreeting;gm.Greetpeople("jcy");}}
}

2. 人脸检测的流程

首先是AR Face Manager 里的OnTrackablesChanged以及facesChanged事件

自己的C#脚本里的自定义函数OnFaceChanged函数订阅 AR Face Manager 的facesChanged事件。

ARFacesChangedEventArgs则为AR Face Manager检测存储的变化信息,主要内容为三个存储AR Face的数组added/updated/removed

大概的流程如下:

当人脸进入屏幕的瞬间,ARFaceManager检测到了人脸,并且自动帮我们创建了一个物体ARFace,并且放置到了added数组里。因而added的Count数量为1。
然后ARFaceManager不断调用OnTrackablesChanged函数。
当我们给时间faceChanged注册方法后,faceChanged不为空,从而调用我们自己定义的方法OnFaceChanged,同时将ARFaceManager检测到的人脸变化情况保存到 ARFacesChangedEventArgs 类当中,并且作为我们注册的自定义函数的参数,因此在OnFaceChanged函数中我们可以使用检测到的人脸变化。

人脸进入后,added里生成的ARFace立马转存到了updated数组当中。
此后人脸在不移开屏幕下,updated数组容量一直为1。

人脸离开的屏幕的一瞬间,此时updated数量为0,而removed数量变为1。
并且只有在人脸重新进入时,removed变为0,added数量变为1,然后立马变为0,接着updated变为1.

说明:我的人脸检测最大值为1,同时只检测一张人脸


当我们移除人脸时,依然可以调用removed里的ARFace

因此只有新的人脸进入后,之前的ARFace才会被销毁。

我们也可以从系统提供的AR Default Face找到

具体内容,可以从AR Face 代码组件中看。

实际上,ARFaceManager只负责检测变化信息,而检测到的人脸信息则是由AR Default Face里的AR Face代码组件更新。

因此,ARFaceManager 只生成了一张人脸,只负责检测的情况,比如是新添加的,还是一直在屏幕里的,还是从屏幕中移除的,给出位置坐标。
当一直处在屏幕里后,由ARFace自己不断地调用,更新自己的信息,比如脸上的顶点啥的。

[AR Foundation] 人脸检测的流程相关推荐

  1. 一文综述人脸检测算法(附资源)

    文章来源:SIGAI 本文共9400字,建议阅读10+分钟. 本文将和大家一起回顾人脸检测算法的整个发展历史. [导读] 人脸检测是目前所有目标检测子方向中被研究的最充分的问题之一,它在安防监控,人证 ...

  2. AdaBoost人脸检测原理

    AdaBoost人脸检测原理 FROM:http://blog.sina.com.cn/s/blog_4e6680090100d2se.html 对人脸检测的研究最初可以追溯到 20 世纪 70 年代 ...

  3. haar adaboost matlab,人脸检测算法之Haar-Adaboost分类器原理

    首先,说几点: 1.人脸检测就是在一幅图片中检测出有无人脸,人脸在图片中的哪块区域.通常人脸检测完了之后就交给人脸识别,具体识别是谁. 2.Haar-Adaboost进行人脸检测的流程如下: a,收集 ...

  4. 人脸检测和人脸识别的基础知识

    1. 人脸识别和人脸检测概念 人脸识别(Face Recognition)是基于人的脸部特征信息进行身份识别的一种生物识别技术.说简单点,人脸识别解决"这是谁的脸"问题. 人脸检测 ...

  5. 人脸检测:人脸检测算法综述

    https://blog.csdn.net/SIGAI_CSDN/article/details/80751476 问题描述 人脸检测的目标是找出图像中所有的人脸对应的位置,算法的输出是人脸外接矩形在 ...

  6. 一种用于人脸检测的设备上的深度神经网络

    欢迎大家前往云加社区,获取更多腾讯海量技术实践干货哦~ 译者:QiqiHe 苹果公司开始在iOS 10中使用深度学习进行人脸检测.随着Vision框架的发布,开发人员现在可以在他们的应用程序中使用这种 ...

  7. 机器学习与人脸识别3:人脸检测算法综述

    以下内容转自网络,主要介绍人脸算法的历史: 导言 人脸检测是目前所有目标检测子方向中被研究的最充分的问题之一,它在安防监控,人证比对,人机交互,社交和娱乐等方面有很强的应用价值,也是整个人脸识别算法的 ...

  8. 人脸检测:传统到深度学习方法汇总

    虽然人脸的结构是确定的,由眉毛.眼睛.鼻子和嘴等部位组成,近似是一个刚体,但由于姿态和表情的变化,不同人的外观差异,光照,遮挡的影响,准确的检测处于各种条件下的人脸是一件相对困难的事情. 人脸检测算法 ...

  9. OpenCV神技——人脸检测,猫脸检测

    简介   OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 ...

最新文章

  1. Android系统语言默认设置为简体中文
  2. OpenCV非真实感渲染的实例(附完整代码)
  3. linux同步IO: sync、fsync与fdatasync
  4. 设计: 未来Web设计的7大趋势
  5. SpringBoot集成Actuator监控管理
  6. 【8.0、9.0c】树形列表 列标题 不对齐的问题及解决方案
  7. java window.onload_JavaScript window.onload
  8. 新手必看,物联网卡常见的三大问题!
  9. 实施工程师面试基本问题
  10. java 连接 timesten_极简Java连接TimesTen程序
  11. Python提取PDF中的图片
  12. linux 配置局域网内部www服务器,局域网内部邮件服务器搭建方法
  13. iOS 系统视频播放器简单介绍
  14. android 7zip,7zip手机版
  15. Docker 映射端口telnet不通
  16. 跨境电商平台哪个好?——扬帆际海
  17. mac电脑最好用的图片浏览器,没有之一
  18. 工作方式需要主心骨、承载人
  19. 第三届“SLAM技术及应用”暑期学校日程安排
  20. Preserve log和Disablecache是干什么的

热门文章

  1. 莫烦 python_5.1 莫烦 Python Classification 分类学习
  2. linux 查杀其他用户进程,linux如和对其他用户隐藏进程?
  3. 多视图点云配准算法综述
  4. 【张量分解(一)】符号与基础知识
  5. 创建单元测试-编写测试用例 and执行测试用例
  6. 【HTML5系列教程】
  7. greensock下载_GreenSock MorphSVGPlugin
  8. 网管随笔04--【MADC的另类安装与SQL的完全卸载】
  9. 【ubuntu】Ubuntu中Android NDK下载跟配置
  10. 科学家研发出新型金属有机框架材料,不仅能滤海水中的盐还可提取金属离子...