首先,简要介绍一下背景知识:我对 iOS 还很陌生,正在尝试在 iOS 设备上使用 OpenCV 检测人脸。我能够使用此处的示例代码使 iOS openCV 示例代码正常工作:
这会产生一个有用的方法,该方法为从相机轮询的每一帧调用:
- (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”全局化?如果是这样,我该怎么做,这是正确的做法吗?
谢谢你的帮助!