在iOS上使用OpenCV跟踪检测到的面部

时间:2013-03-12 20:18:44

标签: c++ ios objective-c opencv computer-vision

首先,快点背景:我对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&amp;)图像中使用; “方法?我不知道是什么调用processImage方法,所以如果我能以这种方式传递它,我现在不知道。有没有办法让“DetectionBasedTracker obj”全球化?如果是这样,我将如何做到这一点,这是正确的做法吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

由于您的视图控制器实现是在objective-c ++中(它在您的第一个链接上说明了),并且如果您使用编译器Apple LLVM 2.0或更高版本,您可以在obj-c ++实现文件中的任何地方使用c ++代码(扩展名) .mm)。导入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