First, a quick bit of background: I am fairly new to iOS and am attempting to detect faces using OpenCV on an iOS device. I was able to get the iOS openCV sample code working fine using the sample code here:
http://docs.opencv.org/doc/tutorials/ios/video_processing/video_processing.html#opencviosvideoprocessing
This results in a useful method that is called for each frame polled from the camera:
- (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);
}
In this example, it successfully inverted the frame from the camera and displays on the device. This is useful, as I can subsitute my won OpenCV C++ code into here for whatever image processing I want to do with the frame.
Now, I wish to get face tracking implemented. There are header files for a detection based tracker in OpenCV 2.4.2 onwards called “opencv2/contrib/detection_based_tracker.hpp”. It defines a class called DetectionBasedTracker. The tracking mechanism it defines uses haar cascades in the background to detect objects. The reason that I wish to use this temporal tracking method rather than frame by frame face detection is that the tracking is much faster than the OpenCV Haar implementation. A guide on how to implement it is demonstrated here: http://bytesandlogics.wordpress.com/2012/08/23/detectionbasedtracker-opencv-implementation/
I had success in implementing this code in C++ on an Android device. The main code is as follows:
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();
And so, for each frame, I can process it to detect the bounding boxes of faces using the lines:
obj.process(gray_frame);
vector< Rect_<int> > faces;
obj.getObjects(faces);
Now, the issue. In Objective C, how to I create the "DetectionBasedTracker obj" object so that it can be used in the - (void)processImage:(Mat&)image;
method? I do not know what calls the processImage method so I do not now if I can pass it that way. Is there a way to make the "DetectionBasedTracker obj" global? and if so, how would I do that, and is this the correct way of doing it?
Thanks for your help!