使用OpenCV的iOS 8中的人脸检测在几秒钟后变慢

时间:2015-02-04 23:10:28

标签: opencv ios8 face-detection

我正在开发iOS应用程序,使用OpenCV从相机实时检测Faces。

在iOS 7设备上,它没有任何问题。然而,在iOS 8设备上,它开始检测(或试图检测)面部,并且在4-5秒后FPS从30FPS减少到20FPS(在iPhone 6的情况下,其他设备改变FPS)。

我正在使用:

  • OpenCV 2.4.9
  • 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中使用面部进行更多处理。

0 个答案:

没有答案