CIDetectorTracking 正确使用方法

苹果最近添加到新的常量 CIDetector 类称为 CIDetectorTracking 的出现,以便能够在视频帧之间跟踪的面孔。如果我能设法弄清楚它是如何工作,这会是非常有益的我...

我试过将此项添加到选项字典使用我能想到的每个对象是远程有关包括我的 AVCaptureStillImageOutput 实例,我的工作,UIImage 的探测器 1,等等。

NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyHigh, CIDetectorAccuracy,myAVCaptureStillImageOutput,CIDetectorTracking, nil];

但不管什么我尝试传递的参数,它要么崩溃 (很明显我猜它在这里) 或调试器输出:

指定了未知的 CIDetectorTracking。忽略。

通常情况下,我不会猜测在此,但关于这一主题的资源是几乎不存在。苹果公司的类引用国家:

密钥被用来启用或禁用跟踪的探测器的脸。当你想要跨帧在视频跟踪的面孔时,请使用此选项。

除了可用性正在 iOS 6 + 和 OS X 10.8+ 就是这样。

里面的评论 CIDetector.h :

/ * 应使用用于指定跟踪该功能的选项字典中的键。*/

如果还不够糟糕,在谷歌上搜索提供 7 结果 (8 时他们发现这篇文章) 所有这些都是苹果类引用,API 差异,询问如何实现这一目标在 iOS 5,第三方的或副本前的等职位。

这样说,任何提示或正确使用方法的提示 CIDetectorTracking 将不胜感激 !

解决方法 1:

你说得对,这把钥匙没有很好记录。在旁边也是 API 文档中没有解释:

尝试了不同的值 CIDetectorTracking 和所接受的唯一值,似乎是 @(YES) 和 @(NO) 。与其他值打印在控制台中的此消息:

指定了未知的 CIDetectorTracking。忽略。

当您将值设置为 @(YES) 你应该得到跟踪 id 与检测到的面部特征。



然而当你想要检测的面孔中从相机捕获的内容,您应该更喜欢在 AVFoundation 中的人脸检测的 API。它有内置的脸跟踪和人脸检测在后台发生的 gpu 和将会远远超过 CoreImage 人脸检测它需要 iOS 6 和至少一个 iPhone 4S 或 iPad 2。

脸上作为元数据对象发送 ( AVMetadataFaceObject ) 到 AVCaptureMetadataOutputObjectsDelegate 。

你可以使用这段代码 (取自StacheCam 2和上面提到的 wwdc 大会会议的幻灯片) 安装人脸检测和获取元数据对象的脸:

