0

首先,简要介绍一下背景知识:我对 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”全局化?如果是这样,我该怎么做,这是正确的做法吗?

谢谢你的帮助!

4

1 回答 1

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
于 2013-03-15T12:01:50.660 回答