在 iOS 上使用 OpenCV 跟踪检测到的人脸

Posted

技术标签:

【中文标题】在 iOS 上使用 OpenCV 跟踪检测到的人脸【英文标题】:Tracking of detected faces using OpenCV on iOS 【发布时间】:2013-03-12 20:18:43 【问题描述】:

首先,简要介绍一下背景:我对 ios 还很陌生,正在尝试在 iOS 设备上使用 OpenCV 检测人脸。我能够使用此处的示例代码使 iOS openCV 示例代码正常工作:

http://docs.opencv.org/doc/tutorials/ios/video_processing/video_processing.html#opencviosvideoprocessing

这会产生一个有用的方法,该方法会为从相机轮询的每一帧调用:

- (void)processImage:(Mat&)image;

    // Do some OpenCV stuff with the image
    Mat image_copy;
    cvtColor(image, image_copy, CV_BGRA2BGR);

    // invert image
    bitwise_not(image_copy, image_copy);
    cvtColor(image_copy, image, CV_BGR2BGRA);

在此示例中,它成功地反转了来自相机的帧并显示在设备上。这很有用,因为我可以将我赢得的 OpenCV C++ 代码替换到此处,用于我想对帧进行的任何图像处理。

现在,我希望实现面部跟踪。在 OpenCV 2.4.2 及更高版本中,有一个基于检测的跟踪器的头文件,称为“opencv2/contrib/detection_based_tracker.hpp”。它定义了一个名为 DetectionBasedTracker 的类。它定义的跟踪机制在后台使用 haar 级联来检测对象。我希望使用这种时间跟踪方法而不是逐帧人脸检测的原因是跟踪比 OpenCV Haar 实现快得多。这里演示了如何实现它的指南: http://bytesandlogics.wordpress.com/2012/08/23/detectionbasedtracker-opencv-implementation/

我成功地在 android 设备上用 C 语言实现了这段代码。主要代码如下:

DetectionBasedTracker::Parameters param;
param.maxObjectSize = 400;
param.maxTrackLifetime = 20;
param.minDetectionPeriod = 7;
param.minNeighbors = 3;
param.minObjectSize = 20;
param.scaleFactor = 1.1;

// The object needs to be defined using the constructor with the above 
// declared parameter structure. Then the object.run() method is called 
// to initialize the tracking.
DetectionBasedTracker obj = DetectionBasedTracker("haarcascade_frontalface_alt.xml",param);
obj.run();

因此,对于每一帧,我可以使用以下线条对其进行处理以检测人脸的边界框:

obj.process(gray_frame);
vector< Rect_<int> > faces;
obj.getObjects(faces);

现在,问题来了。 在 Objective C 中,如何创建“DetectionBasedTracker obj”对象,以便可以在“- (void)processImage:(Mat&)image;”中使用它方法?我不知道是什么调用了 processImage 方法,所以我现在不知道是否可以通过这种方式。有没有办法使“DetectionBasedTracker obj”全局化?如果是这样,我该怎么做,这是正确的做法吗?

感谢您的帮助!

【问题讨论】:

如果只需要检测人脸可以使用原生Core Image:developer.apple.com/library/mac/#documentation/graphicsimaging/… 为响应干杯!我知道原生核心,但我希望为所有带有前置摄像头的 iOS 设备开发这个应用程序。 Apple 人脸检测在 iPhone 4S 及更高版本上效果很好(它们是硬件加速的),但不幸的是对于 iPhone 4 上的视频来说太慢了:-( 【参考方案1】:

由于您的视图控制器实现是在objective-c++中(它在您的第一个链接上这么说),并且如果您使用Apple LLVM 2.0或更高版本作为编译器,您可以在obj-c++实现文件中的任何地方使用c++代码(扩展名。毫米)。导入你的 c++ 头文件并在那里声明所有类范围的变量,而不是像这样在接口文件中:

#import "ViewController.h"
#import "DetectionBasedTracker.h"


//class extension in your implementation file where your c++ variables go
@interface ViewController()

    DetectionBasedTracker myTracker();

@end

@implementation ViewController 

#pragma mark - Protocol CvVideoCameraDelegate

- (void)processImage:(Mat&)image;

    //...
    myTracker.doSomething();
    //...



@end

【讨论】:

以上是关于在 iOS 上使用 OpenCV 跟踪检测到的人脸的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上使用 OpenCV 检测人脸边缘/形状

Opencv 人脸检测与跟踪

OpenCV 人脸检测 ROI 断言失败

想法如何使用opencv for IOS测量检测到的物体与相机的距离?

dlib库包的介绍与使用,opencv+dlib检测人脸框opencv+dlib进行人脸68关键点检测,opencv+dlib实现人脸识别,dlib进行人脸特征聚类dlib视频目标跟踪

3D物体检测-Opencv