我正在开发iOS应用程序,使用OpenCV从相机实时检测Faces。
在iOS 7设备上,它没有任何问题。然而,在iOS 8设备上,它开始检测(或试图检测)面部,并且在4-5秒后FPS从30FPS减少到20FPS(在iPhone 6的情况下,其他设备改变FPS)。
我正在使用:
CvVideoCamera
从相机中获取每一帧。Cascade Classifier
进行面部检测。我的VieController.mm
具有以下代码来设置相机并处理图像以进行面部检测。
- (void)viewDidLoad {
[super viewDidLoad];
//Init camera and configuration
self.videoCamera = [[CvVideoCamera alloc] initWithParentView:self.imageVideoView];
self.videoCamera.delegate = self;
self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionFront;
self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPresetMedium;
self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
self.videoCamera.defaultFPS = 30;
self.videoCamera.grayscaleMode = NO;
//Load Cascade Model for Face Detection
NSString* cascadeModel = [[NSBundle mainBundle] pathForResource:@"haarcascade_frontalface_alt2" ofType:@"xml"];
const char* cascadeModel_path = [cascadeModel fileSystemRepresentation];
if(face_cascade.load(cascadeModel_path)){
cascadeLoad = true;
}else{
cascadeLoad = false;
}
//Start camera
[self.videoCamera start];
// Init frames to 0 and start timer to refresh the frames each second
totalFrames = 0;
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(computeFPS) userInfo:nil repeats:YES];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void) processImage:(Mat&)image {
try{
if(cascadeLoad && !image.empty()){
// Opencv Face Detection
cv::Mat frameH;
pyrDown(image, frameH);
face_cascade.detectMultiScale(frameH, faces, 1.2, 2, 0, cv::Size(50, 50));
//Draw an ellipse on each detected Face
for( size_t i = 0; i < faces.size(); i++ )
{
cv::Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 );
ellipse( image, center, cv::Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 );
}
}
} catch (cv::Exception e) {
NSLog(@"CV EXCEPTION!");
}
//Add one frame
totalFrames++;
}
//Function called every second to update the frames and update the FPS label
- (void) computeFPS {
[self.lblFPS setText:[NSString stringWithFormat:@"%d fps", totalFrames]];
totalFrames = 0;
}
那是我的所有代码。
使用以下测试项目,图像看不到肖像(我还没弄清楚为什么)。但是降低FPS的问题正在发生。 如果您想测试它,我的完整测试项目的链接是here。
有没有人遇到这个问题?知道可能发生的事情或我做错了什么吗?
非常感谢!
PS:我还读过iOS的其他面部探测器,如CIDetector
,但是我正在使用OpenCV,因为我想在OpenCV中使用面部进行更多处理。