Параметры для детектора глаз OpenCV в iPhone

Я пытаюсь нанести трехмерное стекло на лицо с помощью iPhone. Я использую следующее обнаружение глаз OpenCV. Однако обнаружение глаз не очень надежно. Небольшой поворот лица или если я смотрю вниз на камеру, когда глаза становятся немного узкими, обнаружение глаза не работает. Даже в лобной части он обнаруживает только в половине кадров. Я читал во многих местах, что настройка определенных параметров может помочь или предварительной обработки изображения. Однако я не могу получить правильную комбинацию. Ниже приводится предварительная обработка и параметры, которые я использую. Если кто-то может предложить / поделиться лучшими параметрами, пожалуйста, помогите. Спасибо

Получение серого изображения из pixelBuffer-образ. затем processFrame называется:

 if (format == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) {
            // For grayscale mode, the luminance channel of the YUV data is used
            CVPixelBufferLockBaseAddress(pixelBuffer, 0);
            void *baseaddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0);

            cv::Mat mat(videoRect.size.height, videoRect.size.width, CV_8UC1, baseaddress, 0);

            [self processFrame:mat videoRect:videoRect videoOrientation:videoOrientation];

            CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); 
        }
        else if (format == kCVPixelFormatType_32BGRA) {
            // For color mode a 4-channel cv::Mat is created from the BGRA data
            CVPixelBufferLockBaseAddress(pixelBuffer, 0);
            void *baseaddress = CVPixelBufferGetBaseAddress(pixelBuffer);

            cv::Mat mat(videoRect.size.height, videoRect.size.width, CV_8UC4, baseaddress, 0);

            [self processFrame:mat videoRect:videoRect videoOrientation:videoOrientation];

            CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);    
        }
        else {
            NSLog(@"Unsupported video format");
        }

Инициализация классификаторов:

    NSString * const kFaceCascadeFilename = @"haarcascade_frontalface_alt2";
    NSString * const kEyesCascadeFilename = @"haarcascade_eye";

processFrame: обнаружение

- (void)processFrame:(cv::Mat &)mat videoRect:(CGRect)rect videoOrientation:(AVCaptureVideoOrientation)videOrientation
{
    // Shrink video frame to 320X240
    cv::resize(mat, mat, cv::Size(), 0.5f, 0.5f, CV_INTER_LINEAR);
    rect.size.width /= 2.0f;
    rect.size.height /= 2.0f;

    // Rotate video frame by 90deg to portrait by combining a transpose and a flip
    // Note that AVCaptureVideoDataOutput connection does NOT support hardware-accelerated
    // rotation and mirroring via videoOrientation and setVideoMirrored properties so we
    // need to do the rotation in software here.
    cv::transpose(mat, mat);
    CGFloat temp = rect.size.width;
    rect.size.width = rect.size.height;
    rect.size.height = temp;

    if (videOrientation == AVCaptureVideoOrientationLandscapeRight)
    {
        // flip around y axis for back camera
        cv::flip(mat, mat, 1);
    }
    else {
        // Front camera output needs to be mirrored to match preview layer so no flip is required here
    }

    videOrientation = AVCaptureVideoOrientationPortrait;

    // Detect faces
    std::vector<cv::Rect> faces;
    std::vector<cv::Rect> eyes;


    _faceCascade.detectMultiScale(mat, faces, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, cv::Size(30, 30));

    // We will usually have only one face in frame
    if (faces.size() >0){
        cv::Mat faceROI = mat(faces.front());
        _eyesCascade.detectMultiScale( faceROI, eyes, 1.15, 3.0, 0 , cv::Size(30, 30));
    }

    // Dispatch updating of face markers to main queue
    dispatch_sync(dispatch_get_main_queue(), ^{
        [self displayFaces:faces eyes:eyes
             forVideoRect:rect
          videoOrientation:videOrientation];    
    });
}

0 ответов

Другие вопросы по тегам