- (void) setupAVFoundationFaceDetection{           self.metadataOutput = [AVCaptureMetadataOutput new];    if ( ! [self.session canAddOutput:self.metadataOutput] ) {        return;    }

    // Metadata processing will be fast, and mostly updating UI which should be done on the main thread    // So just use the main dispatch queue instead of creating a separate one    // (compare this to the expensive CoreImage face detection, done on a separate queue)    [self.metadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];    [self.session addOutput:self.metadataOutput];

    if ( ! [self.metadataOutput.availableMetadataObjectTypes containsObject:AVMetadataObjectTypeFace] ) {        // face detection isn‘t supported (via AV Foundation), fall back to CoreImage        return;    }

    // We only want faces, if we don‘t set this we would detect everything available    // (some objects may be expensive to detect, so best form is to select only what you need)    self.metadataOutput.metadataObjectTypes = @[ AVMetadataObjectTypeFace ];

}

// AVCaptureMetadataOutputObjectsDelegate- (void)captureOutput:(AVCaptureOutput *)captureOutput         didOutputMetadataObjects:(NSArray *)metadataObjects         fromConnection:(AVCaptureConnection *)c{   for ( AVMetadataObject *object in metadataObjects ) {     if ( [[object type] isEqual:AVMetadataObjectTypeFace] ) {      AVMetadataFaceObject* face = (AVMetadataFaceObject*)object;      CMTime timestamp = [face time];      CGRect faceRectangle = [face bounds];      NSInteger faceID = [face faceID];      CGFloat rollAngle = [face rollAngle];      CGFloat yawAngle = [face yawAngle];      NSNumber* faceID = @(face.faceID); // use this id for tracking      // Do interesting things with this face     }}

如果您想要在你需要转换的脸对象的预览图层中显示的脸帧:

AVMetadataFaceObject * adjusted = (AVMetadataFaceObject*)[self.previewLayer transformedMetadataObjectForMetadataObject:face];
时间: 2024-11-05 18:32:45

CIDetectorTracking 正确使用方法的相关文章

SQL Server附加数据库出现错误5123的正确解决方法

SQL Server附加数据库出现错误5123的正确解决方法 因为自己有一本基于SQL Server 2005的数据库教程,里边使用的示例数据库是AdventureWorks for SQL Server 2005,而我的机子上装的是SQL Server 2008,示例数据库是AdventureWorks for SQL Server 2008.起初我以为示例数据库AdventureWorks for SQL Server 2005 与AdventureWorks for SQL Server

AspectJ学习笔记2-Eclipse中AspectJ插件AJDT的正确安装方法

接着之前一篇日志.这个事情也挺无语的,简单记录一下. 在这里:http://www.eclipse.org/ajdt/ 可以下载最新的Eclipse Plugin,下载解压之后,一般来说,直接把解压后文件夹下的features和plugins放到Eclipse的文件夹下就行了.不过我这样做以后,启动Eclipse,发现没什么作用.才参考网上有人介绍的第二种方法,也就是Help--Install New Software--Add--Local这种方式选择刚才的解压文件夹,但是这样操作以后会报像下

windows server 2008 R2 的 FTP 防火墙的正确配置方法

存在问题 FTP搭建完成后,仅本机可以访问,其他机器无法访问. 解决方案 这时,将C:\Windows\System32\svchost.exe添加到例外即可正常访问,如下图所示.将20及21端口添加至高级防火墙中可能也能正常访问.但这并不是正确的方法,正确的方法是:无需单独配置防火墙,直接重新启动计算机即可. 参考资料 http://www.cnblogs.com/dennlu/archive/2012/06/04/2534925.html http://zhcxl.blog.51cto.co

回收站的正确使用方法

  一. 用法 以前都是直接忽视回收站的,删东西的时候都会按住Shift.但是人在网上飘,哪能不挨刀,难免有手抖的时候.但是后来还是嫌清空回收站麻烦,基本还是直接删除的.   后来我听说某公司准备了七个垃圾桶(放废弃文件的),每天收一个.所以不要的文件还会在垃圾桶里呆一个星期才会被清理走.这样的话不但减少了文件找不回的可能,扔那一个星期再不要的话说明也确实该扔了.同时也让员工在扔文件时更果断--反正一个星期后才会被清走.   所以我觉得咱电脑的回收站也该这么用: 删文件时删进垃圾桶 删的时候果断

Javascript 正确使用方法 二

好的,废话不多说,接着上篇来. 变量(variables) 始终使用 var 关键字来定义变量,如果不这样将会导致 变量全局化,造成污染. //bad superPower = new SuperPower(); //good var superPower = new SuperPower(); 使用 一个 var关键字来定义多个变量...并且每个变量一行.. // bad var items = getItems(); var goSportsTeam = true; var dragonba

Linux重启inotify配置max_user_watches无效被恢复默认值8192的正确修改方法

Linux下Rsync+inotify-tools实现数据实时同步中有一个重要的配置就是设置Inotify的max_user_watches值,如果不设置,当遇到大量文件的时候就会出现出错的情况. 一般网上修改方法就是直接修改文件: /proc/sys/fs/inotify/max_user_watches 或者修改方法: sysctl -w fs.inotify.max_user_watches="99999999" 但是这些修改后,Linux系统重启inotify配置max_use

Flexbox 布局的正确使用方法

Flexbox 布局的正确使用方法 在项目中,我们还会大量使用到flexbox的新旧属性,但大多数人一般只会写新属性,旧属性交由autoprefixer处理,但其实完成同样功能的新旧属性表现形式却不尽相同.还有部分人只使用"万能"的flex:number属性为伸缩项目分配空间,但有些特殊情景却无法满足,此文为此梳理了flexbox的新旧属性区别和分配空间的原理,为大家用flexbox布局的项目通通渠. Flexbox兼容性 PC端的兼容性 移动端的兼容性 如上图,为了兼容IE10-11

thinkphp3.2 cli模式的正确使用方法

最近要使用thinkphp3.2版本的cli模式,手动执的话没有问题,比如php /www/index.php home/article/get 这样没有问题,但是一般用cli模式都是定时任务比较多,这个时候写到定时任务的时候,比如 0 * * * * * php /www/index.php home/article/get 这样就会出现引入ThinkPHP.php失败的问题,这个问题算是比较容易解决的,但是后来还有其他各种报错,经过查看相关核心代码,终于找到无需修改代码,就可以轻易使用cli

Javascript 正确使用方法

今天在github 上面找到了一个关于如何正确使用javascript 来进行我们的程序开发.我就恬不知耻的来了个原创啊..坑爹啊.拿来和大家分享一下吧. A mostly reasonable approach to Javascript. Types //类型 Objects //对象 Arrays //数组 Strings //字符串 Functions //函数 Properties //属性 Variables //变量 Hoisting //变量提升 Conditional Expr